Web3.py로 가격을 스마트 구조기에 넘기다

5721 단어 블록체인tech

개시하다


지난번에는 홈페이지 3.나는py로 간단한 스마트 설정을 하고python의 장점을 다시 한 번 깨달았다.
Web3.컴퓨터로 스마트 설정을 실행하다
이번에는 지난번 코드를 계속 수정해 좋아하는 인사를 스마트 구조기에 전달해 보자.

사이트 축소판 그림


공식 문서
https://web3py.readthedocs.io/en/stable/contracts.html#contracts
꾸준한 이사림
https://k2k2-ethereum.com/programming/python/273/

각본


이번에도 쉽게 이해할 수 있도록 스마트 프레임을 제작하기로 했고, 체인에서 펼쳐지는 스크립트와 가격을 제시하는 스크립트로 나뉘었다.

지능형 구성 스크립트


contract_set.py

# ライブラリの読み込み
from web3 import Web3
from solcx import compile_source

# ローカルのイーサリアム環境(Basu)に接続
w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))

# アカウントと秘密鍵の設定
account_0 = w3.toChecksumAddress('0xfe3b557e8fb62b89f4916b721be55ceb828dbd73')
private_key = '0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63'

# Solidity のソースをコンパイル
compiled_sol = compile_source(
    '''
    pragma solidity >0.5.0;

    contract Greeter {
	string public greeting;

	constructor() public {
	    greeting = 'Hogetaro';
	}

	function setGreeting(string memory _greeting) public {
	    greeting = _greeting;
	}

	function greet() view public returns (string memory) {
	    return greeting;
	}
    }
    ''',
    output_values=['abi', 'bin']
)

# コントラクトインターフェイスの取得
contract_id, contract_interface = compiled_sol.popitem()

# print(contract_interface)

# バイトコードとABI
bytecode = contract_interface['bin']
abi = contract_interface['abi']

# ABIの表示
print(abi)

# コントラクトの作成
contract = w3.eth.contract(abi=abi, bytecode=bytecode)

# トランザクションの生成
tx = contract.constructor().buildTransaction({
    'from': account_0,
    'nonce': w3.eth.getTransactionCount(account_0),
    'gas': 1728712,
    'gasPrice': w3.toWei('21', 'gwei')})

# トランザクションに署名
signed_tx = w3.eth.account.signTransaction(tx, private_key)

# トランザクションの送信
tx_hash = w3.eth.sendRawTransaction(signed_tx.rawTransaction)

# トランザクションレシート?
tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash)

# コントラクトアドレスの表示
print(tx_receipt.contractAddress)
내용은 거의 지난번과 마찬가지로 setGreeting이라는 함수만 추가되었습니다.
이것을 실행하면 ABI와 설정 주소가 표시됩니다.
$ python3 contract_set.py 
[{'inputs': [], 'stateMutability': 'nonpayable', 'type': 'constructor'}, {'inputs': [], 'name': 'greet', 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'greeting', 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'internalType': 'string', 'name': '_greeting', 'type': 'string'}], 'name': 'setGreeting', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function'}]
0xfeae27388A65eE984F452f86efFEd42AaBD438FD

지능형 구성 값 설정 및 스크립트 호출


set_call.py


방금 표시된 ABI와 설정 주소를 사용하여 값을 전달한 후에 호출된 스크립트를 만듭니다.
이번에는 새로운 거래를 생성하고 실행해야 하기 때문에 지난번보다 더 복잡해졌다.
# ライブラリのインポート
from web3 import Web3

# 接続
w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))

account_0 = w3.toChecksumAddress('0xfe3b557e8fb62b89f4916b721be55ceb828dbd73')
private_key = '0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63'

# ABI
abi = [{'inputs': [], 'stateMutability': 'nonpayable', 'type': 'constructor'}, {'inputs': [], 'name': 'greet', 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'greeting', 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'internalType': 'string', 'name': '_greeting', 'type': 'string'}], 'name': 'setGreeting', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function'}]

# コントラクトアドレス
contractAddress = '0xfeae27388A65eE984F452f86efFEd42AaBD438FD'

# コントラクトオブジェクト
contract = w3.eth.contract(address=contractAddress, abi=abi)

# 呼び出しと表示

tx = contract.functions.setGreeting('KONNICHIWA!!!!!').buildTransaction({'nonce': w3.eth.getTransactionCount(account_0)})

signed_tx = w3.eth.account.signTransaction(tx, private_key)

# トランザクションの送信
tx_hash = w3.eth.sendRawTransaction(signed_tx.rawTransaction)

tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash)

print(contract.functions.greet().call())
이렇게 하면 원래 구조자의 인사를 덮어쓰고 설정된 인사를 답장할 수 있다.
$ python3 set_call.py 
KONNICHIWA!!!!!
너무 좋아요!역시python!!
매개 변수로 인사말을 딱딱하게 인코딩하면 지난번과의 차이를 쉽게 알 수 있고 어쨌든 만족할 수 있다.

좋은 웹페이지 즐겨찾기