发交易
交易会改变链上状态,因此必须由用户在钱包中确认后才能发出。在 UKey Wallet Ethereum Provider 中,DApp 通过 eth_sendTransaction 发起交易请求。它可以用于原生币转账、代币合约调用、合约部署或其他需要写入链上状态的操作。
直接使用 Provider 发送交易时,需要构造交易参数对象,然后调用 provider.request:
const transactionParameters = {
nonce: "0x00", // UKey Wallet 浏览器扩展会直接忽略这个参数
gasPrice: "0x09184e72a000", // 用户确认时仍可在 UKey Wallet 浏览器扩展里修改
gas: "0x2710", // 用户确认时仍可在 UKey Wallet 浏览器扩展里修改
to: "0x0000000000000000000000000000000000000000", // 除了合约创建场景外都要传
from: connectedAddress, // 必须和用户当前激活地址保持一致
value: "0x00", // 只有外部账户向接收方转 ETH 时才一定要填
data: "0x7f7465737432000000000000000000000000000000000000000000000000000000600057", // 可选字段,用来描述合约创建或调用内容
chainId: "0x3", // 用来防止跨链重放,UKey Wallet 浏览器扩展通常会自动补上
};
// txHash 返回的是十六进制字符串
// 和其他 RPC 调用一样,这里也可能抛错
const provider = (window.$ukey && window.$ukey.ethereum) || window.ethereum;
const txHash = await provider.request({
method: "eth_sendTransaction",
requestParams: [transactionParameters],
});
参考片段
交易字段配置
钱包会补齐或重新估算部分参数,但理解这些字段有助于你构造更可靠的交易请求。
Nonce(已忽略)
当前 UKey Wallet 浏览器扩展会忽略该字段。
以太坊账户的每笔交易都有 nonce,用来保证交易顺序和防止重复执行。有效交易的 nonce 必须与账户当前待处理队列匹配。
当用户在多个 DApp 或设备上同时发起交易时,手动指定 nonce 很容易造成冲突或卡住后续交易。
因此,建议让钱包管理 nonce 和交易队列,DApp 不要依赖自定义 nonce 控制交易顺序。
Gas Price(可选)
这是可选参数,通常只在私有链或特殊网络中需要由 DApp 明确传入。
Gas price 会影响交易被打包的优先级。设置得越高,交易可能越快被处理,但用户支付的费用也会增加。
在常见网络上,钱包会帮助用户选择合适的费用档位,用户也可以在确认页面中调整费用。
如果你的 DApp 连接的是钱包无法准确估算费用的网络,可以传入建议值,但仍应允许用户在钱包中最终确认。
Gas Limit(可选)
这是可选参数。大多数 DApp 可以让钱包或 RPC 自动估算。
只有当你的合约调用确实需要特殊 gas limit 时,才建议显式传入该字段。
To(半可选)
to 是十六进制编码的以太坊地址。除合约创建外,普通转账和合约调用都需要提供接收方地址。
如果没有 to,但提供了 data,交易会被视为合约创建请求。
Value(可选)
value 是十六进制编码的原生币数量。在以太坊主网上单位为 wei,即 1e-18 ETH。
链上金额通常会超过 JavaScript Number 的安全整数范围。构造金额时请使用 bigint、BN.js 或 viem/ethers 提供的单位转换工具。
Data(半可选)
创建合约时必须提供 data。
合约调用也依赖 data 表示方法选择器和参数编码。编码方式可参考 Solidity ABI 规范。
Chain ID(目前已忽略)
当前 Chain ID 会根据用户在钱包中选择的网络确定。建议 DApp 在交易前主动检查当前 eth_chainId,避免把交易发到非预期网络。