Web3j交易经理

Web3j中的事务管理器是一种抽象,它通过连接的客户端控制事务如何签名和广播到以太坊网络。你可以在部署或加载合约时将实现传递给智能合约盘点器,也可以使用它以更加手动的方式直接发送事务。

包含多个不同的Transaction Manager实现,所有实现都扩展了TransactionManager抽象类。每个扩展类都必须实现抽象sendTransaction(..)方法:

public abstract EthSendTransaction sendTransaction(
            BigInteger gasPrice, BigInteger gasLimit, String to,
            String data, BigInteger value)
            throws IOException;

在本文中,我们描述并比较Web3j提供的事务管理器。

ClientTransactionManager

推荐阅读
1的6,149

签名

客户端事务管理器不执行任何事务签名,而是委托连接的以太坊客户端使用其中一个管理帐户进行签名。因此,客户端必须解锁发件人帐户,这意味着客户端可以访问帐户的私钥。

发出

未签名的事务数据通过连接的客户端的eth_sendTransactionJSON RPC端点传递给以太坊客户端。有关此端点的更多信息,请阅读geth JSON RPC文档

随机管理

与签名一样,计算事务随机数被委托给连接节点。

用例

对于大多数生产用例,不建议使用ClientTransactionManager。这是因为需要解锁发件人帐户,这会在你的架构中添加重要的攻击媒介。如果未正确配置客户端,或者通常缺少服务器安全性,则攻击者可能会从未锁定的帐户中窃取资金。

为降低风险,你应该仅ClientTransactionManager用于测试目的,或者用于具有小的以太平衡的未锁定帐户。

源代码

RawTransactionManager

相关阅读

签名

RawTransactionManager需要一个Credentials文件作为构造函数的参数,并使用这些证书的私钥签名在Java端的交易,转发到连接的客户端以太坊之前。这意味着帐户管理根本不在客户端处理,并且帐户不需要解锁。

发出

编码和签名的原始事务通过JSON RPC端点广播到以太坊网络eth_sendRawTransaction 

随机管理

在生成和签署原始事务之前,通过在以太坊客户端上调用eth_getTransactionCount来检索发件人帐户的nonce 。正如你可能看到的,这将检索从帐户发送的事务总数,包括尚未包含在块中的待处理事务。由于nonce为零索引,因此该计数 等于下一个要发送的事务的nonce。

用例

由于RawTransactionManager在转发到客户端之前签署服务器端,因此不需要解锁以太坊客户端帐户。这意味着你可以使用第三方节点,例如Infura,而不是托管你自己的节点。但是,由于计算nonce的方式,此事务管理器不适用于来自单个帐户的具有高事务吞吐量的应用程序。更多关于此的信息。

源代码

FastRawTransactionManager

签名

正如你可能从名称中收集的那样,FastRawTransactionManager扩展RawTransactionManager和构建和签名事务完全相同,nonce值是唯一的例外。

发出

打电话eth_sendRawTransaction,就像在RawTransactionManager

随机管理

Nonce管理是FastRawTransactionManager与香草不同的地方RawTransactionManagereth_getTransactionCount管理器不是每次发送事务时调用,而是维护内存事务计数,并在每次管理器发送事务时递增它。计数管理是同步的,因此是线程安全的。

用例

顾名思义,这TransactionManager对于打算从单个帐户快速发送事务的应用程序很有用,可能在多个线程上。使用标准RawTransactionManager,在高吞吐量情况下,存在竞争条件的可能性,其中RawTransactionManager发送具有相同nonce值的多个事务,导致除了一个事务之外的所有事务都失败。FastRawTransactionManager由于内存事务计数中的线程安全,因此不是这种情况。

源代码

ReadonlyTransactionManager

这是一个存根TransactionManager,它会抛出一个UnsupportedOperationExceptionif sentTransaction

用例

你可以在你想要使用抽象TransactionManager作为参数的情况下使用它,例如调用load(..)合约盘点器的方法,但智能合约只进行调用(只读)操作,所以你没有担心凭据/私钥。

源代码

摘要

TransactionManagerWeb3j捆绑了许多实现,每个实现都有不同的特性。正确的选择取决于你将从正在构建的应用程序发送的事务(或缺少)的方式。如果没有适合你的用例的实现,你始终可以使用所需的功能扩展现有的实现

资源 Kauri