如何实现一个简单的以太坊 - 蒋金洋 | Jeth 第二期

1,662 阅读13分钟

编者按:本文系秘猿科技区块链工程师蒋金洋讲师,在由掘金技术社区主办,以太坊社区基金会、以太坊爱好者与 ConsenSys 协办的《开发者的以太坊入门指南 | Jeth 第二期 - 杭州场》 活动上的分享整理。Jeth 围绕以太坊技术开发主题的系列线下活动。每期 Jeth 会邀请以太坊开发领域的优秀技术团队和工程师在线下分享技术干货。旨在为开发者提供线下技术交流互动机会,帮助开发者成长。

本场分享视频回放链接(B 站)

我先自我介绍一下,我是秘猿科技区块链工程师蒋金洋,这次的主题是如何实现一个简单的以太坊。我之前从事 Web 开发和云计算的开发,对第一次接触以太坊是在两年,作为技术人员不仅是看重以太坊这种货币,我们更要看重区块链的这一代技术。

说实话,加密猫最火的时候我是比较失望,以太坊写的是去中心化的全世界的计算机,但居然有人用来做猫。随着我深入对以太坊的了解和学习,我看到很多 APP 一步一步去履行以太坊的使命,深度使用去中心化的功能,比如 the DAO 这个项目。

DAO 这个项目虽然因为智能合约有漏洞挂掉了,但它因为使用智能合约的 DAO 这一功能让我眼前一亮。DAO 是指去中心化的自治组织。在 the DAO 这个项目上面,我用我的私钥可以给这个项目转一笔资金,获得相应的投票权,投票权来表决我的资金投在哪个地方。虽然 DAO 最后也挂掉了,但是它相较于加密猫在技术上跨出了一大步。

去中心化交易所

去中心化交易所大家或多或少听说过,但是去中心化的交易所原理是用智能合约保证其安全性。我们假设现在有一个设计良好、使用了智能合约的去中心化交易所,理论上面我的资产放在交易所里面交易,可能这个交易所有一部分的中心化的服务帮助我匹配交易的过程,但是这笔钱永远是通过我的私钥以及以太坊智能合约来控制的,这样资产永远在我的手中。

智能合约和 Web 3.0

通过这些事例来说,我感觉智能合约和以太坊 Web3.0 的概念名副其实。刚才提及的两个例子中有两个特点:

  1. 资金和机制公开透明,比如 the DAO 这个项目;
  2. 给使用者更多权力 我身为一个使用者我可以百分之百控制自己的资金的权利,这在当下的 Web 中心化服务里面是一种奢望。

Web → BlockChain

Blockchain

区块链是一个 Web3.0 的平台,现在参与到当中,就是在创建下一代开发者使用的平台,这个对于我来说是最大的吸引力。

秘猿科技

最早听到秘猿科技时,给我留下了深刻的印象,因为这家公司的项目和主要产品都在 GitHub 上开源,包括钱包和区块链浏览器,而且 License 相当得开放。这也意味着我要是使用他们的代码,我不需要支付费用,为了了解这家公司如何运营,我决定加入进去看看。

还有一点,我听说秘猿科技他们是被称之为少林寺,我当时在想为什么是少林寺,是不是公司里面没有妹子,都是男的。这个误会很快被揭开:少林寺的寓意就是“天下武功出少林”,秘猿也确实在当下的区块链生态中培养出了一大帮像峨眉、武当这样的门派,为区块链事业做出了自己的贡献。

面试:Web → 区块链

我去秘猿科技参与面试,当时比较尴尬我是 Web 出身,对区块链中的区块、共识等概念只是有所耳闻但了解不深,所以面试的时候心里没有底。当时我应聘的是 Web 开发的职位,好在我们有试用期,我给自己打气,要是能在试用期内把知识都研究透就可以转到 BlockChain 的开发方向这是我列举 Web 开发和 BlockChain 开发在技术栈上的区别,右侧的也就是你要进入 Web3.0 平台需要的技术。

区块链工程师的秘密

在我面试的时候,当时的老板提醒我,秘猿科技的区块链工程师之前也是很多都是搞 Web 出身的,有个秘密可以让你很快学会区块链的开发,这个秘密叫做撸链。撸链就是自己做一条区块链出来,我们很多同事做过一些比特币和以太坊的实现,在这个过程中相当于你从 Web 技术栈,走了一条很长的路转到 BlockChain 技术栈,这时你已经做出来区块链了,不必再问自己有没有资格去做区块链。

撸链的权衡

撸链的好处在可以成为以太坊的专家,我当初下决心要撸链时,选择了第二代区块链的以太坊而没选择第一代的比特币。

这个是我们公司的撸链文化,最早开始撸链的是我们的 CEO。我当时问他着手搞以太坊有没有什么价值和意义,因为需要两三个月的时间成本且不一定能搞出来。他告诉我说,撸以太坊是困难模式,他鼓舞我说,如果你能撸出来一块以太坊,代表着你对区块链的理解能达到我们公司 TOP 5的水平。我的考虑是去做还是不去做。老板后来又在公司内说到,谁能实现以太坊,工资翻倍。本着帮助领导分忧,帮助老板花钱的理念,我决定还是要去做以太坊。

我刚开始做到现在过了三个月的时间,三个月时间不到给大家展示一下做成什么样子。以下是我的 GitHub 项目主页(https://github.com/ciri-ethereum/ciri)截图:

难度曲线

在做的过程当中,我有这样的一个难度曲线,一开始是以太坊的 Wiki,在 Wiki 上你可以找到所有的以太坊资料的入口。你要实现以太坊核心的话,需要查阅由以太坊的技术合伙人撰写的以太坊黄皮书,书中你可以看到大量的公式,这个时候你感觉非常非常困难。众所周知,以太坊是一个仍在开发的项目,它没有固定的规范,可以理解为以太坊的规范每天都在变,很多情况下你需要调试你的客户端,这样你才能理解当前的实现。黄皮书是一个巨大的门槛,当你把黄皮书看完后,理解现有的以太坊的实现,剩下的事情还有很多,但难度降低了不少,剩下的花时间即可完成。

以太坊测试项目

设定链的初始状态

我介绍一下这个叫做 以太坊 tests 的 GitHub 项目,刚才我们提到以太坊的规范一直在变动,这个项目是唯一一个在追踪以太坊规范变动的项目。

大家看一下项目的目录,频繁更新的也就3-4个目录左右,里面集中几千条测试。下面我简单介绍一些测试:

  • BlockChain 的测试,主要涉及以太坊区块的验证、还有一些比如 POW 的其他测试,这是在测试共识算法。
  • RLP 测试,RLP 是以太坊的一个编码库,类似于 json 但是以太坊选择 LP 作为格式。

下面给大家展示 tests 这个库怎么运行的,如何确保实现的就是以太坊。

  • 设定链的初始状态

它的原理很简单,一开始给我一个 json 格式文件,文件中是它的初始状态。右边图里就是它的格式了,有我们平时可以看到的钱包的地址;balance 是钱包的余额;code 为空的地址代表的是一个钱包,而不是一段合约,如果是合约的话他有一段代码;storage 是我们合约里存储的一些数据。下面这个地址就是真正的一条合约的地址。我会根据这段资料设定链的初始状态,把这一段资料塞进去。

  • 输入块数据

第二个部分它会提供一些输入。我举的这个例子是 BlockChain 的,块包括块头和一大堆的 Transaction,这时输入到测试中实现,这时它会根据里面的内容执行相应的合约。

  • 检验处理完块后的状态

转账和调用合约在以太坊里面都是以交易的形式呈现的这个过程当中就是相当于一个计算机的初始状态,这个状态要变化,我验证一下变化完的状态跟测试的时候状态是不是一致,如果是一致证明通过这个测试。

这样的测试一共有8000多个,我的项目目前现在通过过了5000多个,还有很多以太坊 fork 的规则没有处理,所以剩下的测试应该还是比较容易通过的。

其余成果

我在 GitHub 上发布了用 Ruby 语言便携的 RLP 编码库,叫做 ciri-rlp。同时我们公司很多后台是用 Ruby 写得,同事用 ciri 库解决了加密问题。

如何实现以太坊

思考与建议

  • 关于以太坊的规范
  • 开源项目如何吸引开发者的思考

如何了解以太坊的规范

正如我前面所讲,以太坊目前没有完整的规范,尽管如此以太坊的规范是非常有用的:第一点,你想要实现一个客户端你一定要去了解这个东西;第二点,如果不实现客户端,你想要做以太坊相关的开发,比如说你可能去开发一个 imToken 这样的钱包、区块链的浏览器和其他以太坊周边的东西,你也需要了解以太坊的规范。有时你只是看了 Wiki 和文章整理上的规范,是不足以让你实现这个东西。

我以 DevP2P 作为一个例子,它是以太坊的一个底层网络组件,它会以 P2P 的方式跟节点进行连接,与上层应用实现随意通信。

我们从这三个地方可能找到寻找 DevP2P 的认证规范。

第一个是 Wiki ,它相当于是一个以太坊所有资料的总入口,但在里面可能找不到特别详细的东西。幻灯片右侧截图是 Wiki 上 Libp2p 的介绍,它会告诉你 Libp2p 是什么东西。但这里只是告诉你是什么,没有详细告诉你如何实现。

第二张图是 Devp2p 的协议,Libp2p 其实就是 Devp2p,但它没有将非常规范的方式告诉你,所以你只看协议是实现不了。黄皮书实质上是以太坊 EVM 的规范,它里面写的是 EVM 的东西,但网络部分的话在里面是无法找到的。

除此之外你还可能找的就是 EIPs,它是一个由社区驱动的以太坊提升提案。如果你发现以太坊做得不好,我可以提升他,你可以先提交一个 EIP,如果官方觉得 EIP不错 会分配 EIP 的编号,社区里的其他成员在里面讨论这个东西,并最终实现这个提案。我们现在以太坊大部分的规范是放在这里,你一定要去找 EIP 的东西。

可惜的是,在 EIP 里也没有对 Devp2p 非常详细的规范,这个时候使用从官方的客户端里面去看它的代码并且去调试。

这里我们可以使用 Geth 来完成,我当时实现就是利用这个方法一段一段把 Geth 收到的数据一点一点打印出来。然后进行对比。

开源项目如何吸引开发者

接下来我想分享的是开源的项目如何吸引开发者。开源项目的关键:一堆人做这个项目可以决定这个项目能不能开始,如果想要持续下去,必须让更多人的力量投入到其中,包括以太坊也是如此。

这是以太坊官方支持的客户端,py-EVM,另一个是我实现的,Ciri,这个时候我要考虑的是如何增加参与者,这需要各位的帮助。如果各位对实现以太坊感兴趣,想多了解以太坊的原理,最好的方式是自己去实现一下;第二个好的方式大家参与项目一起来做;还有一个就是大家如果不是想了解以太坊,可以帮忙给我的 ciri 项目点赞,这也是对开源项目的一种帮助。

降低开发者参与门槛

  • 开源方式管理项目

我做的过程当中,我对比下来,我发现有很多东西还是缺乏的.在座的各位都是程序员,如果自己做项目的时候,自己根本不会去写文档,自己也不会考虑项目管理。这时如果想要别人参与到这个项目中,需要让他把你的源代码看一遍了。想到这一点的时候,我一开始就是在 GitHub 的 issue 里在管理这个项目。

  • README 和 Roadmap

如果别人想要参与,可以看到我做了哪些东西,有的东西为什么没有做,现在这个工作进行到哪个地步,包括去写比较详细的 README 和 Roadmap 文档。

  • 方便开发者 Setup

我觉得已经超越了很多的开源项目,我做了一个 Docker 镜像给开发者用,如果你的电脑上有 Docker, 可以拿容器试一下是不是真的有五千多个测试可以通过,省去了安装依赖文件的烦恼。

总结

如果你了解以太坊的规范,或者你要更深入了解以太坊的实现和设计,记住有三个方式:黄皮书,WIKI,EIPs,进一步深入的话还需要用已有的客户端进行调试;第二个思考如何去参与开源项目,保括开源方式和管理项目,提供 readme 和 ROADMAP 文档;第三个是尽量方便开发者了解这个项目。

这是我的联系方式,以及我们少林寺的招聘内推,有兴趣的同学留意一下。谢谢大家!