Skip to Content
dApp 接入

发送交易

发送交易

交易是区块链上的正式操作。在 OneKey 浏览器扩展中,交易始终通过调用 eth_sendTransaction 方法发起。交易可以是简单的以太币转账,也可以是发送代币、创建新的智能合约,或以任何方式改变区块链上的状态。交易始终由外部账户(即简单的密钥对)的签名发起。

在 OneKey 浏览器扩展中,直接使用 onekey.request 方法发送交易需要构造如下的选项对象:

const transactionParameters = { nonce: '0x00', // OneKey 浏览器扩展会忽略此参数 gasPrice: '0x09184e72a000', // 用户可在 OneKey 浏览器扩展确认时自定义 gas: '0x2710', // 用户可在 OneKey 浏览器扩展确认时自定义 to: '0x0000000000000000000000000000000000000000', // 除合约创建外必填 from: connectedAddress, // 必须与用户当前活跃地址匹配 value: '0x00', // 仅在从发起的外部账户向接收方发送以太币时必填 data: '0x7f7465737432000000000000000000000000000000000000000000000000000000600057', // 可选,用于定义智能合约创建和交互 chainId: '0x3', // 用于防止跨链交易重放,OneKey 浏览器扩展会自动填充 }; // txHash 是十六进制字符串 // 与任何 RPC 调用一样,可能会抛出错误 const provider = (window.$onekey && window.$onekey.ethereum) || window.ethereum; const txHash = await provider.request({ method: 'eth_sendTransaction', params: [transactionParameters], });

示例

交易参数

OneKey 浏览器扩展会为您处理许多交易参数,但了解所有参数的作用仍然很有帮助。

Nonce(已忽略)

OneKey 浏览器扩展会忽略此字段。

在以太坊中,每笔交易都有一个 nonce。这是为了确保每笔交易只能被区块链处理一次。此外,要成为有效交易,nonce 必须为 0,或者前一个编号的交易必须已被处理。

这意味着对于给定账户,交易始终按顺序处理,因此递增 nonce 是一个非常敏感的操作,很容易出错,特别是当用户使用同一账户在多个应用程序中进行待处理交易时,可能还跨越多个设备。

出于这些原因,OneKey 浏览器扩展目前不向应用程序开发者提供自定义其建议交易的 nonce 的方法,而是帮助用户自己管理其交易队列。

Gas Price(可选)

可选参数 - 最适合在私有区块链上使用。

在以太坊中,待处理交易池会将其 gas 价格作为一种拍卖出价,提供给验证者,以换取将此交易包含在区块中并收取交易费用。这意味着高 gas 价格可能意味着更快的处理速度,但也意味着更昂贵的交易。

OneKey 浏览器扩展帮助用户在以太坊主网和流行的测试网络上选择有竞争力的 gas 价格。我们向 MyCrypto 的朋友维护的 API 发起请求,并允许用户在”慢速”、“中等”和”快速”选项之间进行选择。

我们无法了解所有区块链上的 gas 市场情况,因为这需要深入分析。因此,虽然在我们主要托管的网络上您可以安全地忽略此参数,但在您的应用程序比我们更了解目标网络的情况下,您可能需要建议一个 gas 价格。

Gas Limit(可选)

可选参数。对 DApp 开发者很少有用。

Gas limit 是一个高度可选的参数,我们会自动为其计算合理的价格。如果您的智能合约因某种原因确实受益于自定义 gas limit,您可能会知道的。

To(半可选)

十六进制编码的以太坊地址。对于有接收方的交易(除合约创建外的所有交易)是必填的。

当没有 to 值但有 data 值时,会发生合约创建。

Value(可选)

十六进制编码的网络原生货币发送值。在以太坊主网上,这是 ether ,以 wei 为单位,即 1e-18 ether。

请注意,以太坊中经常使用的这些数字的精度远高于原生 JavaScript 数字,如果不加以预期可能会导致不可预测的行为。因此,我们强烈建议在操作用于区块链的值时使用 BN.js 

Data(半可选)

智能合约创建时必填。

此字段也用于指定合约方法及其参数。您可以在 Solidity ABI 规范  中了解更多关于数据编码的信息。

Chain ID(目前已忽略)

Chain ID 目前从用户当前选择的网络(onekey.networkVersion)派生。将来我们可能会允许同时连接多个网络,届时此参数将变得重要,因此养成现在就包含它的习惯可能会有所帮助。

Last updated on