以太坊搭建去中心化的投票系统(一)开发前准备
原文链接:http://skycoin.top/index.php/archives/18/
1、以太坊介绍
image.png右图,每个客户端(浏览器)与应用实例进行交互。这意味着,在一个理想的去中心化世界中,每个想要跟 dapp(去中心化应用)交互的人,将需要在他们的计算机/手机等等上面运行一个的完整区块链副本(简言之,每个人都运行一个全节点)。这意味着,在能够真正使用一个应用之前,你必须去下载整个区块链。不过我们并非生活在一个理想世界,期待每个人运行一个全节点来使用一个应用是不太现实的。但是去中心化背后的思想,就是不依赖于一个单一/中心化的服务器。所以,社区想出了一些方案(托管区块链的服务器, metamask 等等),通过这些方案,你就不需要花费大量的硬盘和内存下载运行一个完整的区块链副本,同时不损于去中心化。我们将会以后的课程中对这些方式进行评测。
那么,以太坊区块链到底是什么?区块链有 2 个主要组件:
- 数据库:网络中每笔交易都存储在区块链上。当你部署合约时,就是一笔交易。当你为候选者投票时,又是另一笔交易。所有的这些交易都是公开的,每个人都可以看到并进行验证。这个数据永远也无法篡改。为了确保网络中的所有节点都有着同一份数据拷贝,并且没有向数据库中写入任何的无效数据,以太坊使用一个叫做工作量证明的算法来保证网络安全。(http://ethereum.stackexchange.com/questions/14/what-proof-of-work-function-does-ethereum-use)
- 代码:就数据库的层面而言,区块链就是存储交易。那么给候选者投票,检索所有投票的逻辑放在哪儿呢?在以太坊的世界里,你可以通过一个叫 <u style="box-sizing: border-box;">Solidity</u> 的语言编写逻辑/应用代码(也就是合约)。然后用 solidity 编译器将代码编译为以太坊字节码,并将字节码部署到区块链上(也有一些其他的语言可以写合约,不过 solidity 是到目前为止用得最多也是相对更容易的选择)。所以,以太坊不仅仅会存储交易,它还会存储和执行合约代码。
基本上,区块链就是存储数据和代码,并在 EVM(Ethereum Virtual Machine,以太坊虚拟机)中执行代码。为了构建基于 web 的 Dapp,以太坊也有一个非常方便的 JavaScript 库,叫做 web3.js,它可以连接到区块链节点。所以,你可以在一些有名的 js 框架,比如 reactjs,angularjs 等等中直接引入该库构建应用
开发准备
准备一
image.png
- 我们首先安装一个叫做
ganache
的模拟区块链,能够让我们的程序在开发环境中运行。- 写一个合约并部署到
ganache
上。- 然后我们会通过命令行和网页与
ganache
进行交互。
从图中可以看到,与区块链进行通信的方式是通过 RPC(Remote Procedure Call)。web3js 是一个 JavaScript 库,它抽象出了所有的 RPC 调用,以便于你可以通过 JavaScript 与区块链进行交互。另一个好处是,web3js 能够让你使用你最喜欢的 JavaScript 框架构建非常棒的 web 应用。
准备二
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
output
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
如果你用的是基于 rpm 的发行版,就应该用的是 yum
而不是 apt-get
。只要你成功安装了 nodejs
和 npm
,就可以继续项目的下一步了。
正如上一节提到的,我们必须通过 npm
安装 ganache
和 web3 包。我们也需要安装 solc
来编译合约。
如果安装成功,运行命令node_modules/.bin/ganache-cli
,应该能够看到右图所示的输出。
为了便于测试,ganache 默认会创建 10 个账户,每个账户有 100 个以太。如果你还不懂什么是账户,把它想象成存钱的银行账户就可以了(以太(Ether,ETH)就是以太坊生态系统中的 钱/货币)。你需要用这个账户创建交易,发送/接收以太。在本课程的第 2 部分,我们将会详细介绍如何创建一个账户。
你也可以安装 GUI 版本的 ganache 而不是命令行版本,在这里下载 GUI 版本:http://truffleframework.com/ganache/