1703878965
1703878966
该合约使用StringLib库把uint转换成bytes32,把bytes32转换成uint。String-Lib在主网络上的0xcca8353a18e7ab7b3d094ee1f9ddc91bdf2ca6a4地址可用,但是在其他网络上,我们需要部署它以测试合约。在进行下一步操作之前,使用Browser Solidity编译它,因为将需要ABI和字节码。
1703878967
1703878968
现在创建一个代表Sample合约的合约抽象和StringLib库。相关代码如下,将此段代码放入HTML文件中:
1703878969
1703878970
1703878971
1703878972
1703878973
1703878974
1703878975
1703878976
1703878977
1703878978
1703878979
上述代码的执行过程如下:
1703878980
1703878981
1)创建一个provider。truffle-contract使用这个provider与节点通信。
1703878982
1703878983
2)为样本合约创建合约抽象。使用Truffle-contract函数创建合约抽象。该函数有一个对象,其中包含关于合约的多种信息。该对象可以被称为artifacts对象。abi和unlinked_binary属性是必选项,其他属性是可选项。abi属性指向合约的ABI,而unlinked_binary属性指向合约的未链接的二进制代码。
1703878984
1703878985
3)network属性表示不同网络中的合约涉及的各种信息。这里,在network ID 1中,StringLib相关程序被部署在0xcca8353a18e7ab7b3d094ee1f9ddc91bdf2ca6a4地址,所以在网络1部署样本合约时,它会自动连接。在networks对象下面还可以设置address属性,表示该合约已经被部署到这个网络,这就是合约地址。在networks对象中还有一个events对象,用于指明想获取的合约事件。events对象的key是事件主题,value是事件的ABI。
1703878986
1703878987
4)通过传送一个新的provider实例调用SampleContract对象的setProvider方法。这是一种传送provider的方式,这样truffle-contract就能与该节点通信。truffle-contract API无法在全局设置provider,反而需要为每个合约抽象设置一个provider。该功能允许用户轻松接入多个网络并在其中工作。
1703878988
1703878989
5)调用SampleContract对象的detectNetwork方法。这是设置合约抽象当前代表的网络ID的一种方式。也就是说,在对合约抽象进行全部操作期间,使用被映射到该网络ID的数值。该方法将自动检测节点连接到了哪个网络ID,并将自动设置这一网络ID。如果想手动设置网络ID或者实时修改,可以使用SampleContract.setNetwork(network_id)。如果修改网络ID,就要确保provider还指向同一个网络的节点,否则truffle-contract不能用正确的链接、地址和事件映射网络ID。
1703878990
1703878991
6)为SampleContract()生成的交易设置默认数值。该方法用于获取和设置(可选项)交易默认值。如果调用时不指定任何参数,则只返回一个表示当前默认值的对象;如果一个对象被作为参数传送,则将设置新的默认值。
1703878992
1703878993
7)为了创建合约抽象,对StringLib库进行同样的操作。
1703878994
1703878995
2.创建合约实例
1703878996
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
[
上一页 ]
[ :1.703878965e+09 ]
[
下一页 ]