签署以太坊交易
要使脱机签名交易得到签署,需要设定一个RawTransaction类型。RawTransaction
类似于前面提到的Transaction
类型,但是它不需要通过具体的账号地址来请求,因为可以从签名中推断出来。
为了创建和签署原生交易,交易的顺序如下:
- 1.确定交易发起者帐户的下一个可用随机数
nonce
- 2.创建
RawTransaction
对象 - 3.使用递归长度前缀编码(RLP即Recursive Length Prefix)对
RawTransaction
对象进行编码 - 4.签署
RawTransaction
对象 - 5.将
RawTransaction
对象发送到节点进行处理
nonce
是一个不断增长的数值,用来唯一地标识交易。一个nonce
只能使用一次,直到交易被挖掘完成,可以以相同的随机数发送交易的多个版本,但是一旦其中一个被挖掘完成,其他后续提交的都将被拒绝。
一旦获得下一个可用的nonce
,该值就可以用来创建transaction
对象:
RawTransaction rawTransaction = RawTransaction.createEtherTransaction(
nonce, <gas price>, <gas limit>, <toAddress>, <value>);
然后可以对交易进行签名和编码:
byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, <credentials>);
String hexValue = Numeric.toHexString(signedMessage);
其中凭据是根据创建和使用钱包文件加载的。
然后使用eth_SendRawTransaction发送交易:
EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get();
String transactionHash = ethSendTransaction.getTransactionHash();
// poll for transaction response via org.web3j.protocol.Web3j.ethGetTransactionReceipt(<txHash>)
有关创建和发送原始事务的完整示例,请参阅 CreateRawTransactionIT。