打字猴:1.703878947e+09
1703878947 区块链项目开发指南 8.3.3 truffle-contract API
1703878948
1703878949 现在来看truffle-contract API。基本上,truffle-contract有两个API,即合约抽象API和合约实例API。合约抽象API代表关于合约(或者库)的多种信息,例如ABI、未接入的字节码、在多个以太坊网络中的地址(如果合约已部署)、对于多个以太坊网络它所依赖的库地址(如果已部署)和合约事件。抽象API是对所有合约抽象都存在的一系列函数。合约实例代表一个特定网络中的已部署合约。实例API是对合约实例可用的API。它是以Solidity源文件中的可用函数为基础动态创建的。特定合约的合约实例是从代表同一合约的合约抽象中创建的。
1703878950
1703878951 1.合约抽象API
1703878952
1703878953 合约抽象API是truffle-contract与web3.js的不同之处。其特点如下:
1703878954
1703878955 ·它将根据连接的网络自动抓取默认数值,例如库地址、合约地址等,因此用户不需要每次换网络时修改源代码。
1703878956
1703878957 ·可以选择只在特定网络中监听特定事件。
1703878958
1703878959 ·把库实时接入合约的字节码变得容易。在学习了如何使用API之后,用户会发现其他优点。
1703878960
1703878961 在学习如何创建合约抽象及其方法之前,先写一个样本合约(代表合约抽象)。示例样本合约的代码如下:
1703878962
1703878963
1703878964
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
[ 上一页 ]  [ :1.703878947e+09 ]  [ 下一页 ]