Ho 나는 파이썬을 사용하여 테스트넷에 내 첫 번째 이더리움 스마트 계약을 넣었습니다.

환경 설정



먼저 아래 링크를 사용하여 Windows 컴퓨터에 Python을 다운로드했습니다.

https://www.python.org/

가장 중요한 것은 web3 라이브러리에 필요한 빌드 도구를 얻는 것입니다. 제 경우에는 V++ 2019 빌드 도구가 필요했습니다.

아래 링크를 사용하고 Tools for Visual Studio까지 아래로 스크롤하여 온라인 설치 관리자를 가져오고 필요한 버전을 설치합니다.

https://visualstudio.microsoft.com/downloads/?q=build+tools



테스트용 메타마스크 지갑을 받고 계정을 만들고 등록합니다.

암호, 계정 주소, 개인 키

이 목적을 위해 rinkbey 테스트를 사용할 것이기 때문에 메타마스크 네트워크 섹션에서 테스트넷을 공개합니다.

여기에서 metamasc 지갑을 사용하여 테스트용 이더리움을 받으십시오.

https://faucets.chain.link/

https://infura.io/에서 계정 만들기

프로젝트를 만들고 이름을 원하는 대로 지정하세요. 생성 과정이 끝난 후 rinkby 네트워크를 켜는 것을 잊지 마세요.
Project_id와 프로젝트 비밀 및 첫 번째 엔드포인트를 기록합니다.

Infura가 마음에 들지 않으면 다음을 사용할 수 있습니다. https://t.co/Ky3JWP8GPZ

아래 링크에서 Visualstudio 코드를 설치하십시오.

https://code.visualstudio.com/

Solidity와 Python을 위한 몇 가지 유용한 확장 기능을 설치하십시오.

새 프로젝트를 열고 해당 파일 생성을 시작합니다.
  • 배포.py
  • 심플스토리지.솔
  • .env

  • 가상 환경을 만들고 다음 명령을 사용하여 이름을 'venv'로 지정합니다.

    py -m venv venv
    


    다음을 사용하여 powershell을 열 때마다 이 명령으로 지금 사용을 시작하십시오.

    venv\Scripts\activate
    


    필요한 라이브러리 설치 시작

    pip install web3
    pip install python-dotenv
    pip install py-solc-x
    


    SimpleStorage.sol



    SimpleStorage.sol의 코드는 다음과 같습니다.

    
    
     // SPDX-License-Identifier: MIT
    
    pragma solidity >=0.6.0 <0.9.0;
    
    contract SimpleStorage {
    
        uint256 favoriteNumber;
    
        // This is a comment!
        struct People {
            uint256 favoriteNumber;
            string name;
        }
    
        People[] public people;
        mapping(string => uint256) public nameToFavoriteNumber;
    
        function store(uint256 _favoriteNumber) public {
            favoriteNumber = _favoriteNumber;
        }
    
        function retrieve() public view returns (uint256){
            return favoriteNumber;
        }
    
        function addPerson(string memory _name, uint256 _favoriteNumber) public {
            people.push(People(_favoriteNumber, _name));
            nameToFavoriteNumber[_name] = _favoriteNumber;
        }
    }
    


    In the code above we just have a favoriteNumber variable that we can check with retrieve function and modify with the store functionand we can associate someone name with a favorite number with addPerson function



    Deploy.py



    deploy.py의 코드는 다음과 같아야 합니다.

    #Necessary
    import json
    import os
    from pathlib import Path
    
    #Security
    from dotenv import load_dotenv
    
    #Web3
    from solcx import compile_standard, set_solc_version
    from web3 import Web3
    
    
    
    
    
    
    #Get hidden variables
    
    load_dotenv(Path('.env'))
    
    ENV_TYPE = os.getenv('ENV_TYPE')
    #GANACHE
    PRIVATE_KEY = os.getenv('PRIVAT_KEY')
    ACCOUNT = os.getenv('ACCOUNT')
    
    #INFURA
    INFURA_ID = os.getenv('INFURA_ID')
    INFURA_SEC = os.getenv('INFURA_SEC')
    ENDPOINT_RINKBY = os.getenv('ENDPOINT_RINKBY')
    #METAMASK
    META_ADRESS = os.getenv('META_ADRESS')
    META_PRV = os.getenv('META_PRV')
    
    
    #SETUP THE CONTRACT
    
    with open(Path('SimpleStorage.sol'), "r") as f:
    
    
        ss_file = f.read()
    
    
    
    _solc_version = "0.6.0"
    
    compiled_ss = compile_standard({
        "language":"Solidity","sources": {"SimpleStorage.sol": {"content": ss_file}},
        "settings":{
            "outputSelection":{
                "*":{
                    "*":["abi", "metadata", "evm.bytecode","evm.sourceMap"]
                }
            }
        }
    
    }, solc_version ="0.6.0")
    
    
    with open(Path('compiled.json'), 'w' ) as f:
    
        json.dump(compiled_ss, f)
    
    #get bytecode
    bytecode= compiled_ss["contracts"]["SimpleStorage.sol"]["SimpleStorage"]["evm"]["bytecode"]["object"]
    #get ABI
    abi= compiled_ss["contracts"]["SimpleStorage.sol"]["SimpleStorage"]["abi"]
    
    
    #SETUP PRIVATE KEYS
    
    if ENV_TYPE == "INFURA":
    
        w3 = Web3(Web3.HTTPProvider(ENDPOINT_RINKBY))
        chain_id = 4
    
        my_address = META_ADRESS
        private_key = META_PRV
    
    else:
    
        w3 = Web3(Web3.HTTPProvider("HTTP://127.0.0.1:8545"))
        chain_id = 1337
    
        my_address = ACCOUNT
        private_key = PRIVATE_KEY
    
    
    
    
    ss = w3.eth.contract(abi=abi, bytecode=bytecode)
    
    
    if  w3.isConnected():
        # print(ss)
    
        #get latest transaction to build the nounce
        nonce=w3.eth.getTransactionCount(my_address)
        #build transact
        #sign
        #send transact
        deploy_transaction = ss.constructor().buildTransaction({"gasPrice": w3.eth.gas_price,"chainId": chain_id, "from": my_address, "nonce": nonce})
    
        nonce = nonce+1    
        #Sign transaction
        signed_txn = w3.eth.account.sign_transaction(deploy_transaction, private_key=private_key)
    
    
        #send to blockchain
    
        print("deploying contract ...")
    
        txn_hash =  w3.eth.send_raw_transaction( signed_txn.rawTransaction )
    
        tx_receipt = w3.eth.wait_for_transaction_receipt(txn_hash)
    
        print("tx_receipt =>", tx_receipt)
    
        ##Contract adress and ABI
    
        contract_adress = tx_receipt.contractAddress
    
        #for interaction
        #transact or call
    
        ss_contract =  w3.eth.contract(address=contract_adress, abi=abi)
    
    
        store_transaction = ss_contract.functions.store(7).buildTransaction({"gasPrice": w3.eth.gas_price,"chainId": chain_id, "from": my_address, "nonce": nonce})
    
    
        signed_store_txn = w3.eth.account.sign_transaction(store_transaction, private_key=private_key)
    
    
        #send to blockchain
    
        print("interacting with store function ...")
    
        txn_store_hash =  w3.eth.send_raw_transaction( signed_store_txn.rawTransaction )
    
        tx_store_receipt = w3.eth.wait_for_transaction_receipt(txn_store_hash)
    
        print("tx_store_receipt =>", tx_store_receipt)
    
        print("---")
    
        print("call retreive =>", ss_contract.functions.retrieve().call())
    
    
    
    
    
    
    
    else:
    
        print("Error not conected")
    
        quit()
    


    In the code above we are creating the smart contractin the blockchain and interacting with it by storing the number 7 in favoriteNumber and the checkingit



    .env/개인 키



    이제 필요한 키를 채워야 합니다. 처음 두 변수는 Ganache와의 로컬 상호 작용에만 필요하므로 이스케이프할 수 있습니다.

    .env 파일

    ACCOUNT="0xRandom3216547986549687"
    PRIVAT_KEY="0xRandom3216547986549687"
    
    
    INFURA_ID="654random65465"
    INFURA_SEC="654random65465"
    
    META_ADRESS="0x654random65465"
    META_PRV="654random65465"
    
    ENDPOINT_RINKBY="654random65465"
    
    ENV_TYPE="INFURA"
    


    배포/상호작용



    마지막 단계만 실행하면 됩니다.

    파이 배포.py

    나는 모든 것이 잘되기를 바랍니다

    그렇다면 여기에서 계약을 확인하십시오.

    https://rinkeby.etherscan.io/address/write_the_adress_of_the_contract



    youre python 출력에서 ​​제공하는 정보로 계약 주소를 얻을 수 있습니다.

    'contractAddress': '0x21321random321321'



    가난한 탐욕스러운 튜토리얼을 보려면 여기를 따르십시오.

    좋은 웹페이지 즐겨찾기