You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在以太坊部署智能合约时获取部署通知及合约地址

用Nethereum实现合约部署的实时通知(非阻塞式)

因为合约部署本身不会触发合约事件(合约还未创建),所以我们需要通过监听以太坊网络的区块/交易状态来实现实时通知,替代SendRequestAndWaitForReceiptAsync的阻塞等待。以下是具体实现方案:

步骤1:获取部署交易的哈希

首先调用SendRequestAsync时,保存返回的交易哈希,这是后续追踪的唯一标识:

var abi = "[ABI...]";
var bytecode = "0x00...";
var gas = await web3.Eth.DeployContract.EstimateGasAsync(abi, bytecode, publicKey, "Zuk04");

// 获取部署交易的哈希
var txHash = await web3.Eth.DeployContract.SendRequestAsync(abi, bytecode, publicKey, gas, new HexBigInteger("0"), "Zuk01");

步骤2:通过Websocket订阅新区块实时追踪交易

使用Nethereum的区块订阅功能,实时监听新区块生成,一旦发现目标交易被打包,立即获取交易收据并提取合约地址:

// 创建区块订阅(需确保Web3实例基于Websocket连接创建)
var blockSubscription = await web3.Eth.Blocks.CreateBlockSubscriptionAsync(async block =>
{
    // 获取包含交易详情的区块数据
    var blockWithTx = await web3.Eth.Blocks.GetBlockWithTransactionsByNumber.SendRequestAsync(block.Number);
    
    // 遍历区块内的交易,匹配目标交易哈希
    foreach (var tx in blockWithTx.Transactions)
    {
        if (tx.TransactionHash.Equals(txHash, StringComparison.OrdinalIgnoreCase))
        {
            // 获取交易收据
            var receipt = await web3.Eth.Transactions.GetTransactionReceipt.SendRequestAsync(txHash);
            
            if (receipt != null)
            {
                if (receipt.Status.Value == 1) // 交易执行成功
                {
                    var contractAddress = receipt.ContractAddress;
                    // 此处处理合约部署完成后的业务逻辑,比如通知系统或存储地址
                    Console.WriteLine($"合约部署成功,地址:{contractAddress}");
                }
                else
                {
                    // 处理交易失败的情况
                    Console.WriteLine("合约部署交易执行失败");
                }
                
                // 完成追踪后取消订阅,避免无效监听占用资源
                await blockSubscription.UnsubscribeAsync();
                break;
            }
        }
    }
});

关键说明

  1. Websocket连接要求:你的Web3实例必须基于Websocket连接创建(例如new Web3("wss://mainnet.infura.io/ws/v3/your-project-id")),HTTP连接无法支持实时订阅功能。
  2. 交易状态校验:通过receipt.Status判断交易是否成功(值为1表示成功,0表示失败),避免处理无效的合约地址。
  3. 资源清理:找到目标交易并完成处理后,务必取消订阅,防止持续占用网络和计算资源。

替代方案:订阅Pending Transactions

如果需要更早感知交易状态,可以订阅待打包交易(Pending Transactions),但需额外处理交易从待打包到确认的状态变化:

var pendingTxSubscription = await web3.Eth.Transactions.CreatePendingTransactionSubscriptionAsync(async tx =>
{
    if (tx.TransactionHash.Equals(txHash, StringComparison.OrdinalIgnoreCase))
    {
        Console.WriteLine("部署交易已进入待打包状态");
        // 可在此处继续监听区块,等待交易最终确认
    }
});

内容的提问来源于stack exchange,提问作者user19291301

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:55:14