2018 年 07 月 14 日,秘猿科技区块链工程师蒋金洋在“开发者的以太坊入门指南”中,进行的《如何实现一个简单的以太坊》演讲分享。“IT 大咖说”作为独家视频合作方,经主办方和讲者审阅授权发布。
以太坊是社区驱动的项目,并且一直在更新,以太坊基金会一直鼓励多种实现以避免网络故障。那么如何去实现一个以太坊?本次分享介绍如何去了解以太坊规范,以及实现以太坊的主要组件和功能。
为什么要学习以太坊
对于 The DAO 项目相信很多人听说过,该项目使用智能合约完成了 DAO(去中心化的自治组织)功能,参与项目的人员可以用私钥给项目转一笔资金以获得相应的投票权,然后使用投票权表决这笔资金的用处。虽然项目最后因为智能合约的漏洞而挂掉了,但是这种用法相对最原始的区块链应用要跨出一大步。
去中心化交易所是区块链的另一个应用场景,它的本质是用智能合约来保证安全性。虽然在资产的交易过程中会有一部分中心化服务用来匹配交易的过程,但是资金永远是由私钥通过以太坊网路和智能合约来控制的。
从这两个案例可以看出智能合约和以太坊的 web3.0 概念的确有值得称道的地方,它们在保证资金和机制公开透明同时,也给予了使用者更多的权利。而这些在中心化服务里很难实现,或者说是一种奢望。
如何学习区块链
以此为契机我萌生了投入到区块链领域的想法,并开始寻找与区块链相关的公司加入他们。秘猿科技是我首先想到的公司,这家公司令我映像最深的是他们主要产品都在 GitHub上,包括区块链产品、钱包、区块链浏览器都可以找到,而且许可证非常开放。不过由于之前并没有区块链方面的知识积累,所以最终我是以 Web 开发的身份加入的,并在试用期间开始学习区块链相关的技术。
“撸链”是我认为比较有效的学习方法,公司内部也有很多通过“撸链”从 web 开发转到区块链开发的人员。简单来说“撸链”其实就是自己去实现一条区块链。对于我来说既然要做区块链,当然是选择第二代的以太坊作为实践目标。
“撸链”的难点在于要耗费大量的时间和精力,最终可能还做不出来。收益也很明显,一条区块链的完整实现过程,无疑会大大提高个人在此领域的开发能力。
最终成果
上图是我花了 3 个月的时间从头到尾实现以太坊的最终成果。在实践的过程中,我刚开始看的是以太坊的 wiki,其中包含所有关于以太坊的相关资料。
不过要想实现以太坊的核心,还需要去看一本黄皮书,此书由以太坊的技术合伙人所写,书中形式化的证明了以太坊核心的 EVM 部分,并含有大量的公式,学习起来相当困难。
然而这还不最难的,更难的地方在于以太坊是一个正在开发的项目,所以没有固定的规范,很多情况下都需要去调试已有的客户端才能理解当前的实践的含义。当做到这一步的时候,我会发现虽然剩下要做的东西还有很多,但是难度却陡然下跌,大部分只要花费时间就能够实现,不再像之前那样无从下手。
以太坊测试
Ethereum Tests 是需要开发者重点关注的项目,因为这是唯一能够追踪以太坊规则变动的项目。它提供了大批的单元测试用来测试以太坊的实现,只有通过了这个测试才可以算是实现了以太坊的规范协议。
Test 中频繁更新的目录并不多,大概只有 3、4 个,不过里面集中了大概几千条测试。其中 BlockchainTests 主要是一些关于以太坊块的验证和 fork 规则,PoWTestsfuz 负责验证共识算法是否符合规定,RLPTests 是以太坊的编码库测试。
测试过程
测试的时候首先给我们一个 json 格式的文件(如上图),保存有一些初始化的值,包括钱包和链的地址,balance
是二进制化的钱包余额,code
为空表示这个地址是一个钱包而非合约,storage
表示合约中存储的数据,之后我们将自己的初始数据相应的填入其中。
第二步会提供给我们一些输入,比如对于 BlockchainTests,就会提供很多块数据,我们要将这些输入到我们的实践中。按照以太坊的规范,此时会执行块的内容,执行完之后最初的 json 文件会发生变化,之后要做的是检验变化后的状态是否和测试中的状态一致。
如何了解以太坊的规范
就拿 DevP2P 组件为例,它是以太坊的底层网络组件,以一种 P2P 的方式使节点之间互相连接,给上层应用提供随意通信的能力。
DevP2P 的规范大概可以从 wiki、黄皮书、EIP 等 3 个地方获取到。wiki 是以太坊所有资料的入门,不过这里面的资料可能不会太过详细,对 DevP2P 的描述也仅限于告诉你它是什么,没有具体的实现方法。
黄皮书主要是写的是 EVM 的规范,类似 DevP2P 的网络部分并没有涉及。EIP 是社区驱动的以太坊改进提案,社区成员可以通过提交 EIP 来向以太坊官方展示自己的提升方案,如果官方认可该议案,会给它分配一个 EIP 编号,然后让社区成员一起来参与讨论,最后再去各客户端实现。可以说以太坊中的大部分规范都在这里,很遗憾的是 DevP2P 在 EIP 中提到的也不多。
在以上方式都行不通的情况下,我们只能去查看官方客户端的代码进行调试,如上图在官方代码中插入一些 print 语句。这也是我所用的方法,将 geth 收到的数据一段段的打印出来和本地的处理代码进行对比。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/254306.html