签署以太坊交易

优质
小牛编辑
120浏览
2023-12-01

签署以太坊交易

要使脱机签名交易得到签署,需要设定一个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