主页 > imtokenusdt钱包 > Python通过JSON-RPC请求部署和交易以太坊智能合约

Python通过JSON-RPC请求部署和交易以太坊智能合约

imtokenusdt钱包 2023-10-13 05:07:41

对于本指南,我们使用私有权威证明网络。 如果您想创建这样的网络两千块可以玩以太坊合约吗,可以阅读我们之前的帖子。 本文假设使用 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开发区块链以太坊的详细介绍。

另外,其他可以用其他语言学习的以太坊教程如下: