1703878997
合约实例代表在特定网络中已部署的合约。要使用合约抽象实例,我们需要创建一个合约实例。创建合约实例的方法有如下3种:
1703878998
1703878999
·SampleContract.new([arg1,arg2,…],[tx params])。该函数使用合约要求的任何constructor参数,并部署一个新的合约实例到合约抽象要用到的网络。最后一个实参是可选的,可以用它传送包括来自地址的交易、gas上限和gas价格在内的交易参数。该函数返回一个承诺,在挖出交易时,该承诺归结为新部署的地址上合约抽象的一个新实例。该方法不会对合约抽象代表的artifacts对象进行任何修改。在使用该方法前,确保它可以为要用到的网络发现字节码所依赖的库地址。
1703879000
1703879001
·SampleContract.at(address)。该函数用于创建合约抽象的一个新实例——代表传入的地址上的合约。它返回一个“thenable(则可能)”对象(对于反向兼容性来说还不是一个实际的承诺)。确保代码存在于所要用到的网络中的特定地址之后,该函数将解析一个合约抽象实例。
1703879002
1703879003
·SampleContract.deployed()。该函数和at()类似,但地址是从artifacts对象中检索的。像at()一样,deployed()是合理的。在确保代码存在于所要用到的网络中的特定地址之后,该函数将解析一个代表已部署的合约的合约实例。
1703879004
1703879005
下面部署合约并获取样本合约的实例。在network ID 10中,需要首先使用new()部署StringLib库,然后把StringLib库的已部署地址添加到StringLib抽象,再把StringLib抽象接入SampleContract抽象,最后使用new()部署样本合约以获取样本合约的一个实例。但是在network ID 1中,只需要部署SampleContract并获取其实例,因为已经在那里部署了StringLib。全部相关代码如下:
1703879006
1703879007
上述代码的执行过程如下:
1703879008
1703879009
1703879010
1703879011
1703879012
1703879013
1703879014
1703879015
1)检测网络ID。如果网络ID是10,则部署合约和库;如果网络ID是1,则只部署合约。
1703879016
1703879017
2)在network ID 10中,部署StringLib合约并获取其合约实例。
1703879018
1703879019
3)更新StringLib抽象,这样就知道了它所代表的当前网络的合约地址。更新抽象的界面类似于直接更新artifacts对象。如果连接到network ID 1,则将重写已经设置好的StringLib地址。
1703879020
1703879021
4)把已部署的StringLib接入SampleContract抽象。接入会更新链接,并把库里的事件复制到SampleContract抽象的当前网络。库可以被多次接入,并将重写它们之前的链接。
1703879022
1703879023
5)部署SampleContract到当前网络。
1703879024
1703879025
6)更新SampleContract抽象,以便在当前网络中存储合约地址,这样以后可以使用deployed()来获取实例。
1703879026
1703879027
7)在network ID 1中,只部署SampleContract即可。
1703879028
1703879029
8)这时可以修改节点连接的网络并重启应用,应用将相应做出修改。例如,在开发人员的机器上,应用将连接到开发网络;在生产服务端上,应用将连接到主网络。显然,用户可能不希望每次运行前面的文件都部署合约,所以实际上,只要合约被部署了,就可以更新artifacts对象,而且可以在代码中检查是否已经部署了合约。如果没有部署,只有这时部署它。在合约部署完成后,用户可以在数据库或者文件中存储artifacts对象并编写代码自动更新(而非手动更新)。
1703879030
1703879031
3.合约实例API
1703879032
1703879033
源Solidity合约不同,每个合约实例也是不同的,且API是动态创建的。下面是合约实例的不同API:
1703879034
1703879035
·allEvents。这是一个合约实例函数,在当前网络ID下,当合约artifacts对象中匹配事件签名的合约引发一个事件时,就激活这个回调函数。用户还可以用eventname-specific函数抓取特定事件,而非所有事件。在前面的合约中,要抓取ping事件,可以使用SampleContract_Instance.ping(function(e,r){})。
1703879036
1703879037
·send。该函数用于向合约发送以太币。它有两个实参:第一个实参是要转账的wei数量;第二个实参是可选项对象,该对象用于设置交易的from,即发送以太币的地址。该调用返回一个承诺,且该承诺在挖出交易时解析交易细节。
1703879038
1703879039
·可以使用SampleContract.functionName()或者SampleContract.functionName.call()调用合约的任何方法。前者发送交易,后者则只调用EVM上的方法,且修改并不持续。两种方法都返回一个承诺。在第一种情况下,承诺解析交易结果,也就是说,一个对象包含交易哈希、日志和交易收据。在第二种情况下,承诺解析方法调用的返回值。两种方法都有函数实参,且最后一个实参为可选项,它是一个设置交易的from、gas和value等的对象。
1703879040
1703879041
1703879042
1703879043
1703879045
区块链项目开发指南 8.4 truffle概述
1703879046
[
上一页 ]
[ :1.703878997e+09 ]
[
下一页 ]