Python과 Brownie를 이용한 Web3 DApp 본격 개발

Python, Brownie, Solidity, 기타 보조 모듈을 사용하여 Web3 DApp을 개발하는 방법을 알아보세요. 예를 들어 행운의 추첨, 복권 게임을 생각해보십시오.

이 기사에서는 Python, Brownie, Solidity 및 기타 보조 소프트웨어를 사용하여 Web3 DApp을 개발하는 방법을 공유합니다. 이 응용 프로그램은 기본적으로 Crypto를 사용하여 블록체인 네트워크를 통해 행운의 추첨을 할 수 있습니다. 그것은 호스트가 복권 게임을 설정할 수 있고 그것을 지불하고 참여하는 플레이어가 무작위로 상품을 받을 수 있는 행운의 추첨 게임과 같습니다.

Web3 DApp 본격 개발의 재료

파이썬, 브라우니, 솔리디티, 오픈제플링크, 이더리움, 가나슈-CLI, 메타마스크, 알케미, 체인링크, 이더스캔

복권 신청서 샘플 목차

Solidity와 Chainlink를 사용하여 스마트 계약 개발

다중 네트워크와 통합된 Lottery DApp의 주요 흐름은 다음과 같습니다.

  • 사용자는 복권 기금을 입력할 수 있습니다
  • 추첨은 자동으로 시작되고 자동으로 종료됩니다.
  • 응용 프로그램은 승자를 무작위로 선택할 수 있습니다

스마트 계약에서 이 DApp 개발 논리 측면에서 공유해야 할 몇 가지 필수 부분이 있습니다.

1. 기능을 추가하여 견고성 스마트 계약에서 복권 논리 흐름을 만듭니다.

복권 스마트 계약에서 플레이 여정은 기본적으로 최소한 다음을 포함합니다.

  • 통화 금액 입력
  • 거래 수수료 받기
  • 추첨 시작
  • 추첨 종료
  • 임의성 기능 수행

2. mainnet-fork env 과 테스트 스크립트를 생성하여 복권 스마트 계약 기능을 테스트합니다.

포인트 2에 대해 이야기하기 전에 msg.sender 더 이상 자동으로 지불되지 않는 pragma 0.8에 주목하십시오 . 따라서 다음과 같이 먼저 지불 가능하게 만들어야 합니다.

players.push(payable(msg.sender));

로컬 환경에서 테스트 mainnet-fork network 추가하기 위해 여기서는 Alchemy를 호스트로 사용합니다.

터미널에 다음 명령 목록을 입력하기만 하면 됩니다.

brownie networks add development main net-fork cmd=ganache-cli host=http://127.0.0.1 fork=https://eth-mainnet.g.alchemy.com/v2/abcabc accounts=10 mnemonic=brownie port=8545

예를 들어 getEntraceFee 함수를 사용하십시오. brownie test –network mainnet-fork 실행한 결과는 다음과 같습니다.

테스트 스크립트는 "Web3.0 DApp 전체 스크립트 자습서 5"라는 메시지를 남겨 Easy2Digital 뉴스레터를 구독하시면 곧 보내드리겠습니다.

3. ENUM 문 추가

복권의 경우 복권 개시, 마감, 당첨자 계산의 세 가지 시나리오를 설정해야 합니다. 다음은 코드입니다.

enum LOTTERY_STATE {

OPEN,

CLOSED,

CALCULATING_WINNER

}

LOTTERY_STATE public lottery_state;

그런 다음 모든 복권 시작을 위해 게임 플레이어가 전화를 걸 자격이 있는 것이 아니라 전화를 걸 수 있는 소유자만 필요합니다. 이를 위해 open zeppelin을 사용하여 스마트 계약 소유자 sol을 가져올 수 있습니다.

import "@openzeppelin/contracts/access/Ownable.sol";

function startLottery() public onlyOwner {

require(lottery_state == LOTTERY_STATE.CLOSED, "Can't start a new lottery yet!")

lottery_state = LOTTERY_STATE.OPEN;

};

그리고 brownie-config.yaml 반드시 최신 오픈 제플린 버전을 사용해주세요. 예를 들어 내 것은 4.8.0입니다.

- OpenZeppelin/openzeppelin-contracts@4.8.0

4. 임의성

추첨이 시작된 후에는 무작위로 결과를 생성해야 합니다. 따라서 이 기능을 수행하고 결과를 전달하려면 난수 패키지가 필요합니다.

import "@chainlink/contracts/src/v0.8/VRFConsumerBase.sol";

임의성 함수와 매개변수를 기반으로 이를 참조하여 스마트 계약에 배치해야 합니다. 아래는 다음과 같이 업데이트되는 장소입니다.

계약 –> 복권 기능에 VRFConsumerBase 추가

In the contract, we need to add some global variables as follows:

address payable[] public players;

address payable public recentWinner;

uint256 public randomness;

uint256 public fee;

bytes32 public keyhash;

생성자 → 다음과 같이 추가합니다.

contract Lottery is VRFConsumerBase, Ownable {

address payable[] public players;

address payable public recentWinner;

uint256 public randomness;

uint256 public usdEntryFee;

AggregatorV3Interface internal ethUsdPriceFeed;

enum LOTTERY_STATE {

OPEN,

CLOSED,

CALCULATING_WINNER

}

LOTTERY_STATE public lottery_state;

uint256 public fee;

bytes32 public keyhash;

constructor(

address _priceFeedAddress,

address _vrfCoordinator,

address _link,

uint256 _fee,

bytes32 _keyhash

) public VRFConsumerBase(_vrfCoordinator, _link) {

usdEntryFee = 50 * (10**18);

ethUsdPriceFeed = AggregatorV3Interface(_priceFeedAddress);

lottery_state = LOTTERY_STATE.CLOSED;

fee = _fee;

keyhash = _keyhash;

}

컴파일!!

복권 애플리케이션의 기본 배포 및 보조 Python 스크립트

이 복권 애플리케이션에 배포할 몇 가지 핵심 Python 스크립트가 있습니다. 자세한 내용은 다음과 같습니다.

1. 계정, 네트워크, 지갑 등의 요소 선택에 대한 deploy_lottery.py와 같은 기본 스크립트.

1) 계정 식별자 및 그래버

실제 복권 게임에서 사람들은 다양한 유형의 계정을 사용하여 가입하고 플레이할 수 있습니다. 따라서 메인 스크립트는 네트워크를 포함하여 사용자가 사용 중인 계정을 감지할 수 있어야 합니다. 다음은 코드 샘플입니다.

def deploy_lottery():

account = get_account(id="easy2digitalAccount")

2) 계약, 네트워크, 지갑 식별자 및 그래버

   lottery = Lottery.deploy(

       get_contract ( "eth_usd_price_feed" ).address,

       get_contract ( "vrf_coordinator" ).address,

       get_contract ( "link_token" ).address,

config[ "networks" ][network.show_active()][ "fee" ],

config[ "networks" ][network.show_active()][ "keyhash" ],

{ "from" : account },

       publish_source =config[ "networks" ][network.show_active()].get(

           "verify" , False ),

)

3) 복권 시작, 수수료 입력, 종료 기능

배포 기능을 발췌하면 Lottery 스마트 계약과 함께 작동하는 Python 스크립트에 시작, 시작 및 종료 기능이 있어야 합니다.

  • start_lottery()
  • enter_lottery()
  • end_lottery()

예를 들어 start_lottery() 사용하십시오.

def start_lottery ():

   account = get_account ()

   lottery = Lottery[- 1 ]

   starting_tx = lottery .startLottery({ "from" : account })

   starting_tx .wait( 1 )

   print ( "The lottery has started!!" )

2. 스크립트어시스턴트.py

이 도우미 Python 파일과 관련하여 Python 배포 스크립트 실행을 지원하는 데 사용됩니다. 배포 스크립트의 시작 부분에서 가져옵니다.

from scripts.scriptAssistant import get_account, get_contract, fund_with_link
보조 스크립트의 네 가지 주요 기능은 다음과 같습니다.
  • get_account()
  • get_contract()
  • deploy_mocks()
  • fund_with_links()

예를 들어 Get_account 함수를 사용하십시오.

def get_account(index=None, id=None):

if index:

return accounts[index]

if id:

return accounts.load(id)

if (

network.show_active() in LOCAL_BLOCKCHAIN_ENVIRONMENTS or network.show_active(

) in FORKED_LOCAL_ENVIRONMENTS

):

return accounts[0]

모의, VRF 및 링크 토큰 테스트 계약 추가

복권 애플리케이션 구축을 위한 스마트 계약 생성자를 기반으로 애플리케이션과 통합하려면 일부 외부 리소스가 필요합니다. 이 기사에서는 Chainlink를 리소스 샘플로 사용합니다. 다음은 필요한 5가지 구성 요소입니다.

  • 가격 피드 주소
  • VRF 코디네이터
  • 링크 토큰
  • 키 해시
  • 수수료

Chainlink GitHub로 이동하여 최신 버전을 복사하고 계약 폴더에 별도로 붙여넣어야 합니다. 샘플은 다음과 같습니다.

가격 피드 주소, 링크 토큰 키, 키 해시 및 수수료는 Chainlink 공식 웹 사이트로 이동하여 관련 정보를 찾아보십시오.

나머지 중요 구성 요소 – config YAML 및 env

나머지 주요 구성 요소는 브라우니 구성 YAML 파일과 env 파일입니다. 자세한 내용은 펀드미 스마트 컨트랙트 관련 이전 글을 확인해주세요. 기본적으로 설정은 지금 얘기하고 있는 로또 어플과 동일합니다

Python 및 Web3를 사용하여 Ethereum에 배포된 Brownie FundMe 스마트 계약

단위 테스트

이전 기사에서 언급했듯이 브라우니가 제공하는 가장 강력한 기능 중 하나는 테스트 환경입니다. 의심할 여지 없이 우리는 모든 것이 준비되었음을 확인하기 전에 애플리케이션을 시작하지 않을 것입니다. 따라서 테스트는 개발 중인 DApp이 무엇이든 필수 단계입니다.

테스트 구성 요소 측면에서 기본적으로 스마트 계약 단계를 따르고 하나씩 테스트해야 합니다. 다음은 5단계입니다.

  • test_get_entrance_fee()
  • test_cant_enter_unless_starter()
  • test_can_enter_unless_starter()
  • test_can_end_lottery()
  • test_can_pick_winner_correctly()

예를 들어 test_get_entrance_fee() 사용하십시오.

def test_get_entrance_fee():
if network.show_active() notinLOCAL_BLOCKCHAIN_ENVIRONMENTS:
pytest.skip()
# Arrange
lottery = deploy_lottery()
# Act
expected_entrance_fee = Web3.toWei(0.025, "ether")
entrance_fee = lottery.getEntranceFee()
# Assert
assertexpected_entrance_fee == entrance_fee

정통 네트워크 연결 및 활성화

테스트가 완료되고 모든 것이 순조롭게 진행되면 실제 네트워크를 연결하고 시작할 때입니다! 자세한 내용은 Infura 및 MetaMask를 사용하여 Ethereum에 배포하는 이전 기사를 확인하십시오.

Web3 DApp Full Scale의 Full Python 및 Solidity 스크립트 – 복권 애플리케이션

Web3 DApp Lottery의 전체 스크립트 세트에 관심이 있는 경우, "Web3.0 tutorial 5"라는 메시지를 추가하여 뉴스레터를 구독 하십시오. . 귀하의 사서함으로 스크립트를 즉시 보내드립니다.

Python과 Brownie를 이용한 Web3 DApp Full Scale Development – Lottery를 재미있게 읽으시기 바랍니다. 그렇다면 아래 나열된 항목 중 하나를 수행하여 지원해 주세요. 항상 채널에 도움이 되기 때문입니다.

  • PayPal( paypal.me/Easy2digital )을 통해 내 채널을 지원하고 기부하세요.
  • 제 채널 구독하시고 알림벨을 켜주세요 Easy2Digital 유튜브 채널 .
  • 내 페이지 팔로우 및 좋아요 Easy2Digital Facebook 페이지
  • #easy2digital 해시태그를 사용하여 소셜 네트워크에 기사를 공유하세요.
  • Easy2Digital 최신 기사, 비디오 및 할인 코드를 받으려면 주간 뉴스레터에 가입하십시오.
  • 독점적인 혜택을 누리려면 Patreon을 통해 월간 멤버십을 구독하세요( www.patreon.com/louisludigital ).