玩转区块链:如何实现一个简单的以太坊

内容来源:2018 年 07 月 14 日,秘猿科技区块链工程师蒋金洋在“开发者的以太坊入门指南”中,进行的《如何实现一个简单的以太坊》演讲分享。IT 大咖说(微信id:itdakashuo)作为独家视频合作方,经主办方和讲者审阅授权发布。

阅读字数:2599 | 7分钟阅读

摘要

以太坊是社区驱动的项目,并且一直在更新,以太坊基金会一直鼓励多种实现以避免网络故障。那么如何去实现一个以太坊?本次分享介绍如何去了解以太坊规范,以及实现以太坊的主要组件和功能。

获取嘉宾演讲视频及PPT,扫一扫下方二维码即可。

为什么要学习以太坊

对于The DAO项目相信很多人听说过,该项目使用智能合约完成了DAO(去中心化的自治组织)功能,。参与项目的人员可以用私钥给项目转一笔资金以获得相应的投票权,然后使用投票权表决这笔资金的用处。虽然项目最后因为智能合约的漏洞而挂掉了,但是这种用法相对最原始的区块链应用要跨出一大步。

去中心化交易所是区块链的另一个应用场景,它的本质是用智能合约来保证安全性。虽然在资产的交易过程中会有一部分中心化服务用来匹配交易的过程,但是资金永远是由私钥通过以太坊网路和智能合约来控制的。

从这两个案例可以看出智能合约和以太坊的web3.0概念的确有值得称道的地方,他们在保证资金和机制公开透明同时,也给予了使用者更多的权利。而这些在中心化服务里很难实现,或者说是一种奢望。

如何学习区块链

以此为契机我萌生了投入到区块链领域的想法,并开始寻找与区块链相关的公司加入他们。秘猿科技是我首先想到的公司,这家公司令我映像最深的是他们主要产品都在github上,包括区块链产品、钱包、区块链浏览器都可以找到,而且license非常开放。不过由于之前并没有区块链方面的知识积累,所以最终我是以web开发的身份加入的,并在试用期间开始学习blockchain相关的技术。

“撸链”是我认为比较有效的学习方法,公司内部也有很多通过“撸链”从web开发转到区块链开发的人员。简单来说“撸链”其实就是自己去实现一条区块链。对于我来说既然要做区块链,当然是选择第二代的以太坊作为实践目标。

“撸链”的难点在于要耗费大量的时间和精力,最终可能还做不出来。收益也很明显,一条区块链的完整实现过程,无疑会大大提高个人在此领域的开发能力。

最终成果

上图是我花了3个月的时间从头到尾实现以太坊的最终成果。在实践的过程中,我刚开始看的是以太坊的wiki,其中包含所有关于以太坊的相关资料。

不过要想实现以太坊的核心,还需要去看一本黄皮书,此书由以太坊的技术合伙人所写,书中形式化的证明了以太坊核心的EVM部分,并含有大量的公式,学习起来相当困难。

然而这还不最难的,更难的地方在于以太坊是一个正在开发的项目,所以没有固定的规范,很多情况下都需要去调试已有的客户端才能理解当前的实践的含义。当做到这一步的时候,我会发现虽然剩下要做的东西还有很多,但是难度却陡然下跌,大部分只要花费时间就能够实现,不再像之前那样无从下手。

以太坊测试

Ethereum Tests是需要开发者重点关注的项目,因为这是唯一能够追踪以太坊规则变动的项目。它提供了大批的单元测试用来测试以太坊的实现,只有通过了这个测试才可以算是实现了以太坊的规范协议。

Test中频繁更新的目录并不多,大概只有3、4个,不过里面集中了大概几千条测试。其中BlockchainTests主要是一些关于以太坊块的验证和fork规则,PoWTestsfuz负责验证共识算法是否符合规定,RLPTests是以太坊的编码库测试。

测试过程

测试的时候首先给我们一个json格式的文件(如上图),保存有一些初始化的值,包括钱包和链的地址,blance是二进制化的钱包余额,code为空表示这个地址是一个钱包而非合约,storage表示合约中存储的数据,之后我们将自己的初始数据相应的填入其中。

第二步会提供给我们一些输入,比如对于BlockchainTests,就会提供很多块数据,我们要将这些输入到我们的实践中。按照以太坊的规范,此时会执行块的内容,执行完之后最初的json文件会发生变化,之后要做的是检验变化后的状态是否和测试中的状态一致。

思考和建议

如何了解以太坊的规范

以太坊的规范可以说是我在实践的过程中遇到的最困难的部分,同时也是非常重要的部分,不仅客户端的实现要依赖于它,以太坊的相关开发也同样如此。但是仅从Wiki或一些文章所了解到的规范,并不足以让你完整实现一条区块链。

就拿DevP2P组件为例,它是以太坊的底层网络组件,以一种P2P的方式使节点之间互相连接,给上层应用提供随意通信的能力。

DevP2P的规范大概可以从wiki、黄皮书、EIPs3个地方获取到。wiki是以太坊所有资料的入门,不过这里面的资料可能不会太过详细,对DevP2P的描述也仅限于告诉你它是什么,没有具体的实现方法。

黄皮书主要是写的是EVM的规范,类似DevP2P的网络部分并没有涉及。EIPs是社区驱动的以太坊改进提案,社区成员可以通过提交EIP来向以太坊官方展示自己的提升方案,如果官方认可该议案,会给它分配一个EIP编号,然后让社区成员一起来参与讨论,最后再去各客户端实现。可以说以太坊中的大部分规范都在这里,很遗憾的是DevP2P在EIPs中提到的也不多。

在以上方式都行不通的情况下,我们只能去查看官方客户端的代码进行调试,如上图在官方代码中插入一些print语句。这也是我所用的方法,将geth收到的数据一段段的打印出来和本地的处理代码进行对比。

开源项目如何吸引开发者

一个开源项目要想吸引开发者,最重要的是降低开发者参与门槛。比如用开源方式来管理项目,编写详细的README和Roadmap。考虑到安装依赖的繁琐,还可以为提供开发者提供一个Docker镜像。

以上是全部分享内容,谢谢大家!

IT大咖说 |关于版权

感谢您对IT大咖说的热心支持!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180912A1VNWN00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券