嘿!您似乎在 United States,您想使用我们的 English 网站吗?
Switch to English site
Skip to main content

用树莓派探索以太坊 - 第1部分:入门

Pi_Ethereum1_1fa72be7f086b5bdc06c00c480ed56dd73840657.jpg

在Pi 3B 型上安装并运行以太坊区块链客户端。

区块链现在是一个令人难以置信的热门话题,并且已经有一段时间了,这在很大程度上是因为加密货币 - 主要是比特币 - 似乎为他们的早期采用者在一夜之间产生的财富,以及它们开辟的新的经济可能性。

然而,区块链不仅仅可以用于加密货币,而且正如Greig在其最近发布的文章中指出的那样,其分布式性质和验证交易的防篡改记录能力可用于物联网应用。以太坊平台令人兴奋的是它不仅仅是简单的加密货币和安全交易,还提供分布式计算平台。

在这篇文章中,我们将简要介绍一下以太坊体系结构,并尝试介绍一些主要概念和组件,然后再继续在Raspberry Pi上安装客户端软件。需要说明的是,我们不会挖掘任何加密货币,因为您确实需要一个强大的GPU,但是可以使用Pi创建一个简单的沙箱进行实验 - 这也表明区块链技术确实是可以运行在嵌入式平台。

以太坊101

contract mortal {
    /* Define variable owner of the type address */
    address owner;

    /* This function is executed at initialization and sets the owner of the contract */
    function mortal() { owner = msg.sender; }

    /* Function to recover the funds on the contract */
    function kill() { if (msg.sender == owner) selfdestruct(owner); }
}

contract greeter is mortal {
    /* Define variable greeting of the type string */
    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;
    }
}

以太坊智能合约的示例。资料来源:ethereum.org

区块链是一个分布式记录本,通常通过点对点网络进行管理,并随着记录或区块越来越多,它的大小也会不断增长。区块通常包含有交易数据的时间戳,并通过散列算法加密保护,这样一旦数据被提交,它就不能被修改。

以太坊平台拥有自己的加密货币,称为以太币 ether,但它也进一步构造区块链技术,为智能合约创造分散平台 - 包含代码函数和区块链函数,并能够与其他合同进行交互,作出决定,存储数据,并将以太币发送给其他人。

智能合约通过基于 JavaScript 的 Solidity 语言实现。Solidity编译器用于将智能合约编译为字节码 - 就像使用JavaScript或Python,Java和Android等代码执行 - 然后通过以太坊虚拟机(Ethereum Virtual Machine)执行。在智能合约中执行交易产生一定的成本,这是我们将在未来的文章中介绍到。

以太坊提供了许多不同的客户端应用程序,原始参考实现geth以Go编写。其中一些可以挖掘以太币。另外还有独立的挖掘软件,好像另外还有GUI客户端和分布式应用程序的IDE。

除主要的公共以太坊区块链网络mainnet 之外,还有用于实验性质的测试网络,您也可以创建自己的专用网络。

安装GETH

CP_geth_make1_ff91cce5e5450ced1866d24248b81b1b8326209c.jpg

假设我们已经安装了Raspbian,我们便可以开始更新已安装的软件包到最新版本。

$ sudo apt-get update

$ sudo apt-get dist-upgrade

 我在第一次编译以太坊客户端时用完了内存。为内存密集型任务释放内存的一个好方法就是减少分配给GPU的数量。实际上,如果您不需要图形桌面,请将将系统简单地配置成引导到命令行。

$ sudo raspi-config
  • 3 → Boot
  • B1 → Desktop / CLI
  • B1 → Console
  • 7 → Advanced
  • A3 → Memory Split
  • 16 (MB)
  • Reboot

接下来,如果我们安装相关的安装包。

$ sudo apt-get install git golang libgmp3-dev

之后,如果我们抓取geth的源代码,一个以太坊节点的官方语言实现,编译这些代码并将可执行文件复制到/usr/local/bin/。

$ mkdir src

$ cd src

$ git clone -b release/1.7 https://github.com/ethereum/go-ethereum.git

$ cd go-ethereum

$ make

$ sudo cp build/bin/geth /usr/local/bin/

 

创建帐户并进行测试

CP_geth_account_new_dbe1594a9757b68967faa56511301254750bee1a.jpg

首先,如果我们使用GETH来创建一个新帐户。

$ geth account new

这将生成一组新的加密密钥并使用密码保护私钥。请注意,如果您使用此帐户来挖掘加密货币并进行有意义的交易,您则需要确保备份您的密钥并防止您的私钥被访问。

现在开始启动节点。

CP_geth-firstRun_51a18f5c62808f7a3ca802da072d51d3fbf918aa.jpg

$ geth --syncmode light --cache 64 --maxpeers 12

如果我们在没有任何参数的情况下运行GETH,它会启动一个节点并尝试同步整个公共mainnet区块链。其大小超过50GB并且不断增长,这对嵌入式计算机可能不是一个好主意。所以,我们以轻型同步模式启动节点。这只会随着它们的出现以及区块链的其他部分按需提取区块标题。

要强制节点退出,只需按CTRL-C在启动时将其作为服务运行:

$ sudo vi /etc/systemd/system/geth@.service

(用你最喜欢的文本编辑器替换“vi”)

然后输入:

[Unit]
Description=Ethereum daemon
Requires=network.target

[Service]
Type=simple
User=%I
ExecStart=/usr/local/bin/geth --syncmode light --cache 64 --maxpeers 12
Restart=on-failure

[Install]
WantedBy=multi-user.target

保存文件并将以太坊节点作为“PI”用户运行:

$ sudo systemctl enable geth@pi.service
$ sudo systemctl start geth@pi.service

CP_gethAttach_db7a4f9b6dc9cb9fccef9219297ae92cd262f979.jpg

当我们的以太坊节点作为服务运行时,我们现在可以使用以下方式连接到它:

$ geth attach

这给了我们提供了一个交互式的JavaScript控制台。从这里我们可以调用函数功能,例如:

> eth.accounts

列出当前帐户。

CP_gethAttach_admin-peers_9e4b78b6f051577ac537a4304e648a00fc258694.jpg

或者获取关于连接者的信息:

> admin.peers

请注意,轻量级客户端协议仍处于开发阶段,在某种程度上是试验性应用,并且依靠完整的对等点/节点来支持它。因此,撰写本文时可能未能完整地运行以太坊主网区块链。也就是说,事情正在快速地发展,而这种情况在不太遥远的将来也会很容易发生变化。

接下来

到目前为止,我们刚刚安装了客户端软件,创建了帐户,启动了节点并观察了对等连接。在下一篇文章中,我们将看看实际执行的交易。

Andrew Back

Open source (hardware and software!) advocate, Treasurer and Director of the Free and Open Source Silicon Foundation, organiser of Wuthering Bytes technology festival and founder of the Open Source Hardware User Group.
DesignSpark Electrical Logolinkedin