二维码

8.3 开始使用truffle-contract - 数据结构 - 机器学习

1067 人阅读 | 时间:2021年01月15日 01:11
8.3 开始使用truffle-contract - 数据结构 - 机器学习 #daohang ul li t,.reed .riqi,a.shangg,a.xiatt,a.shangg:hover,a.xiatt:hover,a.shang,a.xiat,a.shang:hover,a.xiat:hover,.reed-pinglun-anniu,span.now-page,#daohangs-around,#caidan-tubiao,#daohangs,#daohangs li,#btnPost{background-color:#D10B04;} .dinglanyou1 h3{border-bottom:3px solid #D10B04;} #dibuer{border-top:2px solid #D10B04;}.cebianlan .rongqi h3{border-bottom:1px solid #D10B04;} #edtSearch{border:1px solid #D10B04;} #daohang .zuo ul li{border-right:1px solid #;} #daohang ul li t a{border-top:1px solid #;border-right:1px solid #D10B04;} #daohang ul li t a:hover{border-right:1px solid #;} #daohang .you ul li a:hover,#daohang .zuo ul li a:hover,.reed-pinglun-anniu:hover{background-color:#;} a:hover,.reed h6 a:hover,#dibuer a:hover,.reed .riqiding,.cebianlan .rongqi li a:hover,#pinglun-liebiao ul.fubens li.depth-1 dl dd span.shu a,#pinglun-liebiao ul.fubens li.depth-1 dl dd span.huifuliuyan a:hover,.reed-biaoti h6 span{color:#D10B04;} .reed .kan a{color:#0A0AF5;}.reed .kan a:hover{color:#D10101;} @media screen and (max-width:1492px){a.shang,a.xiat{background:none;} a.xiat:hover,a.shang:hover{background-color:#f9f9f9;background-image:none;text-decoration:none;}} var _hmt = _hmt || [];(function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?b19db5ba3b437a9e8698d2bc8fc64334"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s);})(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?b19db5ba3b437a9e8698d2bc8fc64334"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?2d748c9763cfc72fb7d1ccab29f0770d"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?f6d451f3f1be23f3abf240c64c469c1b"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();

当前位置:首页 » 区块链精品文章 » 正文

(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646201", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646162", container: s }); })();

8.3 开始使用truffle-contract

2021 人参与  2018年09月15日 10:22  分类 : 区块链精品文章  评论

在学习truffle之前,学习truffle-contract很重要,因为truffle-contract与truffle密切相关。Truffle测试、truffle中与合约交互的代码、部署代码等都是使用truffle-contract编写的。

truffle-contract API是一个JavaScript和Node.js库,它使以太坊智能合约的处理变得容易。到目前为止,我们已经使用了web3.js部署和调用智能合约 函数,这没问题,但是truffle-contract的目标是更容易操作以太坊智能合约。下面是truffle-contract的一些功能,这些功能 使truffle-contract在处理智能合约时优于web3.js:

·同步交易,优化了控制流(交易在直到确定被挖出之前都不会停止)。

·基于约定的API。再没有“回调地狱”。在ES6和async/await上都可以用。

·默认交易数值,例如from address或者gas。

·返回每个同步的日志、交易收据和交易哈希。

在学习truffle-contract之前,需要知道它不允许使用存储以太坊节点之外的账户签署交易,也就是说,它 没有类似于sendRawTransaction的东西。truffle-contract API假设DApp中的每个用户各自运行以太坊节点,且其账户都存储在那个节点中。事实上,DApp应该这样运行,因为如果DApp的每个客户端开始让用 户创建和管理账户,那么用户管理这么多账户就成了问题。开发人员为他们创建的每个客户端每次都要开发一个钱包manager也是很痛苦的。现在的问题是客 户端怎样才能知道用户在哪里以及用什么格式存储了账户。所以从概率角度出发,优选假设用户将账户存储在个人节点上,而且为了管理账户,它们使用以太坊钱包 应用的东西。因为以太坊节点中存储的账户由以太坊节点自身签名,所以就不再需要sendRawTransaction了。每个用户需要有各自的节点,而不 能分享节点,因为解锁一个账户时,对使用它的所有人都是开放的,这将使用户能盗窃其他人的以太币和用他人的账户进行交易。

如果所使用的App要求用户包含自己的节点,并在该节点中管理账户,那就需要确保只有本地应用才能对该节点进行JSON-RPC调用,而不能让所有人都能调用。还要确保用户不会长期解锁账户,只要不需要账户,就应当立即锁定。

如果应用要求有创建和签署原始交易功能,则可以使用truffle-contract开发和测试智能合约。在应用中可以与合约交互,就像我们之前做的。

8.3.1 安装和导入truffle-contract

在写本书时,truffle-contract API的最新版本是1.1.10。在导入truffle-contract之前,需要先导入web3.js,因为需要创建一个提供方处理truffle- contract API,这样truffle-contract将内部使用该提供方进行JSON-RPC调用。

在Node.js app中安装truffle-contract,只需在app目录中运行如下代码:

8.3 开始使用truffle-contract - 数据结构 - 机器学习

然后使用如下代码导入:

8.3 开始使用truffle-contract - 数据结构 - 机器学习

在浏览器中使用truffle-contract时,会在https://github.com/trufflesuite/truffle-contract 仓库发现dist目录中的浏览器分配。

在HTML中,可以使用如下命令将它存入队列:

8.3 开始使用truffle-contract - 数据结构 - 机器学习

这样将会有一个可用的TruffleContract全局变量。


8.3.2 建立测试环境

在开始学习truffle-contract API之前,需要建立测试环境,这将有助于我们在学习的同时测试代码。

首先,运行testrpc--networkId 10命令,即运行代表network ID 10的ethereumjs-testrpc节点。出于开发目的,我们随机选取了network ID 10,但是用户可以随意选择任何其他网络ID。只需要确保不是1,因为主网总是用于真实的App,而不是用于开发和测试。

然后创建一个HTML文件,放入如下代码:

8.3 开始使用truffle-contract - 数据结构 - 机器学习

下载web3.min.js和truffle-contract.min.js。truffle-contract浏览器在https://github.com/trufflesuite/truffle-contract/tree/master/dist 创建内容。

8.3.3 truffle-contract API

现在来看truffle-contract API。基本上,truffle-contract有两个API,即合约抽象API和合约实例API。合约抽象API代表关于合约(或者库)的多种信息, 例如ABI、未接入的字节码、在多个以太坊网络中的地址(如果合约已部署)、对于多个以太坊网络它所依赖的库地址(如果已部署)和合约事件。抽象API是 对所有合约抽象都存在的一系列函数。合约实例代表一个特定网络中的已部署合约。实例API是对合约实例可用的API。它是以Solidity源文件中的可 用函数为基础动态创建的。特定合约的合约实例是从代表同一合约的合约抽象中创建的。

1.合约抽象API

合约抽象API是truffle-contract与web3.js的不同之处。其特点如下:

·它将根据连接的网络自动抓取默认数值,例如库地址、合约地址等,因此用户不需要每次换网络时修改源代码。

·可以选择只在特定网络中监听特定事件。

·把库实时接入合约的字节码变得容易。在学习了如何使用API之后,用户会发现其他优点。

在学习如何创建合约抽象及其方法之前,先写一个样本合约(代表合约抽象)。示例样本合约的代码如下:

8.3 开始使用truffle-contract - 数据结构 - 机器学习

该合约使用StringLib库把uint转换成bytes32,把bytes32转换成uint。String-Lib在主网络上的 0xcca8353a18e7ab7b3d094ee1f9ddc91bdf2ca6a4地址可用,但是在其他网络上,我们需要部署它以测试合约。在进行 下一步操作之前,使用Browser Solidity编译它,因为将需要ABI和字节码。

上述代码的执行过程如下:

1)创建一个provider。truffle-contract使用这个provider与节点通信。

2)为样本合约创建合约抽象。使用Truffle-contract函数创建合约抽象。该函数有一个对象,其中包含关 于合约的多种信息。该对象可以被称为artifacts对象。abi和unlinked_binary属性是必选项,其他属性是可选项。abi属性指向合 约的ABI,而unlinked_binary属性指向合约的未链接的二进制代码。

3)network属性表示不同网络中的合约涉及的各种信息。这里,在network ID 1中,StringLib相关程序被部署在0xcca8353a18e7ab7b3d094ee1f9ddc91bdf2ca6a4地址,所以在网络1部 署样本合约时,它会自动连接。在networks对象下面还可以设置address属性,表示该合约已经被部署到这个网络,这就是合约地址。在 networks对象中还有一个events对象,用于指明想获取的合约事件。events对象的key是事件主题,value是事件的ABI。

4)通过传送一个新的provider实例调用SampleContract对象的setProvider方法。这是 一种传送provider的方式,这样truffle-contract就能与该节点通信。truffle-contract API无法在全局设置provider,反而需要为每个合约抽象设置一个provider。该功能允许用户轻松接入多个网络并在其中工作。

5)调用SampleContract对象的detectNetwork方法。这是设置合约抽象当前代表的网络ID的 一种方式。也就是说,在对合约抽象进行全部操作期间,使用被映射到该网络ID的数值。该方法将自动检测节点连接到了哪个网络ID,并将自动设置这一网络 ID。如果想手动设置网络ID或者实时修改,可以使用SampleContract.setNetwork(network_id)。如果修改网络ID, 就要确保provider还指向同一个网络的节点,否则truffle-contract不能用正确的链接、地址和事件映射网络ID。

6)为SampleContract()生成的交易设置默认数值。该方法用于获取和设置(可选项)交易默认值。如果调用时不指定任何参数,则只返回一个表示当前默认值的对象;如果一个对象被作为参数传送,则将设置新的默认值。

7)为了创建合约抽象,对StringLib库进行同样的操作。

2.创建合约实例

合约实例代表在特定网络中已部署的合约。要使用合约抽象实例,我们需要创建一个合约实例。创建合约实例的方法有如下3种:

·SampleContract.new([arg1,arg2,...],[tx params])。该函数使用合约要求的任何constructor参数,并部署一个新的合约实例到合约抽象要用到的网络。最后一个实参是可选的,可以用 它传送包括来自地址的交易、gas上限和gas价格在内的交易参数。该函数返回一个承诺,在挖出交易时,该承诺归结为新部署的地址上合约抽象的一个新实 例。该方法不会对合约抽象代表的artifacts对象进行任何修改。在使用该方法前,确保它可以为要用到的网络发现字节码所依赖的库地址。

·SampleContract.at(address)。该函数用于创建合约抽象的一个新实例——代表传入的地址上 的合约。它返回一个“thenable(则可能)”对象(对于反向兼容性来说还不是一个实际的承诺)。确保代码存在于所要用到的网络中的特定地址之后,该 函数将解析一个合约抽象实例。

·SampleContract.deployed()。该函数和at()类似,但地址是从artifacts对象中检索的。像at()一样,deployed()是合理的。在确保代码存在于所要用到的网络中的特定地址之后,该函数将解析一个代表已部署的合约的合约实例。

下面部署合约并获取样本合约的实例。在network ID 10中,需要首先使用new()部署StringLib库,然后把StringLib库的已部署地址添加到StringLib抽象,再把 StringLib抽象接入SampleContract抽象,最后使用new()部署样本合约以获取样本合约的一个实例。但是在network ID 1中,只需要部署SampleContract并获取其实例,因为已经在那里部署了StringLib。全部相关代码如下:

上述代码的执行过程如下:

8.3 开始使用truffle-contract - 数据结构 - 机器学习

1)检测网络ID。如果网络ID是10,则部署合约和库;如果网络ID是1,则只部署合约。

2)在network ID 10中,部署StringLib合约并获取其合约实例。

3)更新StringLib抽象,这样就知道了它所代表的当前网络的合约地址。更新抽象的界面类似于直接更新artifacts对象。如果连接到network ID 1,则将重写已经设置好的StringLib地址。

4)把已部署的StringLib接入SampleContract抽象。接入会更新链接,并把库里的事件复制到SampleContract抽象的当前网络。库可以被多次接入,并将重写它们之前的链接。

5)部署SampleContract到当前网络。

6)更新SampleContract抽象,以便在当前网络中存储合约地址,这样以后可以使用deployed()来获取实例。

7)在network ID 1中,只部署SampleContract即可。

8)这时可以修改节点连接的网络并重启应用,应用将相应做出修改。例如,在开发人员的机器上,应用将连接到开发网络; 在生产服务端上,应用将连接到主网络。显然,用户可能不希望每次运行前面的文件都部署合约,所以实际上,只要合约被部署了,就可以更新artifacts 对象,而且可以在代码中检查是否已经部署了合约。如果没有部署,只有这时部署它。在合约部署完成后,用户可以在数据库或者文件中存储artifacts对 象并编写代码自动更新(而非手动更新)。

3.合约实例API

源Solidity合约不同,每个合约实例也是不同的,且API是动态创建的。下面是合约实例的不同API:

·allEvents。这是一个合约实例函数,在当前网络ID下,当合约artifacts对象中匹配事件签名的合约 引发一个事件时,就激活这个回调函数。用户还可以用eventname-specific函数抓取特定事件,而非所有事件。在前面的合约中,要抓取 ping事件,可以使用SampleContract_Instance.ping(function(e,r){})。

·send。该函数用于向合约发送以太币。它有两个实参:第一个实参是要转账的wei数量;第二个实参是可选项对象,该对象用于设置交易的from,即发送以太币的地址。该调用返回一个承诺,且该承诺在挖出交易时解析交易细节。

·可以使用SampleContract.functionName()或者 SampleContract.functionName.call()调用合约的任何方法。前者发送交易,后者则只调用EVM上的方法,且修改并不持 续。两种方法都返回一个承诺。在第一种情况下,承诺解析交易结果,也就是说,一个对象包含交易哈希、日志和交易收据。在第二种情况下,承诺解析方法调用的 返回值。两种方法都有函数实参,且最后一个实参为可选项,它是一个设置交易的from、gas和value等的对象。


来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=541

(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();
window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdPic":"","bdStyle":"0","bdSize":"16"},"share":{},"image":{"viewList":["qzone","tsina","tqq","renren","weixin"],"viewText":"分享到:","viewSize":"16"},"selectShare":{"bdContainerClass":null,"bdSelectMiniList":["qzone","tsina","tqq","renren","weixin"]}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];
区块链是什么  

微信号:qq444848023    QQ号:444848023

加入【我是码农】QQ群:864689844(加群验证:我是码农)

<< 上一篇 下一篇 >>
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646186", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646175", container: s }); })();
搜索

网站分类

标签列表

最近发表

    (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https'){ bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else{ bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();

全站首页 | 数据结构 | 区块链| 大数据 | 机器学习 | 物联网和云计算 | 面试笔试

var cnzz_protocol = (("https:" == document.location.protocol) ? "https://" : "http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1276413723'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s23.cnzz.com/z_stat.php%3Fid%3D1276413723%26show%3Dpic1' type='text/javascript'%3E%3C/script%3E"));本站资源大部分来自互联网,版权归原作者所有!

jQuery(document).ready(function($){ /* prepend menu icon */ $('#daohangs-around').prepend('
'); /* toggle nav */ $("#caidan-tubiao").on("click", function(){ $("#daohangs").slideToggle(); $(this).toggleClass("active"); }); });

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

©著作权归作者所有:来自ZhiKuGroup博客作者没文化的原创作品,如需转载,请注明出处,否则将追究法律责任 来源:ZhiKuGroup博客,欢迎分享。

评论专区
  • 昵 称必填
  • 邮 箱选填
  • 网 址选填
◎已有 0 人评论
搜索
作者介绍
30天热门
×
×
关闭广告
关闭广告
本站会员尊享VIP特权,现在就加入我们吧!登录注册×
»
会员登录
新用户注册
×
会员注册
已有账号登录
×