在开发以太坊的 dapp
(去中心化应用)或交易脚本时,开发者通常会借助某些库或框架来简化与以太坊区块链的交互过程。这些工具提供了便捷的 API 接口,通过这些接口,开发者能够轻松地发送交易、 读取链上数据、以及执行其他与区块链交互的操作。虽然这些库或框架能够极大简化交易的创建和发送过程,但其内部的交易构造和发送机制却往往隐藏于开发者的视线之外。
为了解这些框架内部发送交易的原理,本文将深入探讨如何在不依赖于任何框架的情况下手动发起一笔交易。
要在无框架的环境中发送一笔交易,通常需经历以下几个核心步骤:
- 构建交易对象:创建一个包含了交易相关信息(如交易的发送方、接收方、金额、Gas 价格等)的交易对象
- 对交易对象进行签名:利用私钥对构建好的交易对象进行签名,以确保交易的安全性和完整性
- 发送交易:将签名后的交易对象发送到以太坊网络
构造交易
交易的原始数据结构
interface Transaction {
form: Address // 交易的发送者
to: Address // 交易的接收者
nonce: Hex // 发送者的nonce
type: Hex // 交易类型, 0(legcy) 或 1(EIP-2930) 或 2(EIP-1559)
value: Hex // 交易携带的主币数量, 单位是 wei
data: Hex // 交易携带的数据
maxPriorityFeePerGas?: Hex // EIP-1559:每单位 gas 优先费用, type=2时提供
maxFeePerGas?: Hex // EIP-1559:每单位 gas 最大费用, type=2时提供
gas: Hex // 可使用的最大 gas 数量(gasLimit)
gasPrice?: Hex // gas 价格, type!=2时提供
accessList?: [] // EIP-2930新增属性, 值为包含地址和存储键的列表,主要为解决EIP-2929带来的副作用问题
}
其中相关字段需要通过 JSON RPC
获取
JSON RPC
本质为 HTTPpost
请求,区别在于请求参数为固定的格式,如下所示{
jsonrpc: '2.0', // 指定 JSON-RPC 协议版本
method: '', // 调用的方法名称
params: [], // 调用方法所需要参数
id: 1 // 本次请求的编号
}响应结果格式如下所示
{
jsonrpc: '2.0', // 指定 JSON-RPC 协议版本
id: 1, // 本次请求的编号, 和请求参数中的 id 一致
result: '' // 请求结果
}