1703877258
区块链项目开发指南 4.1.8 处理合约
1703877259
1703877260
让我们学习如何部署一个新合约、如何使用一个已部署合约的地址获取其引用、如何向合约发送以太币、如何发送交易以调用合约的函数(方法),以及如何估算一个函数调用的gas。
1703877261
1703877262
若要部署一个新合约或者获取一个已部署合约的引用,首先需要使用web3.eth.contract()方法创建一个合约对象。该方法以合约ABI作为一个实参,并返回合约对象。
1703877263
1703877264
创建合约对象的代码如下:
1703877265
1703877266
1703877267
1703877268
1703877269
有了合约之后,可以使用合约对象的新方法部署它,或者使用at方法获取与ABI匹配的、一个已部署合约的引用。
1703877270
1703877271
部署合约的示例如下:
1703877272
1703877273
1703877274
1703877275
1703877276
其中,new方法的调用是异步的,所以如果成功创建和广播交易,回调函数将被调用两次。第一次,广播交易之后调用它;第二次,挖出交易之后调用它。如果不提供回调函数,则proof变量的address属性被设成undefined。挖出交易之后,address属性将被设置。
1703877277
1703877278
在proof合约中,没有构造函数,但是如果有构造函数,则构造函数实参应当放在new方法的开头。传送的对象包含from地址、合约字节码和使用的gas上限。这三个属性必须存在,否则无法创建交易。该对象可以有被传送给sendTransaction方法的对象所展示的属性,但是这里,data是合约字节码,且to属性被忽略。
1703877279
1703877280
可以用at方法引用一个已经部署的合约。相关代码如下:
1703877281
1703877282
1703877283
1703877284
1703877285
现在让我们看看如何发送交易以调用合约方法。相关代码如下:
1703877286
1703877287
1703877288
1703877289
1703877290
这里调用方法同名对象的sendTransaction方法。被传送给这个sendTransaction方法的对象属性与web3.eth.sendTransaction()相同,只是data和to属性被忽略了。
1703877291
1703877292
如果想调用节点本地的方法,而非创建交易并广播,则可使用call而非sendTransaction。示例如下:
1703877293
1703877294
1703877295
1703877296
1703877297
有时必须发现找到调用方法所需的gas,这样可以决定是否调用。web3.eth.estimateGas可用于此目的。然而,直接使用web3.eth.estimateGas()要求生成交易,因此可以使用方法同名对象的estimateGas()方法。示例如下:
1703877298
1703877299
1703877300
1703877301
1703877302
1703877303
如果只想发送一些以太币到合约,而不调用任何方法,则可以使用web3.eth.sendTransaction方法。
1703877304
1703877305
1703877306
[
上一页 ]
[ :1.703877257e+09 ]
[
下一页 ]