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을 위한 몇 가지 유용한 확장 기능을 설치하십시오.
새 프로젝트를 열고 해당 파일 생성을 시작합니다.
가상 환경을 만들고 다음 명령을 사용하여 이름을 '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'
가난한 탐욕스러운 튜토리얼을 보려면 여기를 따르십시오.
Reference
이 문제에 관하여(Ho 나는 파이썬을 사용하여 테스트넷에 내 첫 번째 이더리움 스마트 계약을 넣었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/mrhili/ho-managed-to-put-my-first-etherium-smart-contract-on-a-testnet-using-python-4c1p
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
// 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의 코드는 다음과 같아야 합니다.
#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'
가난한 탐욕스러운 튜토리얼을 보려면 여기를 따르십시오.
Reference
이 문제에 관하여(Ho 나는 파이썬을 사용하여 테스트넷에 내 첫 번째 이더리움 스마트 계약을 넣었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/mrhili/ho-managed-to-put-my-first-etherium-smart-contract-on-a-testnet-using-python-4c1p
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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'
가난한 탐욕스러운 튜토리얼을 보려면 여기를 따르십시오.
Reference
이 문제에 관하여(Ho 나는 파이썬을 사용하여 테스트넷에 내 첫 번째 이더리움 스마트 계약을 넣었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/mrhili/ho-managed-to-put-my-first-etherium-smart-contract-on-a-testnet-using-python-4c1p텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)