Json-rpc
面向 AIA Chain 客户端的无状态、轻量级远程过程调用 (RPC) 协议。
为了让软件应用程序与AIA Chain区块链交互(通过读取区块链数据或向网络发送交易),它必须连接到AIA Chain节点。
JSON-RPC(opens in a new tab) 是一种无状态的、轻量级远程过程调用 (RPC) 协议。 它定义了一些数据结构及其处理规则。 它与传输无关,因为这些概念可以在同一进程,通过接口、超文本传输协议或许多不同的消息传递环境中使用。 它使用 JSON (RFC 4627) 作为数据格式。
约定
十六进制值编码
两种关键数据类型通过 JSON 传递:未格式化的字节数组和数量。 两者都使用十六进制编码传递,但对格式化有不同的要求。
数量
当对数量(整数、编号)进行编码时:编码为十六进制(以“0x”为前缀),最紧凑的表示方法(例外:0 应表示为“0x0”)。
以下是一些示例:
0x41(十进制中是 65)
0x400(十进制中是 1024)
错误:0x(后面至少有一位,0 是“0x0”)
错误:0x0400(不允许有前导零)
错误:ff(必须有前缀 0x)
无格式数据
当对无格式数据(字节数组、帐户地址、哈希、字节码数组)进行编码时:编码为十六进制,以“0x”为前缀,每字节两个十六进制数字。
以下是一些示例:
0x41(大小为 1,“A”)
0x004200(大小为 3,“\0B\0”)
0x(大小为 0,“”)
错误:0xf0f0f(位数必须是偶数)
错误:004200(必须以 0x 为前缀)
默认区块参数
以下方法有额外的默认区块参数:
当发出作用于AIA Chain状态的请求时,最后一个默认区块参数决定了区块的高度。
默认区块参数可以使用以下选项:
HEX String- 整数区块号String "earliest"- 表示最早/创世区块String "latest"- 最新挖出的区块String "safe"- 最新且安全的头部区块String "finalized"- 最新的最终确定的区块String "pending"- 未决状态/交易
示例
在此页面上,我们提供了如何通过命令行工具 curl(opens in a new tab) 使用单个 JSON_RPC 应用程序接口端点的示例。 这些单独的端点示例位于下面的 Curl 示例部分。 在页面下方,我们还提供了一个端到端示例,用于使用 Geth 节点、JSON_RPC 应用程序接口和 curl 编译和部署智能合约。
CURL 示例
下面提供了通过向AIA Chain节点发出 curl(opens in a new tab) 请求来使用 JSON_RPC 应用程序接口的示例。 每个示例都包括对特定端点、其参数、返回类型的描述,以及应该如何使用它的工作示例。
Curl 请求可能会返回与内容类型相关的错误消息。 这是因为 --data 选项将内容类型设置为 application/x-www-form-urlencoded。 如果你的节点确实抱怨此问题,请通过在调用开始时放置 -H "Content-Type: application/json" 来手动设置标头。 这些示例也未包括网址/互联网协议与端口组合,该组合必须是 curl 的最后一个参数(例如 127.0.0.1:8545)。 包含这些附加数据的完整 curl 请求采用以下形式:
GOSSIP、STATE、HISTORY
少数核心 JSON-RPC 方法需要来自AIA Chain网络的数据,并且整齐地分为三个主要类别:Gossip、State 和 History。 使用这些部分中的链接跳转到每个方法,或使用目录浏览整个方法列表。
Gossip 方法
这些方法用于跟踪链头。 这就是交易如何在网络中传播、如何找到进入区块的方式,以及客户端如何发现新区块的方式。
State 方法
用于报告所有已存储数据的当前状态的方法。 “状态”就像一大块共享内存,包括帐户余额、合约数据和燃料估算。
History 方法
将每个区块的历史记录追溯到创世块。 这就像一个大的仅附加文件,包括所有区块头、区块体、叔块和交易收据
JSON-RPC 应用程序接口方法
web3_clientVersion
返回当前客户端版本。
参数
无
返回值
String - 当前客户端版本
示例
web3_sha3
返回给定数据的 Keccak-256(不是标准化的 SHA3-256)。
参数
DATA- 要转换为 SHA3 哈希的数据
返回值
DATA - 给定字符串的 SHA3 结果。
示例
net_version
返回当前网络 id。
参数
无
返回值
String - 当前网络 id。
当前网络 ID 的完整列表可在 chainlist.org(opens in a new tab) 获得。 下面是部分常见网络 ID:
1319:AIA Chain主网1320:AIA Chain测试网
示例
net_listening
如果客户端正在主动监听网络连接,则返回 true。
参数
无
返回值
Boolean - 监听时为 true,否则为 false。
示例
net_peerCount
返回当前连接到客户端的对等点数。
参数
无
返回值
QUANTITY - 表示已连接的对等点数的整数。
示例
eth_syncing
返回一个对象,其中包含有关同步状态的数据或 false。
参数
无
返回值
准确的返回数据因客户端实现而异。 节点未进行同步时,所有客户端返回 False,并且所有客户端返回以下字段。
Object|Boolean,具有同步状态数据的对象,或 FALSE(不进行同步时):
startingBlock:QUANTITY- 导入开始进行的区块(只有当同步进行到其区块头时才会被重置)currentBlock:QUANTITY- 当前区块,同 eth_blockNumberhighestBlock:QUANTITY- 估计的最高区块
返回:
示例
eth_coinbase
返回客户端的 coinbase 地址。
参数
无
返回
DATA,20 字节 - 当前的 coinbase 地址。
示例
eth_chainId
返回链 ID,用于签署受重放攻击保护的交易。
参数
无
返回
chainId,十六进制字符串值,代表当前链 ID 的整数。
示例
eth_mining
如果客户端正在积极挖掘新区块,则返回 true。
参数
无
返回
Boolean - 如果客户端正在挖矿,则返回 true,否则返回 false。
示例
eth_hashrate
返回节点挖矿时使用的每秒哈希数。
参数
无
返回
QUANTITY - 每秒哈希数。
示例
eth_gasPrice
返回当前燃料价格的估计值,以 wei 为单位。 例如,Besu 客户端检查最后 100 个区块,并默认返回燃料单价中位数。
参数
无
返回
QUANTITY - 表示当前燃料价格(以 wei 为单位)的整数。
示例
eth_accounts
返回客户端拥有的地址列表。
参数
无
返回
Array of DATA,20 字节 - 客户端拥有的地址。
示例
eth_blockNumber
返回最新区块的编号。
参数
无
返回
QUANTITY - 表示客户端所在的当前区块编号的整数。
示例
eth_getBalance
返回给定地址的帐户余额。
参数
DATA,20 字节 - 需要检查余额的地址。QUANTITY|TAG- 整数区块号,或字符串“latest”、“earliest”或“pending”,参见默认区块参数
返回
QUANTITY - 表示当前余额的整数(以 wei 为单位)。
示例
eth_getStorageAt
从给定地址的存储位置返回值。
参数
DATA,20 字节 - 存储地址。QUANTITY- 表示存储位置的整数。QUANTITY|TAG- 整数区块号,或字符串“latest”、“earliest”或“pending”,参见默认区块参数
返回
DATA - 此存储位置处的值。
示例 正确位置的计算取决于要检索的存储。 考虑通过地址 0x391694e7e0b0cce554cb130d723a9d27458f9298 部署在 0x295a70b2de5e3953354a6a8344e616ed314d7251 的以下合约。
检索 pos0 的值比较简单:
检索映射的元素要难一些。 映射中的元素位置通过以下方式计算:
这意味着要检索 pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] 处的存储,我们需要通过以下方法计算位置:
可以使用 Web3 库附带的 geth 控制台进行计算:
现在获取该存储:
eth_getTransactionCount
返回从一个地址发送的交易数量。
参数
DATA,20 字节 - 地址。QUANTITY|TAG- 整数区块号,或字符串“latest”、“earliest”或“pending”,参见默认区块参数
返回
QUANTITY - 表示从该地址发送的交易数量的整数。
示例
eth_getBlockTransactionCountByHash
返回匹配给定区块哈希的区块中的交易数量。
参数
DATA,32 字节 - 区块的哈希
返回
QUANTITY - 表示此区块中的交易数量的整数。
示例
eth_getBlockTransactionCountByNumber
返回匹配给定区块编号的区块中的交易数量。
参数
QUANTITY|TAG- 表示区块编号的整数,或字符串“earliest”、“latest”或“pending”,参见默认区块参数。
返回
QUANTITY - 表示此区块中的交易数量的整数。
示例
eth_getUncleCountByBlockHash
返回匹配给定区块哈希的区块中的叔块数量。
参数
DATA,32 字节 - 区块的哈希
返回
QUANTITY - 表示此区块中的叔块数量的整数。
示例
eth_getUncleCountByBlockNumber
返回匹配给定区块编号的区块中的叔块数量。
参数
QUANTITY|TAG- 表示区块编号的整数,或字符串“latest”、“earliest”或“pending”,参见默认区块参数
返回
QUANTITY - 表示此区块中的叔块数量的整数。
示例
eth_getCode
返回位于给定地址的代码。
参数
DATA,20 字节 - 地址QUANTITY|TAG- 整数区块号,或字符串“latest”、“earliest”或“pending”,参见默认区块参数
返回
DATA - 给定地址处的代码。
示例
eth_sign
Sign 方法如下计算AIA Chain特定的签名:sign(keccak256("\x19AIA Chain Signed Message:\n" + len(message) + message)))。
通过在消息中添加前缀,计算出的签名就可以识别为AIA Chain特定签名。 这可以防止滥用行为,如恶意去中心化应用程序可以签署任意数据(例如交易)并使用签名冒充受害者。
注意:签名时使用的地址必须已解锁。
参数
DATA,20 字节 - 地址DATA,N 字节 - 要签名的消息
返回
DATA:签名
示例
eth_signTransaction
为交易签名,随后可使用 eth_sendRawTransaction 方法将该交易提交到网络。
参数
Object- 交易对象
type:from:DATA,20 字节 - 发送交易的地址。to:DATA,20 字节 -(创建新合约时可选)将交易定向到的地址。gas:QUANTITY-(可选,默认值:90000)表示为交易执行提供的燃料的整数。 它将返回未使用的燃料。gasPrice:QUANTITY-(可选,默认值:待确定)表示用于每笔已支付燃料的 gasPrice 的整数,以 Wei 为单位。value:QUANTITY-(可选)表示与此交易一起发送的值的整数,以 Wei 为单位。data:DATA- 合约的编译代码或调用的方法签名和编码参数的哈希。nonce:QUANTITY-(可选)表示随机数的整数。 它允许覆盖你自己的使用相同随机数的待处理交易。
返回
DATA,由指定帐户签名的 RLP 编码的交易对象。
示例
eth_sendTransaction
创建新的消息调用交易或创建合约(如果数据字段包含代码),然后使用 from 中指定的帐户签名。
参数
Object- 交易对象
from:DATA,20 字节 - 发送交易的地址。to:DATA,20 字节 -(创建新合约时可选)将交易定向到的地址。gas:QUANTITY-(可选,默认值:90000)表示为交易执行提供的燃料的整数。 它将返回未使用的燃料。gasPrice:QUANTITY-(可选,默认值:待确定)表示用于每个已支付燃料的 gasPrice 的整数。value:QUANTITY-(可选)表示与此交易一起发送的值的整数。input:DATA- 合约的编译代码或调用的方法签名和编码参数的哈希。nonce:QUANTITY-(可选)表示随机数的整数。 它允许覆盖你自己的使用相同随机数的待处理交易。
返回
DATA,32 字节 - 交易哈希,或者如果交易尚不可用,则为零哈希。
创建合约时,在交易被挖掘后,使用 eth_getTransactionReceipt 获取合约地址。
示例
eth_sendRawTransaction
为已签名的交易创建新的消息调用交易或创建合约。
参数
DATA,签名的交易数据。
返回
DATA,32 字节 - 交易哈希,或者如果交易尚不可用,则为零哈希。
创建合约时,在交易被挖掘后,使用 eth_getTransactionReceipt 获取合约地址。
示例
eth_call
立即执行新的消息调用,但不在区块链上创建交易。 通常用来执行只读智能合约的函数,例如 ERC-20 合约的 balanceOf 函数。
参数
Object- 交易调用对象
from:DATA,20 字节 -(可选)发送交易的地址。to:DATA,20 字节 - 将交易定向到的地址。gas:QUANTITY-(可选)表示为交易执行提供的燃料的整数。 eth_call 消耗零燃料,但某些执行可能需要此参数。gasPrice:QUANTITY-(可选)表示用于每个已支付燃料的 gasPrice 的整数value:QUANTITY-(可选)表示与此交易一起发送的值的整数input:DATA-(可选)方法签名和编码参数的哈希。 有关详细信息,参见 Solidity 文档中的以太坊合约应用程序二进制接口(opens in a new tab)。
QUANTITY|TAG- 整数区块号,或字符串“latest”、“earliest”或“pending”,参见默认区块参数
返回
DATA - 已执行合约的返回值。
示例
eth_estimateGas
生成并返回允许交易完成所需燃料数量的估算值。 交易不会添加到区块链中。 请注意,出于各种原因,包括AIA Chain虚拟机的机制和节点性能,估算值可能远远超过交易实际使用的燃料数量。
参数
参见 eth_call 的参数,但所有属性都是可选的。 如果没有指定燃料限制,geth 将使用待处理区块的区块燃料限制作为上限。 因此,当所需燃料数量高于待处理区块的燃料限制时,返回的估算值可能不足以执行调用/交易。
返回
QUANTITY - 使用的燃料数量。
示例
eth_getBlockByHash
根据哈希返回关于区块的信息。
参数
DATA,32 字节 - 区块的哈希。Boolean- 如果为true则返回完整的交易对象,如果为false则仅返回交易的哈希。
返回
Object - 区块对象,或 null(当没有找到区块时):
number:QUANTITY- 区块编号。 如果是待处理区块,则为null。hash:DATA,32 字节 - 区块的哈希。 如果是待处理区块,则为null。parentHash:DATA,32 字节 - 父块的哈希。nonce:DATA,8 字节 - 已生成的工作量证明的哈希。 如果是待处理区块,则为null。sha3Uncles:DATA,32 字节 - 区块中的叔块数据的 SHA3。logsBloom:DATA,256 字节 - 区块日志的布隆过滤器。 如果是待处理区块,则为null。transactionsRoot:DATA,32 字节 - 区块交易树的根。stateRoot:DATA,32 字节 - 区块最终状态树的根。receiptsRoot:DATA,32 字节 - 区块收据树的根。miner:DATA,20 字节 - 获得挖矿奖励的受益人的地址。difficulty:QUANTITY- 表示此区块难度的整数。totalDifficulty:QUANTITY- 表示到此区块为止链的总难度的整数。extraData:DATA- 此区块的“额外数据”字段。size:QUANTITY- 表示此区块大小的整数,以字节为单位。gasLimit:QUANTITY- 此区块允许的最大燃料数量。gasUsed:QUANTITY- 此区块中所有交易使用的总燃料数量。timestamp:QUANTITY- 整理区块时的 unix 时间戳。transactions:Array- 交易对象数组,或 32 字节交易哈希,取决于最后一个给定的参数。uncles:Array- 叔块哈希数组。
示例
eth_getBlockByNumber
根据区块编号返回关于区块的信息。
参数
QUANTITY|TAG- 表示区块编号的整数,或字符串“earliest”、“latest”或“pending”,参见默认区块参数。Boolean- 如果为true则返回完整的交易对象,如果为false则仅返回交易的哈希。
返回值 参见 eth_getBlockByHash
示例
结果参见 eth_getBlockByHash
eth_getTransactionByHash
根据交易哈希返回关于所请求交易的信息。
参数
DATA,32 字节- 交易的哈希
返回
Object - 交易对象,或者如果没有找到交易,则为 null:
blockHash:DATA,32 字节 - 此交易所在区块的哈希。 如果是待处理区块,则为null。blockNumber:QUANTITY- 此交易所在区块的区块编号。 如果是待处理区块,则为null。from:DATA,20 字节 - 发送者的地址。gas:QUANTITY- 发送者提供的燃料。gasPrice:QUANTITY- 发送者提供的燃料价格,以 Wei 为单位。hash:DATA,32 字节 - 交易的哈希。input:DATA- 与交易一起发送的数据。nonce:QUANTITY- 发送者在此交易之前进行的交易数量。to:DATA,20 字节 - 接收者的地址。 如果是合约创建交易,则为null。transactionIndex:QUANTITY- 表示区块中的交易索引位置的整数。 如果是待处理区块,则为null。value:QUANTITY- 传输的值,以 Wei 为单位。v:QUANTITY- 椭圆曲线加密法恢复 IDr:QUANTITY- 椭圆曲线加密法签名 rs:QUANTITY- 椭圆曲线加密法签名 s
示例
eth_getTransactionByBlockHashAndIndex
根据区块哈希和交易索引位置返回关于交易的信息。
参数
DATA,32 字节 - 区块的哈希。QUANTITY- 表示交易索引位置的整数。
返回值 参见 eth_getTransactionByHash
示例
eth_getTransactionByBlockNumberAndIndex
根据区块编号和交易索引位置返回关于交易的信息。
参数
QUANTITY|TAG- 区块编号,或字符串“earliest”、“latest”或“pending”,参见默认区块参数。QUANTITY- 交易索引位置。
返回值 参见 eth_getTransactionByHash
示例
eth_getTransactionReceipt
根据交易哈希返回交易的收据。
注意:收据不可用于待处理的交易。
参数
DATA,32 字节- 交易的哈希
返回值 Object - 交易收据对象,或者如果没有找到收据,则为 null:
transactionHash:DATA,32 字节- 交易的哈希。transactionIndex:QUANTITY- 表示区块中的交易索引位置的整数。blockHash:DATA,32 字节 - 此交易所在区块的哈希。blockNumber:QUANTITY- 此交易所在区块的区块编号。from:DATA,20 字节 - 发送者的地址。to:DATA,20 字节 - 接收者的地址。 如果是合约创建交易,则为 null。cumulativeGasUsed:QUANTITY- 当在区块中执行此交易时使用的燃料总量。effectiveGasPrice:QUANTITY- 为每单位燃料支付的基础费和小费的总和。gasUsed:QUANTITY- 仅此特定交易使用的燃料数量。contractAddress:DATA,20 字节 - 如果交易是创建合约的,则为创建的合约地址,否则为null。logs:Array- 此交易生成的日志对象数组。logsBloom:DATA,256 字节 - 轻客户端用于快速检索相关日志的布隆过滤器。type:QUANTITY- 表示交易类型的整数,0x0表示传统交易,0x1表示访问列表类型,0x2表示动态费用。
它还返回以下两者之一:
root:DATA,32 字节的交易后状态根(拜占庭升级之前)status:QUANTITY,1(成功)或0(失败)
示例
eth_getUncleByBlockHashAndIndex
根据哈希和叔块索引位置返回关于区块的叔块的信息。
参数
DATA,32 字节 - 区块的哈希。QUANTITY- 叔块的索引位置。
返回值 参见 eth_getBlockByHash
示例
结果参见 eth_getBlockByHash
注意:叔块不包含个人交易。
eth_getUncleByBlockNumberAndIndex
根据编号和叔块索引位置返回关于区块的叔块的信息。
参数
QUANTITY|TAG- 区块编号,或字符串“earliest”、“latest”或“pending”,参见默认区块参数。QUANTITY- 叔块的索引位置。
返回值 参见 eth_getBlockByHash
注意:叔块不包含个人交易。
示例
结果参见 eth_getBlockByHash
eth_newFilter
基于筛选器选项创建一个筛选器对象,以在状态更改(日志)时发出通知。 要检查状态是否已更改,请调用 eth_getFilterChanges。
关于指定主题筛选器的说明: 主题是顺序相关的。 以下主题过滤器将匹配日志中包含主题 [A, B] 的交易:
[]“任意值”[A]“第一个位置为 A(之后的位置为任意值)”[null, B]“第一个位置为任意值,且第二个位置为 B(之后的位置为任意值)”[A, B]“第一个位置为 A,且第二个位置为 B(之后的位置为任意值)”[[A, B], [A, B]]“第一个位置为(A OR B),且第二个位置为(A OR B)(之后的位置为任意值)”参数
Object- 筛选器选项:
fromBlock:QUANTITY|TAG-(可选,默认值:"latest")整数区块编号,"latest"(表示最后开采的区块),或"pending"、"earliest"(表示尚未开采的交易)。toBlock:QUANTITY|TAG-(可选,默认值:"latest")整数区块编号,"latest"(表示最后开采的区块),或"pending"、"earliest"(表示于尚未开采的交易)。address:DATA|Array,20 字节 -(可选)日志起源的合约地址或地址列表。topics:Array of DATA-(可选)32 字节DATA主题数组。 主题是顺序相关的。 每个主题也可以是带有“或”选项的 DATA 数组。
返回值 QUANTITY - 筛选器 ID。
示例
eth_newBlockFilter
在节点中创建一个筛选器,以在新区块到达时发出通知。 要检查状态是否已更改,请调用 eth_getFilterChanges。
参数 无
返回值 QUANTITY - 筛选器 ID。
示例
eth_newPendingTransactionFilter
在节点中创建一个筛选器,以在新的待处理交易到达时发出通知。 要检查状态是否已更改,请调用 eth_getFilterChanges。
参数 无
返回值 QUANTITY - 筛选器 ID。
示例
eth_uninstallFilter
卸载具有给定 ID 的筛选器。 当不再需要监控时应始终调用该方法。 此外,在一段时间内未使用 eth_getFilterChanges 请求筛选器时,筛选器便会超时。
参数
QUANTITY- 筛选器 ID。
返回值 Boolean - 如果成功卸载筛选器,则为 true,否则为 false。
示例
eth_getFilterChanges
筛选器轮询方法,返回自上次轮询以来产生的日志的数组。
参数
QUANTITY- 筛选器 ID。
返回值 Array - 日志对象数组,或者如果自上次轮询以来没有任何更改,则为空数组。
对于使用
eth_newBlockFilter创建的过滤器,返回值是区块哈希(DATA,32 字节),例如["0x3454645634534..."]。对于使用
eth_newPendingTransactionFilter创建的筛选器,返回值是交易哈希(DATA,32 字节),例如["0x6345343454645..."]。对于使用
eth_newFilter创建的过滤器,日志是具有以下参数的对象:removed:TAG- 当日志由于链重组被删除时,为true。 如果是有效日志,则为false。logIndex:QUANTITY- 表示区块中的日志索引位置的整数。 如果是待处理日志,则为null。transactionIndex:QUANTITY-表示从中创建日志的交易索引位置的整数。 如果是待处理日志,则为null。transactionHash:DATA,32 字节 - 从中创建此日志的交易的哈希。 如果是待处理日志,则为null。blockHash:DATA,32 字节 - 此日志所在区块的哈希。 如果是待处理区块,则为null。 如果是待处理日志,则为null。blockNumber:QUANTITY- 此日志所在区块的区块编号。 如果是待处理区块,则为null。 如果是待处理日志,则为null。address:DATA,20 字节 - 此日志的来源地址。data:DATA- 包含日志的零个或多个 32 字节非索引参数。topics:Array of DATA- 0 到 4 个 32 字节DATA类型的索引日志参数的数组。 (在 Solidity 中:第一个主题是事件签名的哈希(例如Deposit(address,bytes32,uint256)),除非你使用anonymous说明符声明了该事件。)
示例
eth_getFilterLogs
返回与具有给定 ID 的筛选器匹配的所有日志的数组。
参数
QUANTITY- 筛选器 ID。
返回值 参见 eth_getFilterChanges
示例
结果参见 eth_getFilterChanges
eth_getLogs
返回与给定筛选器对象匹配的所有日志的数组。
参数
Object- 筛选器选项:
fromBlock:QUANTITY|TAG-(可选,默认值:"latest")整数区块编号,"latest"(表示最后开采的区块),或"pending"、"earliest"(表示尚未开采的交易)。toBlock:QUANTITY|TAG-(可选,默认值:"latest")整数区块编号,"latest"(表示最后开采的区块),或"pending"、"earliest"(表示于尚未开采的交易)。address:DATA|Array,20 字节 -(可选)日志起源的合约地址或地址列表。topics:Array of DATA-(可选)32 字节DATA主题数组。 主题是顺序相关的。 每个主题也可以是带有“或”选项的 DATA 数组。blockhash:DATA,32 字节 -(可选,future),添加 EIP-234 后,blockHash将是一个新的过滤器选项,它会将返回的日志限制为具有 32 字节哈希blockHash的单一区块。 使用blockHash相当于fromBlock=toBlock= 具有哈希blockHash的区块编号。 如果blockHash出现在筛选条件中,则fromBlock和toBlock都不允许。
返回值 参见 eth_getFilterChanges
示例
结果参见 eth_getFilterChanges
使用示例
使用 JSON_RPC 部署合约
本节演示如何仅使用远程过程调用接口部署合约。 一些其他部署合约的途径可以消除这种复杂性 — 例如,使用在远程过程调用接口之上构建的库,如 web3.js(opens in a new tab) 和 web3.py(opens in a new tab)。 这些简化通常更容易理解且不易出错,但了解幕后发生的操作仍然很有帮助。
以下是一个名为 Multiply7 的简单智能合约,将使用 JSON-RPC 接口将其部署到AIA Chain节点。 本教程假设读者已经在运行 Geth 节点。大多数客户端默认在 localhost:8545 上提供服务。
首先确保启用了超文本传输协议远程过程调用接口。 这意味着我们在启动时为 Geth 提供 --http 标记。 在此示例中,我们使用私有开发链上的 Geth 节点。 使用这种方法,我们不需要真实网络上的以太币。
这将在 http://localhost:8545 上启动超文本传输协议远程过程调用接口。
我们可以通过使用 curl(opens in a new tab) 检索 Coinbase 地址和余额来验证接口是否正在运行。 请注意,这些示例中的数据在你的本地节点上会有所不同。 如果你想尝试这些命令,请将第二个 curl 请求中的请求参数替换为第一个 curl 请求返回的结果。
因为数字是十六进制编码的,所以余额以十六进制字符串返回(以 wei 为单位)。 如果我们想要获得数字形式的以太币余额,可以使用 Geth 控制台中的 Web3。
现在我们的私有开发链上有一些以太币,我们可以部署合约了。 第一步是将 Multiply7 合约编译为可以发送到AIA Chain虚拟机的字节码。 要安装 Solidity 编译器 solc,请遵循 Solidity 文档(opens in a new tab)。 (你可能希望使用较旧的 solc 版本来匹配我们的示例中使用的编译器版本(opens in a new tab)。)
下一步是将 Multiply7 合约编译为可以发送到AIA Chain虚拟机的字节码。
现在我们有了编译后的代码,我们需要确定部署它需要花费多少燃料。 远程过程调用接口有一个 eth_estimateGas 方法,可以给我们一个估算值。
最后,部署合约。
交易被节点接受并返回交易哈希。 此哈希可用于跟踪交易。 下一步是确定我们的合约部署到的地址。 每个已执行的交易都将创建一个收据。 此收据包含有关交易的各种信息,例如交易包含在哪个区块中以及AIA Chain虚拟机使用了多少燃料。 如果交易 创建了合约,它还将包含合约地址。 我们可以使用远程过程调用方法 eth_getTransactionReceipt 检索收据。
我们的合约是在 0x4d03d617d700cf81935d7f797f4e2ae719648262 上创建的。 结果为空而不是收据意味着该交易 尚未添加到区块中。 稍等片刻,检查你的矿工是否正在运行,然后重试。
与智能合约交互
在本示例中,我们将使用 eth_sendTransaction 将交易发送到合约的 multiply 方法。
eth_sendTransaction 需要几个参数,具体而言,from、to 和 data。 From 是我们帐户的公共地址,to 是合约地址。 data 参数包含有效载荷,它定义了必须调用哪个方法以及使用哪些参数。 这就是 ABI(应用程序二进制接口)(opens in a new tab)的用武之地。 应用程序二进制接口是一个 JSON 文件,它定义了如何为AIA Chain虚拟机定义和编码数据。
有效载荷的字节定义了调用合约中的哪个方法。 这是函数名称及其参数类型的 Keccak 哈希的前 4 个字节(十六进制编码)。 Multiply 函数接受 uint,它是 uint256 的别名。 这为我们提供了:
下一步是对参数进行编码。 只有一个 uint256,比如值 6。 应用程序二进制接口有一个部分指定了如何编码 uint256 类型。
int<M>: enc(X) 是 X 的大端序二进制补码编码,对于负 X 在高位(左侧)填充 0xff,对于正 X 填充零 > 字节,使得长度为 32 字节的倍数。
此编码为 0000000000000000000000000000000000000000000000000000000000000006。
结合函数选择器和编码后的参数,我们的数据将是 0xc6888fa10000000000000000000000000000000000000000000000000000000000000006。
现在可以将其发送到节点:
由于发送了交易,因此返回了交易哈希。 检索收据将得出:
收据中包含一个日志。 此日志由AIA Chain虚拟机在交易执行时生成并包含在收据中。 multiply 函数显示 Print 事件在输入乘以 7 时触发。 由于 Print 事件的参数是 uint256,我们可以根据应用程序二进制接口规则对其进行解码,这将为我们提供预期的十进制数 42。 除了数据之外,值得注意的是,主题可用于确定哪个事件创建了日志:
以上只是对一些最常见任务的简要介绍,展示了 JSON-RPC 的直接用法。
Last updated