尽管最近遇到了些麻烦,但以太坊仍然是区块链领域内智能合约的最大参与者,这似乎不会很快改变。
在我看来,技术本身具有很大的潜力,是从学术的角度看很有意思,但正如上面提到的问题和之前的许多问题是区块链技术方面的,智能合约,特别是具有Solidity的以太坊生态系统还是不太成熟的,并没有为prime-time和生产用例做好准备。
然而,这是一个学习和了解这项技术的好时机,并且当它达到严格应用程序的可接受成熟度前,需要做好准备。
在我之前关于Solidity的帖子中,我创建了一个带有简单的Winner-Takes-All Crowdfunding合约的小应用程序。在这篇文章中,我们将用到其中的contract.sol,看看我们是否可以使用Go部署它并与之交互。
为什么是go?好问题,go语言是令人惊讶的而且使用最广泛的以太坊客户端使用go写的,这意味着有一个很好的生态系统使用已经转为具有很好的功能,如代码生成和可重复使用的助手和智能合约互动的共享库。
在这个例子中,我们将不使用真实的区块链作为部署目标,而是使用由go-ethereum,所以我们可以安全地测试并没有花费任何金钱实验提供的SimulatedBackend。
智能合约本身非常简单:我不会详细介绍它的功能或工作方式,因为已经涵盖了这一点。可以说,合约部署有3个参数:
- 项目的最低入场费。
- 提交新项目的截止日期。
- 支持项目的截止日期。
然后,在第一阶段,可以使用名称和网址提交项目,其中至少包含交易的最低费用。在第二阶段,可以通过将以太发送到合约中的地址来支持项目。
但是,在这篇文章中,我们将重点关注:
- 部署合约
- 从合约中读取数据
- 与合约互动(交易)
- 通过地址实例化已部署的合约
我们将在Go和70行代码中完成所有操作。让我们开始吧!
代码示例
为了能够跟踪,你需要一些东西。首先也是最重要的是,你需要solc Solidity编译器。
然后,只需获取go-ethereum并构建它:
go get github.com/ethereum/go-ethereum
cd $GOPATH/src/github.com/ethereum/go-ethereum/
make
make devtools
好吧,使用solc和geth devtools,我们可以从生成contract.sol文件的Go版本开始,该文件包含我们的智能合约:
abigen --sol=Contract.sol --pkg=main --out=contract.go
生成的代码看这里。
如你所见,我们有部署和实例化合约的方法,以及所有公共合约方法到Go的映射。
下一步是将合约部署到模拟后端。
为此,需要进行一些设置。如上所述,为了简单起见,我们将使用SimulatedBackend作为我们的目标区块链,但在本文的最后,将有一个关于如何使用testnet甚至真正的以太坊区块链进行此操作的简短部分。
使用go-ethereum的一些依赖关系,我们可以开始设置:
import(
"fmt"
"log"
"math/big"
"time"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/accounts/abi/bind/