开发环境搭建

开发以太坊应用,首要的任务就是搭建合适的环境。在 Ubuntu 16.04 的学习环境当中,如果已经成功地安装好了 Python 以及 npm,那么就能够进行项目的下一步操作。利用 npm 来安装 Truffle 和 web3 这两个包,这样就为后续的操作提供了支撑。这样做之后,迈出了以太坊开发的首个步伐,为后续编写智能合约以及应用搭建创造了基础条件。

安装好相关软件后,它对测试有良好支持。Ganache 会默认创建 10 个账户,每个账户配备 100 个以太。这些账户用于后续合约部署及交互测试,能让开发者在模拟真实区块链环境中操作,以便提前发现并解决可能出现的问题。

以太坊区块链作用

以太坊区块链有存储数据和代码的本事,还能在 EVM(以太坊虚拟机)里执行代码。它好似一个大仓库,一方面能够存储信息,另一方面又能让信息“动”起来。凭借这些功能,开发者可以依据它去开发各种去中心化的应用。在这个平台上,数据和代码的运行有保障,能稳定地为应用提供服务。

它具备存储以及执行的特性,在诸多领域都获得了广泛的应用。像在金融领域,能够展开安全的交易,对交易信息予以记录,并且执行交易逻辑,这样一来,每一笔交易都能够被追溯,同时也无法被篡改。在医疗领域,能够存储病人的健康数据,既可以确保数据的安全性,又便于医生获取并对其进行分析。

必要知识储备

进行以太坊的开发时,需要对一些语言和技术具备基本的认知。在构建以太坊的 Dapp 期间,web3.js 库很实用。它如同以太坊的“得力助手”,能使开发者在搭建去中心化应用时更为便捷。拥有它,开发过程会很顺畅,就如同在顺流中行船,能够节省大量的时间和精力。

$ sudo apt-get update
$ curl -sL https://deb.nodesource.com/setup_7.x -o nodesource_setup.sh
$ sudo bash nodesource_setup.sh
$ sudo apt-get install nodejs
$ node --version
v7.4.0
$ npm --version
4.0.5
$ mkdir -p ethereum_voting_dapp/chapter1
$ cd ethereum_voting_dapp/chapter1
$ npm install ganache-cli web3@0.20.1 solc
$ node_modules/.bin/ganache-cli

这个库可以在一些 js 框架里直接被引入,像 react 和 vue 等。这意味着开发者能根据自己的喜好以及项目的需求,挑选恰当的框架并和 web3.js 一起使用。比如使用 react 框架的开发者,能够很好地利用 react 的优势,结合 web3.js 库快速构建出功能强劲的以太坊 Dapp。

Ganache CLI v6.0.3 (ganache-core: 2.0.2)
Available Accounts
==================
(0) 0x5c252a0c0475f9711b56ab160a1999729eccce97
(1) 0x353d310bed379b2d1df3b727645e200997016ba3
(2) 0xa3ddc09b5e49d654a43e161cae3f865261cabd23
(3) 0xa8a188c6d97ec8cf905cc1dd1cd318e887249ec5
(4) 0xc0aa5f8b79db71335dacc7cd116f357d7ecd2798
(5) 0xda695959ff85f0581ca924e549567390a0034058
(6) 0xd4ee63452555a87048dcfe2a039208d113323790
(7) 0xc60c8a7b752d38e35e0359e25a2e0f6692b10d14
(8) 0xba7ec95286334e8634e89760fab8d2ec1226bf42
(9) 0x208e02303fe29be3698732e92ca32b88d80a2d36
Private Keys
==================
(0) a6de9563d3db157ed9926a993559dc177be74a23fd88ff5776ff0505d21fed2b
(1) 17f71d31360fbafbc90cad906723430e9694daed3c24e1e9e186b4e3ccf4d603
(2) ad2b90ce116945c11eaf081f60976d5d1d52f721e659887fcebce5c81ee6ce99
(3) 68e2288df55cbc3a13a2953508c8e0457e1e71cd8ae62f0c78c3a5c929f35430
(4) 9753b05bd606e2ffc65a190420524f2efc8b16edb8489e734a607f589f0b67a8
(5) 6e8e8c468cf75fd4de0406a1a32819036b9fa64163e8be5bb6f7914ac71251cc
(6) c287c82e2040d271b9a4e071190715d40c0b861eb248d5a671874f3ca6d978a9
(7) cec41ef9ccf6cb3007c759bf3fce8ca485239af1092065aa52b703fd04803c9d
(8) c890580206f0bbea67542246d09ab4bef7eeaa22c3448dcb7253ac2414a5362a
(9) eb8841a5ae34ff3f4248586e73fcb274a7f5dd2dc07b352d2c4b71132b3c73f0
HD Wallet
==================
Mnemonic:   cancel better shock lady capable main crunch alcohol derive alarm duck umbrella
Base HD Path: m/44'/60'/0'/0/{account_index}
Listening on localhost:8545

构建投票应用目标

$ brew update
$ brew install nodejs
$ node --version
v7.10.0
$ npm --version
4.2.0
$ mkdir -p ethereum_voting_dapp/chapter1
$ cd ethereum_voting_dapp/chapter1
$ npm install ganache-cli web3@0.20.1 solc
$ node_modules/.bin/ganache-cli

教程会构建一个简单的去中心化投票应用。这个应用能够初始化参与选举的候选者,同时也可以对候选者进行投票。投票的数据会被记录在区块链上。这就好像一个公平公正的选举现场,每一票都有其可以追寻的踪迹,并且不会被篡改。

Ganache CLI v6.0.3 (ganache-core: 2.0.2)
Available Accounts
==================
(0) 0x5c252a0c0475f9711b56ab160a1999729eccce97
(1) 0x353d310bed379b2d1df3b727645e200997016ba3
(2) 0xa3ddc09b5e49d654a43e161cae3f865261cabd23
(3) 0xa8a188c6d97ec8cf905cc1dd1cd318e887249ec5
(4) 0xc0aa5f8b79db71335dacc7cd116f357d7ecd2798
(5) 0xda695959ff85f0581ca924e549567390a0034058
(6) 0xd4ee63452555a87048dcfe2a039208d113323790
(7) 0xc60c8a7b752d38e35e0359e25a2e0f6692b10d14
(8) 0xba7ec95286334e8634e89760fab8d2ec1226bf42
(9) 0x208e02303fe29be3698732e92ca32b88d80a2d36
Private Keys
==================
(0) a6de9563d3db157ed9926a993559dc177be74a23fd88ff5776ff0505d21fed2b
(1) 17f71d31360fbafbc90cad906723430e9694daed3c24e1e9e186b4e3ccf4d603
(2) ad2b90ce116945c11eaf081f60976d5d1d52f721e659887fcebce5c81ee6ce99
(3) 68e2288df55cbc3a13a2953508c8e0457e1e71cd8ae62f0c78c3a5c929f35430
(4) 9753b05bd606e2ffc65a190420524f2efc8b16edb8489e734a607f589f0b67a8
(5) 6e8e8c468cf75fd4de0406a1a32819036b9fa64163e8be5bb6f7914ac71251cc
(6) c287c82e2040d271b9a4e071190715d40c0b861eb248d5a671874f3ca6d978a9
(7) cec41ef9ccf6cb3007c759bf3fce8ca485239af1092065aa52b703fd04803c9d
(8) c890580206f0bbea67542246d09ab4bef7eeaa22c3448dcb7253ac2414a5362a
(9) eb8841a5ae34ff3f4248586e73fcb274a7f5dd2dc07b352d2c4b71132b3c73f0
HD Wallet
==================
Mnemonic:   cancel better shock lady capable main crunch alcohol derive alarm duck umbrella
Base HD Path: m/44'/60'/0'/0/{account_index}
Listening on localhost:8545

开发者构建投票应用时,能够先进行编写投票合约的过程,之后将其部署到区块链上,接着与区块链展开交互。这就好比先制定作战计划,也就是编写合约;接着把计划落实到战场,即部署合约;最后与战场进行实时互动,也就是与合约交互,以此全面把握以太坊的开发流程。

智能合约编写要点

编写第一个以太坊智能合约时,合约部署到区块链上后,会触发构造函数。这个构造函数只会被调用一次。它就像给合约设定了一个起始状态,一旦设定,就难以更改。这种特性保证了合约初始信息的稳定性和不可更改性。

与 web 世界有所不同,区块链上部署的合约是不能被改变的。就算对合约进行更新并且再次部署,旧合约依然会在区块链上留存,同时数据也不会丢失。比如说,对于一个公司的重要业务合约而言,即便之后有了新版本,旧版本的合约以及它里面的数据都能够被留存下来,这样便于进行查询和审计。

合约编译与交互操作

pragma solidity ^0.4.18;
contract Voting {
  mapping (bytes32 => uint8) public votesReceived;
  bytes32[] public candidateList;
  function Voting(bytes32[] candidateNames) public {
    candidateList = candidateNames;
  }
  function totalVotesFor(bytes32 candidate) view public returns (uint8) {
    require(validCandidate(candidate));
    return votesReceived[candidate];
  }
  function voteForCandidate(bytes32 candidate) public {
    require(validCandidate(candidate));
    votesReceived[candidate]  += 1;
  }
  function validCandidate(bytes32 candidate) view public returns (bool) {
    for(uint i = 0; i < candidateList.length; i++) {
      if (candidateList[i] == candidate) {
        return true;
      }
    }
    return false;
   }
}

借助 web3 库能够与区块链进行交互,还能在 node 控制台中利用它来部署合约。首先,在终端执行 node 命令,从而进入控制台。接着,对 web3 对象进行初始化。之后,查询并把所有账户获取到。这些连续的操作就好像打开了一扇通往区块链世界的门,为后续的合约交互打下了基础。

编译合约时,第一步是从.sol 文件中加载代码,第二步是把代码绑定到特定类型的变量上,第三步是进行编译。若编译成功,打印相关对象,就能看到重要字段。理解这些字段,有助于我们更深入地把握合约的结构和功能。这就像拆解机器一样,只有知晓其内部构造和工作原理,才可以更好地使用它。

大家在构建以太坊应用时,是否遇到过极难解决的问题?若有,就点个赞,把这篇文章分享出去,接着在评论区交流你们的经验!