使用 web3.py 进行合约交互
# 部署合约
| import json | |
| from web3 import Web3, HTTPProvider | |
| private_key = [钱包私钥] | |
| wallet = Web3.toChecksumAddress([钱包地址]) | |
| w3 = Web3(HTTPProvider([链的RPC])) | |
| abi = json.loads([合约的ABI]) | |
| code = [合约的字节码] | |
| newContract = w3.eth.contract(bytecode=code, abi=abi) | |
| nonce = w3.eth.getTransactionCount(wallet) | |
| gasPrice = w3.toWei('10', 'gwei') | |
| gasLimit = 4000000 | |
| tx = { | |
| 'nonce': nonce, | |
| 'gas': gasLimit, | |
| 'gasPrice': gasPrice, | |
| 'from': wallet, | |
| 'chainId': w3.eth.chainId | |
| } | |
| transaction = newContract.constructor().buildTransaction(tx) | |
| signed_tx = w3.eth.account.sign_transaction(transaction, private_key) | |
| tx_hash = w3.eth.sendRawTransaction(signed_tx.rawTransaction) | |
| transaction_hash = w3.toHex(tx_hash) | |
| tx_receipt = w3.eth.wait_for_transaction_receipt(transaction_hash) | |
| print(tx_receipt.contractAddress) | 
# 调用合约中的函数
| import json | |
| import time | |
| from web3 import Web3, HTTPProvider | |
| contract_address = [合约地址] | |
| private_key = [钱包私钥] | |
| wallet = Web3.toChecksumAddress([钱包地址]) | |
| w3 = Web3(HTTPProvider([RPC])) | |
| w3.eth.defaultAccount = wallet | |
| abi = json.loads([合约的ABI]) | |
| contract = w3.eth.contract(address=contract_address, abi=abi) | |
| nonce = w3.eth.getTransactionCount(wallet) | |
| gasPrice = w3.toWei('5', 'gwei') | |
| gasLimit = 4000000 | |
| tx = { | |
| 'nonce': nonce, | |
| 'gas': gasLimit, | |
| 'gasPrice': gasPrice, | |
| 'from': wallet, | |
| 'value': w3.toWei(0.01,'ether') | |
| } | |
| transaction = contract.functions.create().buildTransaction(tx) | |
| signed_tx = w3.eth.account.sign_transaction(transaction, private_key) | |
| tx_hash = w3.eth.sendRawTransaction(signed_tx.rawTransaction) | |
| transaction_hash = w3.toHex(tx_hash) | |
| tx_receipt = w3.eth.wait_for_transaction_receipt(transaction_hash) | |
| print(transaction_hash) | 
# 向某一个地址转账
| import json | |
| import time | |
| from web3 import Web3, HTTPProvider | |
| private_key = [钱包私钥] | |
| wallet = Web3.toChecksumAddress([钱包地址]) | |
| w3 = Web3(HTTPProvider([RPC])) | |
| w3.eth.defaultAccount = wallet | |
| to = Web3.toChecksumAddress([要转账的地址]) | |
| nonce = w3.eth.get_transaction_count(wallet) | |
| tx = { | |
| 'nonce': nonce, | |
| 'to': to, | |
| 'gas': 4000000, | |
| 'gasPrice': w3.toWei('30', 'gwei'), | |
| 'value': w3.toWei(0.01, 'ether'), | |
| 'chainId': w3.eth.chainId | |
| } | |
| # 签名交易 | |
| signed_tx = w3.eth.account.sign_transaction(tx, private_key) | |
| tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction) | 
# 查询一个地址的 ETH
| import json | |
| import time | |
| from web3 import Web3, HTTPProvider | |
| w3 = Web3(HTTPProvider([RPC])) | |
| print(w3.fromWei(w3.eth.getBalance([需要查询的地址]), 'Ether')) | 
