编者按:本文系秘猿科技区块链工程师蒋金洋讲师,在由掘金技术社区主办,以太坊社区基金会、以太坊爱好者与 ConsenSys 协办的《开发者的以太坊入门指南 | Jeth 第二期 - 杭州场》 活动上的分享整理。Jeth 围绕以太坊技术开发主题的系列线下活动。每期 Jeth 会邀请以太坊开发领域的优秀技术团队和工程师在线下分享技术干货。旨在为开发者提供线下技术交流互动机会,帮助开发者成长。git
我先自我介绍一下,我是秘猿科技区块链工程师蒋金洋,此次的主题是如何实现一个简单的以太坊。我以前从事 Web 开发和云计算的开发,对第一次接触以太坊是在两年,做为技术人员不只是看重以太坊这种货币,咱们更要看重区块链的这一代技术。程序员
说实话,加密猫最火的时候我是比较失望,以太坊写的是去中心化的全世界的计算机,但竟然有人用来作猫。随着我深刻对以太坊的了解和学习,我看到不少 APP 一步一步去履行以太坊的使命,深度使用去中心化的功能,好比 the DAO 这个项目。github
DAO 这个项目虽然由于智能合约有漏洞挂掉了,但它由于使用智能合约的 DAO 这一功能让我眼前一亮。DAO 是指去中心化的自治组织。在 the DAO 这个项目上面,我用个人私钥能够给这个项目转一笔资金,得到相应的投票权,投票权来表决个人资金投在哪一个地方。虽然 DAO 最后也挂掉了,可是它相较于加密猫在技术上跨出了一大步。面试
去中心化交易所你们或多或少据说过,可是去中心化的交易所原理是用智能合约保证其安全性。咱们假设如今有一个设计良好、使用了智能合约的去中心化交易所,理论上面个人资产放在交易所里面交易,可能这个交易全部一部分的中心化的服务帮助我匹配交易的过程,可是这笔钱永远是经过个人私钥以及以太坊智能合约来控制的,这样资产永远在个人手中。算法
经过这些事例来讲,我感受智能合约和以太坊 Web3.0 的概念名副其实。刚才说起的两个例子中有两个特色:json
区块链是一个 Web3.0 的平台,如今参与到当中,就是在建立下一代开发者使用的平台,这个对于我来讲是最大的吸引力。浏览器
最先听到秘猿科技时,给我留下了深入的印象,由于这家公司的项目和主要产品都在 GitHub 上开源,包括钱包和区块链浏览器,并且 License 至关得开放。这也意味着我要是使用他们的代码,我不须要支付费用,为了了解这家公司如何运营,我决定加入进去看看。安全
还有一点,我据说秘猿科技他们是被称之为少林寺,我当时在想为何是少林寺,是否是公司里面没有妹子,都是男的。这个误会很快被揭开:少林寺的寓意就是“天下武功出少林”,秘猿也确实在当下的区块链生态中培养出了一大帮像峨眉、武当这样的门派,为区块链事业作出了本身的贡献。微信
我去秘猿科技参与面试,当时比较尴尬我是 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个目录左右,里面集中几千条测试。下面我简单介绍一些测试:
下面给你们展现 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 文档。
我以为已经超越了不少的开源项目,我作了一个 Docker 镜像给开发者用,若是你的电脑上有 Docker, 能够拿容器试一下是否是真的有五千多个测试能够经过,省去了安装依赖文件的烦恼。
若是你了解以太坊的规范,或者你要更深刻了解以太坊的实现和设计,记住有三个方式:黄皮书,WIKI,EIPs,进一步深刻的话还须要用已有的客户端进行调试;第二个思考如何去参与开源项目,保括开源方式和管理项目,提供 readme 和 ROADMAP 文档;第三个是尽可能方便开发者了解这个项目。
这是个人联系方式,以及咱们少林寺的招聘内推,有兴趣的同窗留意一下。谢谢你们!