使用Go语言与Ethereum智能合约进行交互

0pao 7年前
   <p><em>译者注:本文主要介绍使用Go语言与Ethereum智能合约进行交互。以下为译文</em></p>    <p>尽管最近出现了 <a href="/misc/goto?guid=4959751213079556489" rel="nofollow,noindex">麻烦</a> ,但Ethereum仍然是区块链空间中实现智能合约最重要的系统,而且这种情况似乎不太可能很快改变。</p>    <p>在我看来,技术本身具有很大的潜力,从学术的角度来看是非常有趣的,但正如前面提到的问题,之前展示出来了很多问题,区块链技术,智能合约,特别是带有Solidity的Ethereum生态系统是非常不成熟的,而且也没有准备好的黄金时段/生产用例。</p>    <p>然而,这是学习和了解这种技术的一个很好的机会,能够在应用程序奔溃前提前做准备。</p>    <p>在我 <a href="/misc/goto?guid=4959751213172315794" rel="nofollow,noindex">之前的一篇文章</a> 中,我创建了一个小型应用程序,其中包含一个简单的Winner-Takes-All Crowdfunding合约。在这篇文章中,我们将接受这份合约,并且去引用contract.sol这个合约,看看我们是否可以使用Go语言进行部署和交互。</p>    <p>为什么用GO语言?其中一个原因是,GO语言的作用很强大。最广泛使用的Ethereum客户端是用Go语言写的,这意味着有一个很好的生态系统,可以与Ethereum和智能契约进行交互,如从共享库生成可重用的代码。</p>    <p>在这个示例中,我们不会使用真正的区块链作为部署目标,而是使用go - ethereum提供的模拟后端,这样我们就可以安全地进行测试和实验,而不用花任何钱。</p>    <p>智能合约本身很简单(我不会详细介绍绍它的功能或工作原理),只要解释合约中部署了3个参数就够了,3个参数如下:</p>    <ul>     <li>项目最低入会费</li>     <li>提交新项目的最后期限</li>     <li>支持项目的最后期限</li>    </ul>    <p>在第一阶段,项目可以使用名称和网址提交,参数至少包括最低费用。 在第二阶段,可以通过向合作伙伴的发送地址来支持项目。</p>    <p>然而,在这篇文章中,我们将关注:</p>    <ul>     <li>部署合约</li>     <li>从合约中读取数据</li>     <li>与合约(交易)的交互</li>     <li>通过地址实例化已部署的合约</li>    </ul>    <p>我们会用70行代码完成这些。让我们开始吧!</p>    <p>为了能够跟上,你需要一些东西。首先,最重要的是,您需要solc Solidity编译器。</p>    <p>然后,使用go - ethereum并建立它:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/a727f2a50eef2c3bb2ca2200b7763e80.png"></p>    <p>我们可以通过solc和geth devtools,然后从生成合约的go - version开始。我们的智能合同的sol文件:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/53a17d4a8b576941ed6a9f13e7fafa9d.png"></p>    <p>生成的代码看起来像这样。</p>    <p>如您所见,我们有部署和实例化合约的方法,以及所有公共合约方法的映射。</p>    <p>下一步是将合约部署到模拟后端。</p>    <p>为此,需要进行一些设置。 如上所述,为了简单起见,我们将使用SimulatedBackend作为我们的目标块链,在这篇文章的最后,将有一个关于如何使用testnet甚至是真实的Etherey块链接的简短部分。</p>    <p>使用一些go - ethereum的依赖项,我们可以开始设置:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/0aa60eb9ddfb3d012fbf2393d972b3d0.png"></p>    <p>我们只需创建一个密钥,创建一个以太网的Genesis帐户,并启动模拟后端,该后端返回一个bind.ContractBackend。现在我们可以使用生成的DeployWinnerTakesAll方法开始部署合约。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/cdba04f1b74816cd13c0008a486fa774.png"></p>    <p>我们传递的是一个auth对象,它代表我们的身份,参数包括the backend sim和 Minimum Entry Fee,Project Deadline和 Campaign Deadline,这些参数每一项都使用一个bigInt。该方法返回合约将被部署到的地址,以及合约的句柄和一个错误。还会返回一个事务对象,但我们不会在这里处理它。</p>    <p>既然已经部署了合约,我们就应该能够与它交互。例如,我们可以检查我们发送的最后期限是否正确地设置在合约中:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/76b82ed06ea6e3fcae3b1b42d6e92462.png"></p>    <p>但是,如果执行此操作,则返回< nil >。那是因为我们的合约还没有真正开采。如果我们使用真实的网络作为后端,我们就必须等到它发生,但是在我们的模拟后端,我们可以这样做:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/41fd0d9d8938b4676cd37c1adde9563f.png"></p>    <p>我们回到我们部署的日期:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/bbadc022726611c5b96059f506f702df.png"></p>    <p>好了。这样我们就可以阅读合约公开的数据。现在我们想要和它互动。</p>    <p>在这种情况下,最简单的方法是,通过发送一个项目的名称和url来提议一个新项目,该项目至少具有最低的输入费用:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/d7c55d8cb68cee7b70154c64267b024b.png"></p>    <p>当然,我们需要再次开采:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/1f20a3f096ac54934722af14ca8cccb1.png"></p>    <p>但是我们得到以下输出:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/eac029a603cafcd4d999a363d64e58c2.png"></p>    <p>太棒了——这意味着我们的项目被创建了。这样我们就可以部署、读和写合约。</p>    <p>但如果合约已经部署了,我们只是想和它互动呢?幸运的是,所生成的代码包括一个NewWinnerTakesAll方法,它仅使用部署的契约的地址,让我们实例化合约:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/2d06ec058edd3a26f3143ff16db1093d.png"></p>    <p>我们得到与我们部署的合约相同的返回值,并可以以与此版本相同的方式进行交互,这个版本是通过地址实例化实现的。</p>    <p>我们已经完成了所有的步骤,我们需要有意义地与一个合约进行交互,但只需要在模拟的后端。为了使用testnet或real Ethereum区块链,我们只需要适应以下几件事:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/f3547ee07851e448d72d3b41d5140b1f.png"></p>    <p>这将产生我们在上面创建的auth对象。当然,请不要在代码中使用明文或密码,而是以安全的方式加载它们。</p>    <p>如果已经部署了合约,我们不需要创建NewIPCClient,但是可以直接拨号到节点:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/4fe7882c9eccde5c9ed12987af39f011.png"></p>    <p>你可以在 <a href="/misc/goto?guid=4959751213253884260" rel="nofollow,noindex">这里</a> 找到代码和完整的例子。</p>    <h2><strong>总结</strong></h2>    <p>正如我在这篇文章的开头所说的,在我看来,要依赖可靠的智能合同来处理应用程序奔溃还为时过早,但这和其他一些基于区块的智能合同的方法的潜力是巨大的,因此了解它周围的技术当然是值得的。</p>    <p>Go语言适合于与基于ethereumbased的智能合约交互的任务,因为有很多来自geth的可重用代码,甚至还有一些关于如何开始的文档。这当然可以用其他语言来实现。(使用web3),但如果你喜欢的话,这似乎是一个可靠的选择。</p>    <p> </p>    <p>来自:http://www.iteye.com/news/32581</p>    <p> </p>