在本教程的第一篇文章中,我们介绍了如何搭建简单的投票 dapp,并将其部署在本地机器的测试环境中。在第二篇文章中,我们将这个 dapp 迁移到 truffle 框架上,并将其部署到公开测试网络 Ropsten 上,然后分别通过 truffle 控制台和网页与其交互。接下来我们要再添加一些新功能,以便学习几个新概念。下面是本文要介绍的内容:
学习如何用新的数据类型,比如
struct
,在区块链上组织和存储数据。学习代币(token)的概念及其用法。
学习如何使用以太币,即以太坊区块链平台上的货币,进行支付。
本文所涉及的代码全部放在代码库 https://github.com/maheshmurthy/ethereum_voting_dapp 的 chapter3 目录下。
通常在选举时,每位选民可以投一票给自己喜欢的候选人。然而在选举公司的董事会主席时,是根据股东所持有的股份来计算票数的。也就是说股东持有的股数越多,可以投的票数也越多。
接下来我们要让这个投票 dapp 支持这种选举。因此要添加购买公司股份的功能,然后根据自己所持有的股数投票给候选人。另外还要添加一个功能,查看投票者的信息。在以太坊区块链上,这些股份一般被称作代币,因此后面我们也用代币这种叫法。
如果你想直接去看看合约文件,可以访问:https://github.com/maheshmurthy/ethereum_voting_dapp/blob/master/chapter3/contracts/Voting.sol。
第一步是声明变量,我们要用这些变量存放所有我们感兴趣的信息。下面就是合约中的变量及其含义。
在前两篇文章中,我们在构造器中初始化了一个包含候选人的列表。可构造器只有在合约部署到区块链上时才会运行一次。我们在这里也要初始化可销售的代币总数和每个代币的价值。所以构造器需要调整一下:
在 truffle 中,是用迁移将代码将合约部署到区块链上。你可以看一下这里的迁移文件。truffle 迁移文件中的部署代码看起来是这样的:
在初始化好代币及其价格之后,我们来看看如何用以太币购买这些代币。下面这个是购买代币的函数。
调用这个购买函数的示例如下所示:
在函数buy()
中,可以用msg.value
访问参数 value: web3.toWei(‘1’, ‘ether’)
,而msg.sender
会给我们web3.eth.accounts[1]
的账号地址。也就是说按照上面的代码,假如每个代币的价格是 0.1 以太币,则web3.eth.accounts[1]
将会收到 1 /0.1 = 10 个代币。
我们先把代码放一放,看一下这幅图,看看账户(投票者)和合约之间是如何交互的。
正如github上的合约文件所示,其他新方法大多是取值方法,应该很容易看懂。
index.html文件也有些更新:
要投票给候选人,必须设定投票用的代币数。
还多了一个购买代币的区域。
现在你可以查看投票者的信息,他们持有多少代币以及用多少代币给每个候选人投票。
候选人不再是硬编码在文件中的了,而是从区块链中读取出来的。
app.js文件中也有变化,以实现 UI 中的新增功能。
更新部署文件 2_deploy_contracts.js,传入代币总数,代币价格以及候选人的名字。
所以这里总共更新了四个文件,分别是 Voting.sol、index.html、app.js 和 2_deploy_contracts.js。 所以只要你更新了这四个文件,就可以将合约部署到区块链上了。部署过程跟我们之前介绍的一样。
只需要用 truffle 命令就可以完成编译和迁移。
maheshmurthy|~/dev/ethereum_voting_dapp/chapter3$ truffle migrate
Using network ‘development’.
Compiling Migrations.sol…
Compiling Voting.sol…
Writing artifacts to ./build/contracts
Running migration: 1_initial_migration.js
Deploying Migrations…
Migrations: 0xc9249947010675b8a3b1defb12334148f7f59010
Saving successful migration to network…
Saving artifacts…
Running migration: 2_deploy_contracts.js
Deploying Voting…
Voting: 0x795d6d1f7cf467f27e48181da5f1ebd5bbd0a8df
Saving successful migration to network…
Saving artifacts…
在合约部署成功后,启动 web 服务器,你就能看到如下所示的页面:
正如你在上面的界面中看到的那样,你可以购买代币,用代币投票给候选人,通过地址查看投票者的信息。如果这些功能都没问题,恭喜你!
我希望你能通过这个教程认识到什么是以太坊,它能做什么,以及如何搭建去中心化应用。
评论 1 条评论