Web3j发送EIP4844 Blob交易

Web3j 已成为第一个支持向以太坊客户端发送 EIP-4844 blob 交易的 web3 库,本文介绍如何使用web3j发送EIP-4844的Blob交易。

Web3j发送EIP4844 Blob交易
一键发币: SOLANA | BNB | ETH | POLYGON | HECO | OKEX

对于以太坊和区块链开发者社区来说,这是一项令人兴奋的发展,Web3j 已成为第一个支持向以太坊客户端发送 EIP-4844 blob 交易的 web3 库。 此次更新让我们距离以太坊可扩展性和效率的未来又近了一步,让我们得以一睹网络的完整数据分片最终会是什么样子。

1、了解 EIP-4844 及其影响

EIP-4844 因向以太坊引入“blob 携带交易”而闻名,旨在容纳 EVM 执行无法访问但其承诺可以访问的大量数据。 这种创新方法允许将重要数据临时存储在信标节点上,从而增强网络处理大量信息的能力。

完整的数据分片仍需要相当长的时间才能完成实施和部署。 该 EIP 通过实现将在分片中使用的交易格式,但实际上并不对这些交易进行分片,从而提供了一个权宜之计的解决方案。 相反,这种交易格式的数据只是信标链的一部分,并由所有共识节点完全下载(但仅在相对较短的延迟后即可删除)。 与完整数据分片相比,该 EIP 减少了可包含的交易数量上限,相当于每块约 0.375 MB 的目标和约 0.75 MB 的限制。

目前,L2 网络或 Rollups 花费了大量资金来确保其交易数据可供所有节点和验证器使用。 大多数汇总都是通过将数据作为调用数据写入以太坊来实现的。 按当前价格计算,每兆字节的成本约为 1000 美元。 好的汇总通过使用高级数据压缩将成本降低到每兆字节 300 美元。 尽管如此,数据发布成本仍占 L2 交易费用的最大部分。 借助 EIP4844 blob 数据,以太坊满足了 rollups 的数据可用性需求,因此它们为 rollups 提供了一种新的、希望更便宜的方式来记录数据,这将有助于显着降低 Optimism、Polygon zkEVM、Arbitrum、Starknet等第 2 层网络的交易费用 。

1、EIP-4844 中的新交易类型规范

EIP-4844 交易遵循新的 EIP-2718 事务类型“blob 事务”,其中 TransactionType 为  BLOB_TX_TYPE = Bytes1(0x03)。 字段 chain_idnoncemax_priority_fee_per_gasmax_fee_per_gasgas_limitvaluedata 和  access_list 遵循与 EIP-1559 相同的语义。

还有两个添加的字段 max_fee_per_blob_gas 是  uint256,字段  blob_versioned_hashes 表示 kzg_to_versioned_hash 的哈希输出列表。

2、联网

我们可以使用 web3j 将签名的 EIP-4844 交易发送到 eth_sendRawTransaction API,并且原始形式必须是网络形式。 这意味着它包括 tx_payload_body、 blob、 KZG 承诺和 KZG 证明。

每个元素的定义如下:

  • tx_payload_body - 是标准 EIP-2718 blob 交易的 TransactionPayloadBody
  • blobs - Blob 项目列表
  • commitments- 相应 blob 的 KZGCommitment 列表
  • proofs - 相应 blob 和承诺的 KZGProof 列表

3、代码示例:使用 Web3j 发送 Blob 事务

在继续以下代码示例之前,请确保你正在使用的网络已启用 EIP-4844 支持。

要利用 Web3j 中的 EIP-4844 blob 事务功能,开发人员可以按照以下示例操作:

public class Web3jEIP4844Example {


    public static void main(String[] args) throws Exception {

        // Initialize Web3j and Credentials

        Web3j web3j = Web3j.build(new HttpService("<nodeUrl>"));

        Credentials credentials = Credentials.create("<privateKey>");


        // Get the current nonce for the account

        BigInteger nonce = web3j.ethGetTransactionCount(

                credentials.getAddress(), DefaultBlockParameterName.LATEST)

                .send()

                .getTransactionCount();


    // Get the Current Base Fee Per Blob Gas value

    BigInteger blobBaseFee = web3j.ethGetBaseFeePerBlobGas();

    System.out.println("blobBaseFee = " + blobBaseFee);


// Multiply baseFeePerBlobGasValue with appropriate number to set it as our maxFeePerBlobGas value

BigInteger maxFeePerBlobGas =  BigInteger.valueOf((long) (web3j.ethGetBaseFeePerBlobGas().longValue() * 1.1));


        // Create a blob transaction

        RawTransaction rawTransaction = createEip4844Transaction(

                nonce, maxFeePerBlobGas);


        // Sign the transaction

        byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);

        String hexValue = Numeric.toHexString(signedMessage);


        // Send the transaction

        EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).send();


        System.out.println("Transaction hash: " + ethSendTransaction.getTransactionHash());

System.out.println("Tx Receipt = " + web3j.ethGetTransactionReceipt(ethSendTransaction.getTransactionHash()).send().getTransactionReceipt());

    }


private static RawTransaction createEip4844RawTransaction(BigInteger nonce, BigInteger maxFeePerBlobGas) {

        List<Blob> blobs = new ArrayList<>();


        blobs.add(new Blob("<blobData_in_Bytes>"));

        return RawTransaction.createTransaction(

                blobs,

                11155111L,

                nonce,

                BigInteger.valueOf(10_000_000_000L),

                BigInteger.valueOf(50_000_000_000L),

                BigInteger.valueOf(3_00_000L),

                "<toAddress>",

                BigInteger.valueOf(0),

                "",

                maxFeePerBlobGas);

    }

}

如果我们只想从 blob 计算 KZG 承诺和 KZG 证明,我们可以使用 BlobUtils 类函数来实现。

Blob blob = new Blob(

        Numeric.hexStringToByteArray(

                loadResourceAsString("blob_data.txt")));

Bytes commitment = BlobUtils.getCommitment(blob);

Bytes proofs = BlobUtils.getProof(blob, commitment);

Bytes versionedHashes = BlobUtils.kzgToVersionedHash(commitment);

BlobUtils.checkProofValidity(blob, commitment, proofs)

对于有兴趣查看 web3j 中与 EIP-4844 相关的 PR 的开发人员,可以参考以下链接:

这些 PR 包含在 web3j 发行版本 >=4.11.0 中

4、结束语

Web3j 最近集成了 EIP-4844 blob 交易,作为第一个采用这一创新的 web3 库,展示了其对区块链开发和最新进展的承诺。

这篇博文深入探讨了 EIP-4844 的技术复杂性,从它对以太坊可扩展性的潜在影响到它引入的新交易类型的特殊性。

此外,利用 Web3j 发送 EIP-4844 交易的实际见解为开发人员提供了探索这一新领域所需的工具。


原文链接:EIP-4844 Blob Transactions Support in Web3j

DefiPlot翻译整理,转载请标明出处