在本系列文章的第一部分中,我们将在一台树莓派Pi 3 Model B上安装并运行一个以太坊区块链客户端。
毫无疑问,区块链绝对是当前的热点。之所以会这样,很大程度上是因为比特币以及其他加密货币让很多人一夜暴富。但是,区块链的应用并不仅限于加密货币领域,考虑到其去中心化以及防篡改等特性,区块链技术还可以用到IoT应用中。因此,除了加密货币和安全交易之外,以太坊平台还可以提供一种分布式的计算平台。
在这篇文章中,我们将会对以太坊架构进行分析,并了解其核心思想和功能组件,最后在树莓派上安装相应的客户端软件。需要声明的是,我并不打算用它来挖矿,因为挖矿需要强大的GPU支持,但树莓派只能创建一个简单的实验沙箱,而且我们也只是为了验证区块链技术可以应用到嵌入式平台上。
以太坊101
话不多说,下面给出的是一份以太坊智能合约样本的源代码(来自ethereum.org):
contract mortal {
/* Define variable owner of the typeaddress */
address owner;
/* This function is executed atinitialization and sets the owner of the contract */
function mortal() { owner = msg.sender; }
/* Function to recover the funds on thecontract */
function kill() { if (msg.sender == owner)selfdestruct(owner); }
}
contract greeter is mortal {
/* Define variable greeting of the typestring */
string greeting;
/* This runs when the contract is executed*/
function greeter(string _greeting) public {
greeting = _greeting;
}
/* Main function */
function greet() constant returns (string){
return greeting;
}
}
区块链是一种分布式的记账系统,一般通过对等网络进行管理,并且随着记录和区块成功添加到区块链网络中,其大小也会不断增长。一个区块通常包含交易数据以及时间戳,并且会通过哈希算法进行安全加密,数据一旦成功提交到区块链中,将无法再被修改。
以太坊平台拥有自己的加密货币,我们称之为以太币。但是它还基于区块链技术创建了一种针对智能合约的去中心化平台,智能合约对象中包含的代码函数可以在区块链中“生存”,并于其他合约进行交互,制定决策,存储数据,或向其他人发送以太币。
智能合约是用一种名叫Solidity(基于JavaScript)的编程语言实现的,Solidity编译器可以将智能合约编译成字节码(跟JavaScript、Python、Java或Android类似),然后通过以太坊虚拟机(EVM)执行。需要注意的是,在智能合约中进行交易是有成本的,这部分内容我们之后会进行讨论。
目前市场上有好几款不同的以太坊客户端(基于Geth,采用Go语言开发),其中的某些能够挖以太币,有些则是单独的挖矿软件。除了主要的以太坊区块链网络和矿池之外,还有很多用于实验和测试的网络,当然了,你也可以创建自己的私有区块链网络。
安装Geth
假设我们现在已经安装好了Raspbian,我们需要将已安装的数据包软件更新至最新版本:
$ sudo apt-get update
$ sudo apt-get dist-upgrade
当我第一次尝试编译以太坊客户端时,出现了内存不足的情况,为了将RAM腾出来给这种内存密集型任务,最好的方法就是减少分配给GPU的内存空间。如果你不需要图形桌面,你可以将系统以命令行界面启动。
$ sudo raspi-config
接下来,安装相应的依赖组件:
$ sudo apt-get install git golang libgmp3-dev
接下来,从GitHub获取Geth的官方源码(采用Go语言实现的官方以太坊源码),对代码进行编译并将可执行程序拷贝到/usr/local/bin/。
$ mkdir src
$ cdsrc
$ gitclone -b release/1.7 https://github.com/ethereum/go-ethereum.git
$ cdgo-ethereum
$ make
$ sudo cp build/bin/geth /usr/local/bin/
创建账号并进行测试
使用Geth创建一个新的账号:
$ geth account new