主页 > imtokenusdt钱包 > Python通过JSON-RPC请求部署和交易以太坊智能合约
Python通过JSON-RPC请求部署和交易以太坊智能合约
对于本指南,我们使用私有权威证明网络。 如果您想创建这样的网络两千块可以玩以太坊合约吗,可以阅读我们之前的帖子。 本文假设使用 Ganache(以前称为 TestRPC)或任何以太坊网络都没有问题。 因此,不会涉及任何关于设置网络的内容,重点将放在使用 python 向 Geth 节点发送 HTTP 请求上。
条件一、向Geth发送一个简单的请求
让我们通过向 Geth 发送一个非常简单的请求来热身。 查询网络ID。 第一步是阅读文档。 我们需要的方法称为 net_version 并在此处进行了描述。
我的 Geth 节点 URL 和端口是::8501。 如果您使用默认的 Ganache,则 URL 可能是 :7545 。
我正在使用 Requests python 库发出我的 HTTP 请求。
import requests
# create persistent HTTP connection
session = requests.Session()
# as defined in https://github.com/ethereum/wiki/wiki/JSON-RPC#net_version
method = 'net_version'
params = []
payload= {"jsonrpc":"2.0",
"method":method,
"params":params,
"id":1}
headers = {'Content-type': 'application/json'}
response = session.post('http://localhost:8501', json=payload, headers=headers)
print('raw json response: {}'.format(response.json()))
print('network id: {}'.format(response.json()['result']))
结果是:
raw json response: {'id': 1, 'jsonrpc': '2.0', 'result': '1515'}
network id: 1515
很好,从那里我们准备部署和处理合约,这奠定了良好的基础。 1515 是我的私有区块链的网络 ID,如创世文件中所定义。 到目前为止一切看起来都很棒。 使用 Ganache,您应该获得一个网络 ID 5777。
但在我们签署和发送交易之前,我们需要一个地址、一个私钥和一些以太币。
2. 创建公私钥对并获得一些以太币
web3py(第 4 版)库将帮助我们创建密钥对。
import web3
w3 = web3.Web3()
myAccount = w3.eth.account.create('put some extra entropy here')
myAddress = myAccount.address
myPrivateKey = myAccount.privateKey
print('my address is : {}'.format(myAccount.address))
print('my private key is : {}'.format(myAccount.privateKey.hex()))
在这个例子中,我得到:
my address is : 0xF464A67CA59606f0fFE159092FF2F474d69FD675
my private key is: 0x94cb9f766ef067eb229da85213439cf4cbbcd0dc97ede9479be5ee4b7a93b96f
请永远不要分享您的私钥! 我这样做是因为它是一个本地私有链,我每天会销毁并重新启动几次。 我没有在任何公共网络上使用这个密钥对。
现在为了得到这个地址,有多种方法:
1. 一个很简单的方法是在genesis.json文件中添加这个地址,然后开始一个新的网络。 下面是我之前的创世文件,其中包括我们刚刚创建的地址(删除 0x)。
{
"config": {
"chainId": 1515,
"homesteadBlock": 1,
"eip150Block": 2,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip155Block": 3,
"eip158Block": 3,
"byzantiumBlock": 4,
"clique": {
"period": 5,
"epoch": 30000
}
},
"nonce": "0x0",
"timestamp": "0x5a722c92",
"extraData": "0x000000000000000000000000000000000000000000000000000000000000000008a58f09194e403d02a1928a7bf78646cfc260b087366ef81db496edd0ea2055ca605e8686eec1e60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x8000000",
"difficulty": "0x1",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {
"08a58f09194e403d02a1928a7bf78646cfc260b0": {
"balance": "0x200000000000000000000000000000000000000000000000000000000000000"
},
"87366ef81db496edd0ea2055ca605e8686eec1e6": {
"balance": "0x200000000000000000000000000000000000000000000000000000000000000"
},
"F464A67CA59606f0fFE159092FF2F474d69FD675": {
"balance": "0x200000000000000000000000000000000000000000000000000000000000000"
}
},
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
2、如果您有可以挖矿的节点或ganache,请打开并手动创建交易:
$ geth attach ipc:'http://localhost:8501' // 7545 for ganache
Welcome to the Geth JavaScript console!
instance: Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9
coinbase: 0x87366ef81db496edd0ea2055ca605e8686eec1e6
at block: 1585 (Wed, 14 Feb 2018 11:46:04 CET)
modules: eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
> eth.sendTransaction({'from':eth.coinbase, 'to':'0xF464A67CA59606f0fFE159092FF2F474d69FD675', 'value':1000000000000000000000})
"0xdbc86acbe3644ac2cdb68132bbeecda40733c10f07ca16d87a2e5001e50eec4c"
> exit
这里我从 0x87366... 发送 1000 个以太币到我的地址 0xF464A...,1 个以太币是 1018 wei(1 后接 18 个零)。 值的单位是wei。
3. 在公测链上,使用水龙头。
3.使用智能合约进行部署和交易
太好了,现在我们有了一个带有一些以太币的地址(用于支付 gas),我们可以离线创建我们的交易两千块可以玩以太坊合约吗,对其进行签名并将其发送到具有原生 JSON-RPC 的 HTTP 请求节点。
我们将使用 send_rawTransaction 方法,它将交易的签名作为输入参数。
python代码正在查询包含truffle在编译智能合约时创建的合约abi和字节码的json文件。 在测试 python 代码之前,创建一个 truffle 工作区并编译虚拟合约 AdditionContract.sol。
$ truffle init
// add the smart contract in contracts/
$ truffle compile
然后用 geth 节点的 URL 和 truffle 工作区和创世文件的路径更新 python 代码(不要忘记在路径中用你的用户名替换我的用户名)。
其他一切都在代码中,应该是不言自明的。
pragma solidity ^0.4.18;
contract AdditionContract {
uint public state = 0;
function add(uint value1, uint value2) public {
state = value1 + value2;
}
function getState() public constant returns (uint) {
return state;
}
}
完整代码附在文末。
我们使一切都易于修改和测试。 玩得开心:)
python使用web3.py库开发以太坊非常方便。 感兴趣的用户可以关注我们的python以太坊教程,主要是针对python工程师使用web3.py开发区块链以太坊的详细介绍。
另外,其他可以用其他语言学习的以太坊教程如下: