如何在以太坊部署智能合约时获取部署通知及合约地址
用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; } } } });
关键说明
- Websocket连接要求:你的Web3实例必须基于Websocket连接创建(例如
new Web3("wss://mainnet.infura.io/ws/v3/your-project-id")),HTTP连接无法支持实时订阅功能。 - 交易状态校验:通过
receipt.Status判断交易是否成功(值为1表示成功,0表示失败),避免处理无效的合约地址。 - 资源清理:找到目标交易并完成处理后,务必取消订阅,防止持续占用网络和计算资源。
替代方案:订阅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
相关产品推荐
相关产品推荐

