美文网首页
1 以太坊基础

1 以太坊基础

作者: 智能合约大师兄 | 来源:发表于2019-11-18 12:27 被阅读0次

    1.1 以太坊的前世今生

    时光回溯到10年前也就是2008年底,国外一自称中本聪的大神(当时被认为是疯子)在一隐秘的密码学讨论组上发布了一篇论文《比特币:一种点对点的电子现金支付系统》,标志着伟大的区块链时代的诞生。由于真理往往在少数人手上这也导致但凡伟大而超前事物初期从来都不被认可,比特币也经历了类似的黑暗时代。从诞生之初乃至其后大致2年多的时间被大家慢慢遗忘了,只是在一小群人中作为业余技术爱好进行交流和传播,甚至有人为了买一个披萨花了10000个比特币。

    彼时笔者还是计科研二在读,舍友也第一次在电脑上装了个新的开源手机系统android模拟器,我记得系统版本好像是1.0或1.5。那时手机还是诺基亚的天下,能有塞班4或者6的手机是都是比较高端的机型。这个新系统只能在模拟器下跑一下,虽然对照文档写程序还是比较简单但跑起来太吃内存而且很卡,真机当时好像只有个什么多普达贵而且不好用,因为各种客观原因就束之高阁了。苹果彼时也开放了国内的APPSTORE应用市场,废除了之前的只能用网页相关技术创建APP的方式转而开始推崇OC的原生开发方式,创记录的苹果4也粉墨登场。虽然初期口碑也是一塌糊涂特别是天线信号不好让人诟病良多,不过后来的改进版本4s圈粉无数。网络购物也刚刚开始兴起,支付宝也开始慢慢被大家所知虽然用的人也很少。总之那是一个IT界的混沌年代,很多现在的业界大佬那时要么打酱油要么在苦逼的思索未来的路怎么走。所以比特币在出现在这个背景下不被人关注也很正常。

    刚经历了汶川特大地震因为离得近感慨生命无常活着真好,心态也慢慢发生变化。同时研三了马上面临找工作稍微关注了下时事,才发现全球进入了经济危机大周期到处都在裁员首当其冲的是外企等。各种主流官方媒体也在一直发声,目前处于史上最难就业年,大学生不要眼高手低要从基层做起。(虽然后来慢慢耳朵听出茧了,好像年年都是史上最难什么年,什么50年一遇百年一遇之类)。所以那年公务员事业单位和国企等异常吃香,那会基本是2流的去一些国内的有名气的公司(支付宝腾讯华为等当年还是有名气但基本不是第一选择),三流的继续考博或者直接去小公司创业等,英语好的基础扎实的基本选择去国外读博,大部分大家认为有前途综合能力不错的却选择公务员事业单位等再不济也选择了国企。针对大的经济困境国家队出手力挽狂澜,四万亿经济刺激使得房价逐步开始走上封神之路并成为未来10年老百姓能参与的为数不多的发展红利。十年回顾发现在哪里工作是其次关键是在哪里买房安家敢上多少杠杆买多少房。人生总是充满变数对人生有重要影响的选择在决定之初其实往往都是很随意的。

    刚毕业和大部分理工男一样,无家室拖累没经济压力慢慢的迷上了一款游戏《魔兽世界》并为此贡献了不少精力和时间。完成本职工作后下班时间就是放纵时间,放纵等于快乐可惜快乐总是那么短暂。时间一晃就到了2010年笔者专业技术还吃着之前学校的老本,游戏中也继续挥洒着无处释放的青春,只是逐渐多了些迷茫和不甘。工作上发现投入时间和热情后,在国企这种环境里面最终得奖励的还是领导,当出问题了背锅却总是自己进而工作也没那么热情了。不过最大的收获就是法师满级了可以全世界到处飞。为了更方便的操作开始研究按键精灵自动打怪,后来觉得不过瘾过渡到研究游戏外挂等相关技术,因为大学阶段C++的基础比较扎实。不过后来反外挂技术也升级到一个新的高度,同时也上升到法律层面外挂研究之路也就不了了之了。

    与此同时国外一个小伙子维塔利克·布特林(下文简称V神),笔者推测应该是高中刚开始的阶段,在一次暴雪针对魔兽世界的例行升级中移除了术士的生命虹吸这个技能后,其在暴雪的官方论坛多次反馈无效后进而愤怒的删除了游戏客户端,随风而去的是其对青春的告别和对中心化权威的第一次无声反抗。

    可能最初V神因为情绪删除了魔兽世界客户端的时候也是有过几多挣扎和彷徨的,毕竟那个时代对IT男何况是资深技术宅来说,魔兽世界的魅力不是一般的大,其繁复的操作技巧是有很深的吸引力和征服感的,同时背景弘大无边无际的虚拟世界链接了众多的同龄人。这个时候另外一个不得不提的大人物出现了—V神之父,其在莫斯科一所大学中从事计算机方面的科研工作。因为工作关系能很早就接触比特币相关的知识,并能从专业角度给与中肯的意见。不过在某次饭后闲谈中其把比特币相关的东西当做一个笑话向V神进行了介绍。当其提到其核心特点之一去中心化的这个特性后V神如醍醐灌顶般开悟了。这不就是一直在寻找的东西么!至此魔兽的世界少了个风骚的术士,现实的世界多了个开宗立派的V神,也是后人津津乐道的以太坊创始人这是后话。

    反正也百无聊奈魔兽也不是记忆中的魔兽不如找点事情做吧。出生IT世家且天资聪颖的V神,从小就接触电脑的他开始一头扎进比特币的知识海洋并且如鱼得水。其背后的理念如此有趣技术上的理解和传承也是信手拈来。成年人考虑一件事情的时候可能重点先考虑经济相关的回报,起码在有一定的经济基础之前如此。然后可惜的是当时比特币的价格不说历史最低也是低的离谱。好在V神家境不错其还在求学阶段也没太大的开销,所以经济方面的回报需求是其次,关键是要有趣而且好玩,没有一个可恶的中心化权威机构决定一切。一切看似不相干的偶然事件穿插一起并慢慢的改变了IT历史的进程。与其说是V神改变了历史我更愿意相信是历史选择了V神。

    有一定的研究心得之后V神开始给专业的比特币杂志撰文。一次无意间突发奇想把自己的比特币收款地址附在后面,并留言如果收到足够的比特币就会很乐意继续进行下一遍文章的写作。当时主要就是好玩因为比特币根本不值钱或者只能买点小玩意之类。随着读者的增多开始和几个志同道合的人创办的自己的比特币杂志并继续以专栏作家身份继续写作。

    大概过了2到3年的时间也就是2013年左右,V神也到了读大学的阶段。随着比特币价格的回升V神已经变得很富有了起码和同龄人相比。随着研究的深入对比特币的兴趣与日俱增但繁重的学业耽误了不少时间和精力。这时V神又做了一件大多数牛人都做过的事情选择了从大学退学,与其花费大量时间在不感兴趣的事情上不如直接说拜拜。这时老外的各种奇葩事情凸显无疑,因为其退学决定以及在比特币方面研究的知名度反而得到了泰尔奖学金的10万美金供其继续研究。关于退学其父母应该也做了一些思想劝慰工作但最终结果还是遵循其个人意愿退学了。V神退学后就开始了游学之路(到处游玩顺便写写代码和文章)并推广去中心化理念和比特币所使用的相关技术,当时应该还没有区块链这个专有和抽象的名词来统一代表。但初期肯定是困难重重,虽然比最初使用人群大了不少但比特币还是只限于小范围人员,区块链技术更是听说过的人都少更不要说懂的人。

    在游学和推广的过程中其也慢慢意识到比特币本身的一些不足,特别是如果想完成一些复杂的应用时,其本身的UTXO模型(未花费交易交易输出)带来的复杂度和脆弱的脚本系统是最大的阻碍。V神也因此多次在比特币官方论坛向比特币高层提出了改进意见,和之前在魔兽世界里面的遭遇相比这次要好得多。上次是石沉大海没人理这次是其开山鼻祖中本聪亲自回复了,回复原文笔者没找到但回复总的意思就是:小P孩你不懂我也没功夫搭理你该干嘛该嘛去。

    此时的V神已经不是当初的高中生,游学的过程中不但技术更上了一个台阶其心智也远超同龄人。基于比特币进行渐进式改良的想法也慢慢放弃了。V神认为比特币本质上还是一个中心化组织在把控,关键是除了转账外基本没啥实际用途。关于创建一个区块链技术驱动的,世界通用的计算模型的想法开始播下种子了。

    大概在2014年的时候V神关于以太坊通用计算平台的思路和设计原型基本成型。回到了故乡多伦多之后把一切思考汇总整理并完成了区块链世界的另外一篇创世文章《以太坊白皮书》。此时距离比特币创世论文的发布以已经过去了5年多的时间,比特币的用户群里已经有了很大的扩容,当然比特币本身的价格也经历了多次的腰斩上升轮回而一直不死。大家也开始慢慢的思考一个问题,没有一个中心化的公司或组织运营的比特币本身作为一种电子货币居然一直发展良好,这完全是出人意料也不可想象的。慢慢的比特币背后的实现技术,区块链技术被大家挖掘和整理出来了。所以当V神带着白皮书进行推广和众筹的时候,很快就筹集差不多1800万等值美元的比特币。说起众筹V神也是创新人才直接用比特币进行众筹,也开启后了后续用虚拟货币特别是以太币进行项目众筹的先河,使得以太坊平台也成本项目绝佳的募资平台。

    有了资金后以太坊的发展开始步入快车道,更多的人才加入配套生态也开始慢慢建设。后来随着伍德大神的加入(以太坊黄皮书的作者),对以太坊的核心实现进行了公式化的定义和描述并汇总整理为以太坊黄皮书,一举奠定了以太坊作为区块链2.0的代表和领头羊,后来其离开初始团队另外开发的以太客户端parity也是好评不断。以区块链1.0为代表的比特币及其衍生的无数山寨币也依然活跃着。以太坊多客户端实现的惯例也一直保留至今,目标是更容易的对软件实现进行审计和发现漏洞,同时方便不同技术背景的个人和团体加入以太坊的生态并贡献力量。V神也继续一边继续周游世界并推广以太坊一边进行底层科研,当然主要活动范围还是国外。后来V神觉得中国也不错关键还有熊猫,也为了向其父亲证明自己可以学会世界上最复杂的语言中文开始了自学之路,后来真的学得不错读写都很流利。

    自此之后V神开启了自身的封神之路并一直保持以太坊核心精神领袖至今。既然说到区块链江湖不得不提的另外一个大神就是BM比特股的创始人。其本人是个牛逼的程序高手同时也是一朵奇葩中的战斗机,其怪异的性格被合伙人从其创始项目中一致踢出局有点类似悲情乔布斯了。现在的EOS项目BM也是主刀者,都一路被骂到现在还一直坚持着估计他都习惯了。BM大神一直觉得以太坊很垃圾,虽然EOS项目怪异的ICO模式(持续一年的韭菜收割机)是基于以太坊平台的智能合约。其也公开建议V神应该放弃以太坊并加入其主导的EOS项目一起把区块链技术发扬光大才是正道,当然V神只回复了一个字:滚。虽然直到现在这两人一直上演相爱相杀的纠结故事,但不妨碍其两者都是区块链领域的大神,尽显瑜亮之风采无人能出其左右。

    时间已经进展到2015年,国外特别是美国区块链相关的技术沙龙讨论等如火如荼,国内还处于挖矿和山寨币横行阶段,并刚刚经历了一段惨疼而漫长的熊市折磨。国内一些早期的比特币玩家大部分此时都已经离场,比特币价格波动厉害稍微不注意又要碰政策红线,这当中有一些后来的技术大神一直在坚持。其中最有代表性的个人觉得应该是帅初。其在校读博期间了解到比特币,并深入研究发现如此的有趣并被深深吸引后,开始修改底层代码和参数进行定制并乐此不彼,也因此耽误了大量的时间导致其博士老板不爽或者其他原因,最终结果是也选择了大部分牛人同样的选择辍学继续搞研究。后来因缘际会之下遇到了另外一个营销(忽悠)牛人张虹女士(商务大牛虽然业界褒贬不一),开始把比特币进行定制改版做了贝壳币,更超前的是那时进行了手机版本钱包开发。现在看来应该只是完成了手机端的账户管理和交易的离线签名,但在当时国内听说过区块链都很少的情况下已经很超前了。更难能可贵的是其在官网还引入了一个类似早期股权交易的平台,并以他们的贝壳币作为计价单位进行交易和流转。笔者也投入资金试玩过当然结局是感觉庄家总是盯着我手上的贝壳币一样,买了某个公司的虚拟股权价格就一路下滑卖了马上就涨起来了。

    张虹和帅初在成都搞了一个技术沙龙,名称倒比较响亮西南片区第一届区块链技术交流大会,确切时间应该是2015年11月左右。这也是笔者第一次接触区块链,以太坊也是从那次技术交流会上第一次听说,但其实当时参加的人少得可怜好像就10几个。因为那时笔者在忙另外一个影像相关的创业项目常常在成都,另外一个合伙人协办的这次技术沙龙为了凑人气去的,10几个人中好几个是我们自己人。总之听得昏昏沉沉末了张虹说大家安装一个app,微信群里面发个言就可以免费得到小贝壳币,可以在他们的股权交易平台买卖创业公司股权,关键还可以在一个虚拟交易所比特儿上交易兑换为人民币大家兴趣一下就被点燃了。

    此时国内的交易所比特儿还是不错的选择,虽然也经历的了大事件人气远不如之前,云币还是属于默默无闻小交易所免费都没人用,这些经历都历历在目如同昨天才发生。因为笔者那次技术沙龙后也重仓小贝壳币,想的是在他们的虚拟股权交易所赚取差价,然后在比特儿上面再赚差价不就马上香车美女了么。结局肯定如你所料被割韭菜了,成本1元的贝壳币没多久变8分还是多少,后来反弹到1毛的时候出了。后来帅初和张虹分道扬镳了加入了唯链做奢侈品的区块链项目,再后来独立门户发起量子链项目并傲视同龄人。虽然初期饱受了不少争议,主要由于初版的代码是几个github项目东拼西凑的没多少自己的东西,但笔者认为github本身就是一个代码宝库,能有效的整合和定制也是一种能力的体现。

    后来发现了云币里面只认识个BTC价格好像是2000还是3000,总之觉得贵不划算。里面有个ETH什么价格不错好像14元,看下介绍文档才知道就是之前技术沙龙提到的以太坊,慢慢的和以太坊有了亲密接触。本着程序员天生谨慎(胆小)的态度查阅相关资料,那时基本没中文资料都是英文的,主要就是官方网站、github主页和wiki,从技术角度看可以做一些简单小东西,但好像没什么实际用途。根据众筹价格算了一下发现成本才1元不到现在居然要14元骗子大骗子。让我花钱买不可能但又不想失去机会,笔者也弄了个好点的显卡进行挖矿,虽然比CPU效率高了不少但结果是当然没挖到。之所以敢下血本买显卡想的是挖不到ETH还可以用来玩游戏,那时笔者已经不玩魔兽世界好多年觉得太费时间了,主要还是玩DOTA后来开始玩LOL简单快速可以完成一局而且后者对显卡要求高些。重点是后来果然下跌最低12左右,看了后点头微微笑一副果然如我所料的方外高人姿态。

    然后愉快的过春节了,没事的时候把以太坊的文档和solidity文档全部浏览了下,觉得是个好玩的东西想空了后做点小东西玩玩。再次想起云币并看下价格时恨不得把自己脸打烂,短短10来天好像疯长到40多还是50多。当时我爱理不理的ETH后来我彻底高攀不起了,开启了一绝前尘的王者这路。回过头来发现任何时候入手ETH都是起点,给了太多的机会但一个都没珍惜,尽管当时从技术上看也是一个稍微有技术含量的骗局,再次体现技术男的眼界局限。

    随着研究的深入发现利用其自带的合约引擎能完成一些有意思的事情也开始被其吸引了。因为一些原因和之前的影像合伙人分道后专心研究以太坊,但当时资料匮乏英语基础也不好,国内节点同步常常出问题导致笔者当时郁闷不已,当然最可恶的是ETH居然从14涨到了最高140多。那时还不流行私有连测试都是直接上公网,当ETH价格涨价后才开始慢慢用私有连和truffle代替。这也是笔者作为程序员的局限,有了私有连和模拟环境后彻底不关心币价了只是从技术角度研究以太坊底层以及智能合约。

    值得一提的是另外一个国产明星项目小蚁(现在叫NEO),天使好像融资300万人民币具体待考证。初期主程序员就2个左右还到处招兵买马不过没人去,达叔也被认为是传销投资大骗子之类满口跑火车。笔者也一时兴起下载了其源代码并把环境搭建好实验了下,结论是太垃圾了代码质量还行功能弱爆了,核心东西都是比特币和比特股的杂交只是用C#重新实现了,连个像样的手机端也没有。所以第二期QQ群里面众筹成本价5毛上线云币后起步一元,很快跌落到5毛,笔者也一如既往的不参与,连ETH我都不参与更何况垃圾国产项目,当然后来又一次被事实无情的再次打脸。

    时间已经到了2017慢慢的云币觉得只是交易不过瘾,开始自己主导和推广项目(坐庄),公信宝量子连就是这个时期的产物。等开盘的时候大家发现参与早期众筹有巨大的经济效益也同时懊恼没参与,李笑来这个大仙也顺势推出众筹网站icoinfo。并且初期确实有些项目不错,薛蛮子的加入和走穴更是推波助澜,特别是其虽然没有明显承诺但处处暗示,icoinfo上项目都是精挑细选的将来要上云币国际版本交易的,再来几个有诱惑力的白皮书,什么价值分红回购销毁等一下把大家胃口吊足,大家开始四处筹集资金跃跃欲试等待icoinfo上项目的开盘,当然也包括笔者。

    此时币安交易所还在一个小网站众筹没啥人气,其创始人赵长鹏还在和其老东家撕逼,币圈漂亮一姐何一还没加入币安。其开始运行后没啥交易量,其内部币BNB也就1元还冲忙的割了一波韭菜,开盘就迅速砸到你怀疑人生。

    那时开始流行众筹了也就是后来说的ICO,二宝爷的icoage也突然用户量暴增。李大仙也眼红icoage的经济回报,早早公布了于icoinfo平台8月开始上线众筹项目9月底发币10月上云币国际版交易,导致其后上线的每个众筹项目都可以用疯狂和秒杀来形容。项目开始前笔者也是把家里所有用网络的设备关闭,提前把需要的EOS代币充值好沐浴更衣焚香祷告一番,果然不负有心人居然抢到了两个黄金项目bigone和dex交易所项目的众筹份额并满额参加,薛蛮子的交易所和李大仙的交易所项目。从此天空每天都是明朗的大笔财务即将到来每天心情都很好。

    慢慢的风头有点变了新上的项目居然没被秒,有些还提前结束不可能啊,大部分因为参与了前面的一些项目也没后续资金来参与更多的项目了。因为都是技术屌丝居多资金并不宽裕。后来的故事大家也就知道了,特别是经历2017年币圈九四惨案的同胞们(包括笔者自己,鼓起勇气参与ICO)结果被团灭。开启了国内区块链团队的大航海时代,云币没落乃至消失币安成为新一代中心化交易所霸主。国内开始慢慢讨论区块链技术和落地,闭口不谈ICO和炒币。然后慢慢的过渡到了2018年各种区块链项目遍地开花,区块链及其相关技术也被大家人熟知和认可,但九四惨案造成的旧伤隐隐发疼。

    这就是截止目前笔者所听说和部分参与的区块链江湖,关于V神的内容来源于网络公开资料,国内的一些故事可能以偏概全不一定不准确。但笔者深信如同汽车火车一样,区块链技术一旦出现必将大大改变人们生活的的方方面面,只是不知道何时落地和被普遍接受。未来必将到来,虽然不知道确切时间但提前做些准备总是好的。

    1.2 比特币与区块链

    风靡全球的比特币从2009年上线的默默无闻,只是在小范围的技术圈里面交流传播,到如今单价超数万人民币,短短几年时间催生了一大批相关企业和个人参与进来并开启了新一轮的造富运动。 那么是什么使得越来越多的人开始喜欢并沉浸其中呢?总结起来比特币大致有以下几点特别吸引人:去中心化没有类似于央行的第三方机构存在;能够快捷而且低成本的全世界流通;隐私的完全保护在系统内部个人的对外地址都是一个长的随机数,并通过特定算法由一个私钥生成和保护,所有交易的发送都由发送方进行签名,接收方进行验证;总量有限且产量递减能有效的抵制通货膨胀。这些特点使得比特币成为大家公认的数字黄金并趋之若鹜。

    比特币的核心就是以区块链技术为基础,或者说比特币是基于区块链技术实现的金融领域应用。当用户A向用户B进行一次转账交易时,先完成一些先决条件检查比如A余额是否足够、用户B是否存在等。通过检查后构建对应的交易内容,并保存前一个有效交易的HASH索引,用户A对该交易内容进行数字签名并全网广播。这样每一个交易都保留有前一个交易的索引,可以对所有数据进行遍历。当某一个幸运的旷工挖出一个区块后,将一定数据量交易打包进区块并全网广播自己挖到的新区块,如果该区块被大部分旷工确认其真实有效后,该区块及其打包的交易就永久生效了。这样循环往复当一个个区块被挖出并被大家确认后就形成区块链了。示意图如下:


    image.png

    比特币采用的是一种被称为分布式总账的技术,其被定义成一个链式的数字签名串。币的拥有者通过对前一次交易和下一次拥有者的公钥签署一个数字签名,并将这个签名附加在这笔交易当中来完成一笔转账。而转账的收款人通过对签名进行验证,就能够验证该交易的所有者是否为有效发送方。交易本质上只是原始的记录从A转账多少金额到B,虽然实际情况要复杂得多。每笔交易都有输出方和输出方,转账时只能花费未花费的交易也就是大家称之为UXTO模型的原因。其本身不存在账户和状态的概念,需要的数据都是遍历交易树并累加计算,虽然也支持简单的脚本但功能比较受限制。所以比特币的世界其实并没有比特币,只是一堆原始交易的构成的区块数据,示意图如下:


    image.png

    比特币和区块链更多是一种共生关系,很难定义出确切的先后顺序。为了更好的实现比特币的功能目标而引入了后来被称为区块链的技术,区块链也从比特币专有的技术剥离出来并作为一种通用技术理念和架构。所谓的区块链技术本质是一系列相关概念和技术的统称,组成区块链技术体系的基石为以椭圆曲线非对称加密算法为核心的账户管理与消息签名和验证、配套的HASH算法、默克尔树证明和底层的P2P网络模块。

    1.2.1 哈希算法

    也称为散列函数,公式化定义如下:

    h = Hash(m)
    

    其中:m代表任意长度的输入消息,Hash代表具体哈希函数,h为固定长度的哈希结果值。哈希函数是一种特殊的数学函数,可以在有限合理的时间内将任意长度的消息压缩为固定长度的二进制串,也就是所谓的哈希值。哈希碰撞是指两个不同的消息在同一哈希函数作用下产生相同的哈希值。一个优秀的哈希函数具有如下几个特点:

    • 现有的计算资源(包括时间、空间、资金等)下,找到一个碰撞是不可行的
    • 对于给定的消息m1,要发现另一个消息m2,满足Hash(m1)= Hash(m2)在计算上是不可行的
    • 当一个输入位发生变化时,哈希结果会发生显著变化

    因为具有这些特性,哈希值作为区块和交易的唯一ID是完美的解决方案。为了寻找指定哈希值的输入穷举是唯一有效的途径,但要验证输出的结果是否有效却很简单和高效。哈希运算也作为挖矿生成满足指定条件哈希值来竞争出块权的算法实现核心。后续的各种矿机其核心就是把哈希运算硬件化和并行化。常见的哈希算法有sha256、sha512和 ripemd160等。

    1.2.2 默克尔树

    在点对点网络中进行数据传输时会同时从多个节点下载数据,但不是所有节点都是稳定和可信。为了提高传输效率同时保证数据的完整性,更好的办法是把大的文件分割成小的数据块,如果小块数据在传输过程中损坏了,那么只要重新下载这一块数据就行了而不用重新下载整个文件。为了验证整个数据块是否有效,只需要对每个数据块计算其哈希值,待所有块下载完了再对所有块的哈希值再计算一次哈希得到文件的根哈希进行总验证。

    哈希列表是一种特殊形式的默克尔树。默克尔树在最底层和哈希列表一样把数据分成小的数据块并计算相应的哈希和它对应。但是往上走并不是直接去运算根哈希,而是把相邻的两个节点哈希合并成一个字符串然后运算这个字符串的哈希,如果最底层的节点总数是单数,就直接对最后一个节点本身进行两次哈希运算,所以也能得到它的子哈希。以此类推两两结合计算节点哈希,可以得到数目更少的新一级哈希最终必然形成一棵倒挂的哈希树,到了树根的这个位置这一代就剩下一个根哈希了,我们把它叫做默克尔根。默克尔树与哈希列表的主要区别是,可以直接下载并立即验证其中的一个分支,这样如果有一块数据损坏仅仅重新下载这个数据块就行了,示意图如下:


    image.png

    默克尔树在以太坊的底层实现中有重要意义,特别是在状态验证方面发挥着举足轻重的作用。

    1.2.3 椭圆曲线算法

    在密码学上公钥密码体制有两个重要原则:1在加密算法和公钥都公开的前提下,其加密的密文必须是安全的;2 所有加密的人和掌握私人密钥的解密人,他们的计算或处理都应是比较简单;但对其他不掌握秘密密钥的人破译应是极其困难的。公钥密码算法中的密钥分为公钥和私钥,用户或系统产生一对密钥,将其中的一个公开成为公钥另一个自己保留作为私钥。一般情况下通信时发送方利用公钥对信息进行加密,接收方利用私钥对信息进行解密完成通信,当然也可用私钥加密公钥解密。因为加密与解密用的是两个不同的密钥,所以这种算法也叫作非对称加密算法。

    椭圆曲线密码算法是基于椭圆曲线数学的一种非对称公钥密码算法,其安全性依赖于椭圆曲线离散对数问题的困难性。其在数学上也保证要产生相同的私钥几乎是不可能出现的,而且要达到同样的安全强度其所需要的内存和运算量大大少于传统的RSA。比特币的早期实现其实是采用的RSA,后来升级后才采用的椭圆曲线算法,并成为后续各种区块链系统实现的参考样本。

    后续各种区块链系统的实现包括以太坊、比特股等,HASH相关运算作为交易和区块ID,用椭圆曲线算法进行相关的账户管理和交易签名和验证,以及底层的P2P网络模块都完整的保留下来了,也是变动比较少的部分。

    区块链系统中另外一个比较重要的共同点就是交易,因为区块链系统的本质是基于某种共识算法下的分布式状态一致机制,其状态的改变是通过交易来实际完成的,只是不同的实现中对交易的解释和处理有差别。

    1.2.4 P2P网络

    也称对等网络在该网络中每个参与节点共享其它节点所拥有的一部分计算能力、存储能力和网络连接能力,访问过程中不需要再经过中间实体。所以每个节点既是资源和服务的使用者又是整个资源和服务的提供者,也就是说每个节点同时是服务器和客户端两种角色。整个网络中由于不存在中心节点因此每个节点都可对任意对等节点做出响应,并提供资源包括计算资源和存储资源等,和传统CS架构相比最大的特点是不存在中心节点或服务器。P2P网络的核心理念是让所有加入P2P网的人,直接通过随机的对等节点进行交互而不需要一个中心服务器或节点,这样方式的沟通共享交互更加自由和方便,最终把互联网的权利交换给用户而不是一些集中网络中心。

    P2P网络最早的落地应用是1999年由美国人Shawn Fanning发明的Napster用于分享音乐,但在国内将其发扬光大的应该是bt软件来进行一些电影下载,快播等软件来进行在线视频观看等。后来者迅雷之类的下载工具基本采用了底层的P2P网络模式,示意图如下:


    image.png

    1.2.5 共性与个性

    区块链系统的通用运行机制可以简单的概括如下,交易发起方发起一个交易并用自己的私钥进行签名和编码,通过P2P网络在节点间进行广播和传递。接收节点在做了必要性的检查后,将交易加入本地待处理交易缓冲池,如果竞争到下一个区块的出块权,则按照一定规则对一批交易进行打包,再次通过P2P网络广播到每个节点。接受节点做了区块的有效性验证后,开始解析并处理这个区块里面的每个交易,并改变本地状态机相关状态值。其中每个区块都关联了上一个区块的哈希,这样就形成了工作量的累计证明,要更改后续某个值其之前的工作量都要重新计算提高作恶成本。比特币的后续继任者大部分改的就是出块机制以提高TPS(单位时间内处理的交易数量)以及对具体交易的解释处理。

    1.3 以太坊

    以太坊是一个全新开放的可编程通用区块链平台,它允许任何人在平台中建立和使用区块链技术驱动的去中心化应用,其不属于任何组织和个人是完全开源的项目任何人都可以参与。如果说比特币及其各种衍生币作为区块链1.0时代的产物,那么以太坊当之无愧的是区块链2.0时代的佼佼者。其主要的创新点在于账户模型的引入以及链上智能合约的加持,使得其成为了一个通用的智能合约平台,可以根据不同的业务目标组合进行动态编码实现。并把之前由比特币进行项目众筹提升到一个新的高度,基于ERC20标准代币协议的新型众筹,由此催生了一批中心化和去中心化交易所应用,并形成了一批大家熟知的交易所寡头。现在随着各种链上加密宠物游戏的兴起,ERC721协议及其相关应用场景慢慢处于研究和推广中,和ERC20不同的是其核心是不可置换代币协议。笔者相信该协议在加密收藏品、房产确权以及拍卖行等相关应用领域会大有可为。

    虽然中本聪是区块链领域的开山鼻祖,但以太坊的出现可谓区块链领域开天辟地之大事,V神也是有史以来区块链领域的集大成者,并最终将区块链技术和智能合约编程平台带向了全世界。在以太坊之前如果要进行区块链领域的应用项目开发,首先要选择一份目标项目的代码当然大部分都会选择比特币的某个分支,然后fork下来修改相关的参数并调整挖矿与共识算法等模块。而基于以太坊平台用户可以利用高度抽象的智能合约语言solidity直接描述业务需求并进行编码,然后利用平台提供的区块链底层设施和保证,无缝的将传统业务模型迁移到区块链平台,节约运营成本提高工作效率。

    以太坊账户模型的引入大大简化了相关账户状态的查询特别是余额等资金信息等,不用遍历所有交易进行计算,同时也使得复杂的业务状态迁移和切换成为可能。技术架构图如下:


    image.png

    在区块验证方面其引入了改进版本的幽灵协议(GHOST协议)加快了出块确认速度,由之前比特币的差不多20分钟提高到15秒左右,进一步拓展了应用场景和用户体验。同时为了避免算力被矿机劫持,其哈希求解采用了一种DAG方式的内存困难模式的实现,在很长一段时间都没有饱受矿机算力劫持的困扰。

    1.3.1 运行机制

    以太坊最大的特点是其引入的账户模型用于跟踪每个账户的状态变化,所有以太坊上面的状态转换都是账户之间的价值和信息的变化。账户从类型上分为外部账户和合约账户,前者由现实世界中的个人和组织通过私钥进行完全掌握,后者依附有可执行的合约代码,每个链上智能合约都直接或间接隶属于某个外部账户。合约账户中的代码不能自动执行,必须由具体的外部账户发出指令后才可以触发相应合约的代码执行。

    由于以太坊的solidity底层操作码实现为图灵完备性,因此为了限制恶意用户发布分布式拒绝攻击或者由于程序bug陷入无限循环,每个具体的操作码在执行时都要进行收费内部以gas * gasprice进行计量,并最终自动转换为以太币进行代码执行的费用收取。交易费由挖矿节点收集,节点为网络贡献算力并最终维持网络的运行。这些节点也被称为以太矿工,在以太网络中进行区块的收集、传播、确认和执行区块内的打包交易,并进行世界状态树的最终改变。矿工们先将收到的交易进行缓存和分,然后竞争区块的出块记账权,使得自己挖出的块能优先添加到全局权威链后面并最终成为区块链中的一部分,如果成功的将自己挖出的块附加到了权威链后面,那么挖出该区块的节点会得到相应的以太币的作为奖励,从而促使矿工们持续为以太网络贡献算力和维持网络。

    作为一个可编程平台,其没有对现实业务场景进行假设并预先内置一些对应的操作,相反其允许用户根据自己的业务需要来进行动态编码,并通过合适的工具部署到以太坊平台上并对终端用户提供服务。通过这样的方式以太坊可以作为一个通用的区块链平台而存在,包括但不限于各种加密货币的应用场景。承载这一功能的核心就是底层的虚拟机模块,其可以执行图灵完备的指令码并通过底层的点对点网络协议进行广播,使得每个加入以太网络的节点都执行相同的代码拷贝,并得到一致的结果,这也是以太坊平台也被称为世界电脑的原因。

    这个贯穿以太坊网络的大型并发运算并不是为了使得运算更加高效,实际上该分布式模式比单节点执行更加低效和浪费资源。由于每个节点都运行同样或者兼容的虚拟机,对相同的代码执行同样的运算和处理并得到同样的结果,进而保证不同节点间状态的一致性。而去中心化特点使得以太坊平台上的智能合约有极高的容错性和零宕机可能,储存在区块链上的数据永远不会丢失并且抗审查。

    以太坊平台本身没有特定功能或者用途具体用途是由开发者决定的,但某些类型的应用能从以太坊平台得到额外的好处,特别是那些需要在点对点用户之间直接进行交互的应用,如资产注册与投票管理等。金融类应用和对信任、安全性和持久性要求高的应用尤其适合在以太坊平台上部署。

    1.3.2 核心概念

    账户
    以太坊里面账户被明确的分为两类:外部账户和合约账户。共同点是两者都有一个以太币余额的概念并都可以发送交易。但外部账户通过私钥进行控制没有关联可执行代码。而合约账户关联有可执行代码,可以通过外部账户或其他合约激活运行,并可操作其私有的储存空间进行状态变更和查询。所有以太坊区块链上的行动都是由各账户发送的交易激活。每次一个合约账户收到一个交易,交易自带的参数都会成为代码的输入值运行。合约代码会被以太坊虚拟机在每一个参与网络的节点上运行。

    现在 不管是PC应用还是手机端应用,对外部账号的管理已经由单纯的私钥生成和管理过度到通过助忆词进行辅助管理,而且都采用了某种BIP39兼容的协议实现,方便了用户账户的使用和储存,也提高了同一账户在不同钱包软件之间的通用性。

    交易
    特指一个用来存储消息的被签名数据包,在区块链上从一个外部账户发送至另一个账户的过程。交易内部主要由以下部分组成:

    • 消息的接收者,如果为空则代表创建一个合约
    • 消息签名,用来证明消息发送者真实有效的通过区块链向接收者发送消息
    • 价值域,从发送方转移到接受方的以太币数量以wei为单位
    • 一个可选的数据域,用来储存发送给合约的消息(也就是合约的参数和函数签名编码)
    • GASLIMIT值,代表这个交易执行时最多被允许的计算步骤
    • GASPRICE值,代表愿意为每单位的gas支付的费用以以太币为计价

    而消息一般指代合约之间的调用,可以类比为区块链平台上的函数调用,其本质也是交易只是不是由外部账户创建的而是由合约自动创建的。当合约正在执行的代码中包含了CALL或者DELEGATECALL这两个命令时就会自动生成一个对应的消息。消息有的时候也被称为”内部交易”,与一个交易类似一个消息会导致接收的账户运行它的代码。因此合约账户可以与其他合约账户发生调用关系这点和外部账户一样。

    gas、gasprice与gaslimit
    gas的概念其实是由以太坊所首创的也是饱受争议比较多的概念之一。合约代码的执行会在所有参与节点中被多次重复,这使得合约执行的成本变得昂贵,所以这也促使大家将能在链下进行的运算都不放到区块链上进行。同时另外一个主要原因是虚拟机操作码的本质是图灵完备的,也就不可避免的要考虑死循环等恶意攻击等情况,一个恶意交易可以通过发动死循环使得整个以太网络瘫痪使得这样的交易是不可忍受的,所以以太坊设计之初就引入了gas,每个被执行的命令都会有一个特定的消耗用单位gas计数并最终以以太币进行收取。

    每笔交易都被要求包括一个gas limit和一个为每单位gasprice支付的以太费用。矿工可以有选择的打包这些交易并收取这些费用。在现实中所有的交易打包最终都是由矿工选择的,但是用户所选择支付的交易费用多少会影响到该交易被打包所需等待的时长。如果该交易由于计算包括原始消息和一些触发的其他消息,需要使用的gas数量小于或等于所设置的gas limit,那么这个交易会被处理。如果gas总消耗超过gas limit那么所有的操作都会被复原,但交易本身是成立的并且交易费任会被矿工收取。以太坊会显示这笔交易完成尝试,但因为没有提供足够的gas导致所有的合约状态更改都被复原。所有交易里没有被使用完的剩余gas都会以以太币的形式返回给交易发起者。因为gas消耗一般只是一个大致估算所以许多用户会超额支付gas来保证他们的交易会被接受,一个有指导意义的建议是在发生网络拥堵的时候,为了加速交易的生效故意支付一个比较高的gasprice。这没什么问题因为多余的gas会被退回给你。

    每笔交易有gas limit属性同时每个区块也有gas limit属性,其特指当前区块允许的最多gas总量,以此可以用来决定单个区块中能打包多少笔交易。目前区块的gas limit是4712357gas, 表示着大约224笔转账交易(gas limit为21000)可以被塞进一个区块(区块时间大约在15-20秒间波动)。

    智能合约与solidity
    智能合约这个术语至少可以追溯到1995年,是由多产的跨领域法律学者尼克·萨博(Nick Szabo)提出来的。定义如下:一个智能合约是一套以数字形式定义的承诺,包括各个合约参与方可以在上面执行这些承诺的协议。更通俗的理解就是合约是一段储存于计算机系统,当特定条件满足后可以自动执行的程序。当区块链系统特别是以太坊平台出现后,其天生的去中心化、无法篡改、透明以及可编程等特性成为智能合约理想的载体,两者的结合迸发出了科技史上一朵灿烂的风景。基于以太坊平台的智能合约其实就是在以太坊区块链上运行的一段特殊程序代码,透明的完成既定的业务逻辑,去中心化和无法篡改等底层特性由平台直接提供支持无须从头开发。

    Solidity是以太坊平台提供的用于智能合约编写的首选编程语言,它的语法接近于Javascript是一种面向对象的语言。但作为一种真正意义上运行在区块网络上的去中心合约编程语言它又有很多的不同,下面列举一些:

    • 以太坊底层是基于帐户模型的,有一个特殊的Address的类型用于定位用户和合约
    • 由于语言内嵌框架是支持支付的,所以提供了一些关键字如payable,可以在语言层面直接支持支付
    • 存储是使用网络上的区块链,数据的每一个状态都可以永久存储,所以需要确定复杂变量的储存位置
    • 运行环境是在去中心化的区块网络上,会比较强调合约或函数执行的调用的方式,就是要明确区分内部调用还是外部调用
    • 最后一个非常大的不同则是它的异常机制,一旦出现异常,所有的状态修改都将会被回撤,这主要是为了保证合约执行的原子性,以避免中间状态出现的数据不一致

    1.4 常用术语

    整个以太坊协议及其生态涉及大量的新生事物和专用术语,是一个有机集合了密码学、计算机工程学以及分布式网络计算的综合课题和工程实践,针对同一事物或者概念不同的文章和作者有不同的称呼。在此收录涉及以太坊智能合约编程相关的一些专用名字和术语,并作为一个相关常用术语的快速参考指南。需要额外说明的是术语的排列顺序是按照其英文字母序排列,而非其在以太坊生态中的重要性来排列,而且同一个概念或者术语对不同读者来说其重要性也不同。

    账户(Account )
    是整个以太坊生态系统中的一个重要抽象对象,其主要属性包括地址、余额和交易幻数,以及可选的存储空间和可执行代码。以太坊中的主要账户分两类:外部实体控制的普通账户(也就是常常说的EOA账户)和合约账户。这两种账户最大的区别有两点:1 合约账户关联有可执行的代码和对应的状态变量储存空间而EOA账户没有;2 EOA账户的交易幻数是指其成功发出的历史交易数量而合约账户的交易幻数是指合约创建的其它合约的数量。

    地址(Address)
    通常情况下是指一个区块链上的账户对象,包括EOA账户和合约账户,能够发送或接受交易。在更低层次的视角看,其本质是椭圆曲线上某一公钥进行Keccak哈希运算后的右边160位结果并以16进制的方式表示为20字节的字符串。

    区块(Block)
    以太坊中区块是指一系列信息的集合,包括本区块中收集的交易相关信息,关于其他区块的头的信息以及实际的交易集合等。区块本身则是由矿工加入的以太坊网络的。

    区块链(Blockchain)
    在以太坊中一系列通过内置的工作量证明系统所验证的区块彼此相连,并且每个区块都保留其父区块的哈希直到创世区块,由于很类似数据结构中经典的链表结构因此也被称为区块链。以太坊中区块并不想其先祖比特币那样限制区块大小,其是通过区块所能消耗的汽油上限来间接控制区块大小。

    字节码(Bytecode)
    是一种抽象的针对以太坊虚拟机的指令集,其表示方式是16进制形式。上层的solidity等高级合约编程源码最终会通过一系列变化转换为字节码来支持在以太虚拟机中的执行。

    编译(Compiling)
    以太坊中的编译是指将上层用高级语言如solidity、vper等编写的智能合约源码转化为以太虚拟机能理解和执行的字节码的过程。

    去中心化自治组织(DAO)
    如果一个公司或组织的运作不依赖于传统的层次化管理模型,则其为一个标准的去中心化自治组织。在以太坊中DAO有时也指一个特殊的ICO合约,该合约与2016年上线以太主网并在短时间内被黑客攻击并盗走大量的以太币,导致了以太坊历史上争议最大的一次分叉,并最终造成了ETC和ETH的两条公链的并存。

    去中心化应用(DAPP)
    最小可行的去中心化应用其后台功能完全由一个智能合约驱动,然后通过一个web前端界面和用户进行交互。更严格的来说其是指具有如下特性的一类特殊的应用,其构建于开放并且去中心化的点对点基础服务设施之上,如去中心化的智能合约平台以太坊;去中心化储存平台IPFS以及去中心化消息协议whisper等。其表现形式包括但不限于web应用,常见的手机应用或pc端应用都可以被称之为去中心化应用。

    契据(Deed == NFT)
    主要是指由ERC721以太坊改进协议所引入的不可置换通证标准。契据主要是用来证明指定数字资产的所有权的,每个数字资产都有唯一ID进行标记而且具有不同特性的,因此不像ERC20通证其彼此之间是不可置换的。但由于每个数字资产都有所有权而且可以被跟踪,可以通过第三方进行所有权交易。虽然契据目前还不是现实中法律所认可的电子表现形式,但谁能确保将来会发生什么呢。

    计算难度(Difficulty)
    全网范围内的一个动态参数,用以控制为了完成当前的工作量证明所需的计算量。

    数字签名(Digital signature)
    在非对称加密体系中数字签名主要是指这样一个过程,私钥的拥有者对一段特定的输入文档产生一段特定的简短输出结果,输出结果也称为源文档的签名;其他任何人都可以用签名者对应的公钥证明该文档确实是由指定的私钥拥有者签署的;另外文档的数字签名也常常用于证明源文档自签名生成后没有被更改。

    椭圆曲线数字签名算法(ECDSA)
    非对称加密体系中有多种签名算法可选如RSA等。比特币和以太坊的实现中采用的是椭圆曲线签名算法,和RSA相比达到同样的安全要求所需的储存和计算量大大减少。在以太坊中该算法确保了资金只能被其真实的拥有者进行花费。

    以太坊改进协议(EIP)
    主要用于描述由社区提出的针对以太坊平台的改进建议。如果建议讨论通过并被采纳,将会成为以太坊正式标准并被编号,在后续版本的以太坊实现中生效。

    以太坊命名服务(ENS)
    以太坊域名服务主要用于将一个以太坊域名和账户地址进行关联,在进行目标地址转账或合约交互时可以指定以太域名,然后通过ENS合约转换后得到真实的以太地址。

    以太币(Ether)
    以太坊生态系统中的原生加密货币,用以支付转账或合约交互时的汽油消耗,一般简称为ETH。

    事件(Event)
    事件是合约中对底层日志功能的封装,DAPP可以通过监听事件来知晓合约内部执行的细节,并触发相应的回调函数来进行用户界面的更新。

    以太坊虚拟机(EVM)
    以太坊虚拟机是一个基于栈结构的虚拟机,用于解释执行其相关的字节码。其执行模式为给定一系列的初始环境变量以及待执行的字节码流,执行后如何改变相应的全局系统状态值。具体的状态改变实现技术细节是通过以太坊黄皮书进行了正式的规范定义。

    虚拟机汇编语言(EVM assembly language)
    是EVM字节码的一种人类可读形式表示。

    陷进函数(Fallback function)
    是合约中的一个特殊函数,当没有匹配的函数或参数进行定位是自动触发的一个函数,每个合约有且只能有一个这样的函数。

    水龙头(Faucet)
    一般指用于免费分发测试以太币的web服务或者智能合约,以方便开发者在测试网络上进行智能合约的测试和DAPP的测试,而不需要消耗真实的ETH。

    巧克力酱(Ganache)
    一个著名的以太坊私有链模拟环境,能方便、快速而且免费的进行智能合约的测试,其前身为TestRPC,同时提供图形化用户界面以及命令行界面。

    汽油(Gas)
    以太坊中用于执行智能合约的所需的虚拟燃料。EVM采用账户模拟来衡量智能合约执行时的资源消耗,主要用来防止合约陷入死循环把资源耗尽从而导致整个以太系统不可用。

    汽油上限(Gas limit)
    汽油上限主要用途在两个地方:交易和区块。交易中的汽油上限主要是为了限制当前交易的执行步骤;区块的汽油上限主要是限制当前打包的所有交易总的汽油消耗上限进而间接限制一个区块中能包含的交易数量。

    哈希(Hash)
    是一类特殊函数的总称,特点是不管输入内容内容长度为多少,其都会产生固定长度的输出,而且输入源中的一点细微变化都会引起输出内容的强烈变化。以太坊中大量使用的Keccak256哈希函数是SHA哈希标准的一个具体实现。

    分层确定性钱包(HD wallet)
    是指这样一类钱包软件,其实现符合键生成和转换的分层确定性协议,也就是常说的BIP32系列协议。

    钱包种子(HD wallet seed)
    钱包种子是用来生成一个HD钱包账户主私钥和主网络代码的特殊值。其一般通过助记词的方式进行表现,以方便人们拷贝、备份和恢复私钥。

    合约的不可更改问题(Immutable Deployed Code Problem)
    当一个智能合约或库代码经过编码、调试并最终发布到区块链上后,其就永久存在而且不可更改,不管是修复错误还是添加新特性。然而传统的软件开发标准实践依赖于对旧有系统进行错误修复和添加新特性,这在智能合约的开发中是个不小的挑战。

    内部交易(Internal transaction == message)
    是指从合约账户中发送到另外一个合约账户或EOA账户的交易。

    键值扩展函数(KDF)
    也就是常说的密码拉伸算法,主要是为了保护keystore格式的账户文件免受暴力破解、字典攻击以及彩虹表攻击的威胁,其实现本质是对密码进行多次哈希运算。

    账户文件(Keystore File)
    最早出现也是最普遍使用的账户文件格式,内容以json格式进行编码。其编码内容包括加密后的私钥以及相关的加密参数。

    库(Library)
    库是一类特殊的智能合约,除了不能有接受支付的函数、不能有陷进函数、不能有数据存储空间等特性外,其他和普通的智能合约一样。其特性决定了其不能接受或保管ETH外,也不能包括状态变量,其主要使用场景是发布到区块链上后作为公共的基础计算和处理模块,来简化后续合约的开发避免重复制造轮子。

    轻客户端(Lightweight client)
    不同于geth或parity等传统客户端,轻客户端在本地不保存区块链的副本数据,也不对区块或交易进行有效性验证。其主要功能是在本地完成账户管理功能,以及创建交易和广播离线签名到其连接的客户端节点。常见的轻客户端有metamask(浏览器插件)、jaxx(多平台支持)、imtoken(手机客户端,另外2个比较常见的手机客户端是PandaX和TrustWallet)。

    幻数(Nonce)
    在密码学领域中幻数是指只用一次即会被丢弃的值。以太坊实现中幻数主要有三方面作用:1) EOA账户中用来记录已经成功发送的交易的数量,主要是为了防止重放攻击;2)合约账户中用来记录其创建的新合约的数量;3)工作量证明计算中用来校验指定的随机数是否满足难度计算要求。

    私钥(private key)
    在以太坊中是一个特别私密的数据主要通过产生有效的数字签名用来证明资金和合约的所有权归属。早期客户端实现中是通过随机数生成的,现代的客户端都大部分都是通过一个方便记忆的助记词派生的。以太坊中的私钥以及派生的公钥和地址等组成了抽象的账户。

    公钥(Public key)
    是一个由私钥通过单向运算函数计算的结果值,其可以被公开的共享使得任何人都可以验证其对应私钥产生的数字签名的正确性。

    交易凭证(Receipt)
    是由以太坊客户端针对特定交易返回的结果集,以json方式进行编码。内容主要包括交易的哈希、打包区块号以及实际消耗的汽油等信息。如果是合约部署交易还包括新部署的合约的链上地址。

    重入攻击(Re-entrancy attack)
    一种比较常见的合约攻击手段,特别是在智能合约发展的早期其造成了大量的ETH资金损失。其攻击过程大致为首先部署一个经过精心编写的攻击者合约,然后在攻击者合约内部函数中(通常是陷进函数)调用目标受害者合约漏洞函数;并且在目标受害者合约函数调用前递归的调用目标漏洞函数。

    集成开发环境(REMIX)
    一个方便好用的而且功能强大的solidity集成开发开发工具,基本包括了智能合约开发、调试和部署相关的所有功能,目前为止也是最为强大的solidity开发IDE。

    安全哈希算法(SHA)
    SHA是指美国NIST发布的一系列安全哈希算法总称,其中比较常见的SHA3。由于该标准正式发布时间晚于以太坊开发启动时间,因此以太坊实现时用的是自己的哈希算法Keccak,其遵循SHA规范标准只是在个别地方进行了调整。

    智能合约(Smart contract)
    永久的存储于区块链中,在整个以太坊环境下分布式运行并得到一致结果的特殊程序。

    索丽提(Solidity)
    用于编写智能合约的高级语言也是目前最主流的合约编程语言,语法类似于JS、C++和java的混合体。

    嵌入汇编(Solidity inline assembly)
    在solidity中混用EVM汇编语言,以完成一些特殊的操作如判断指定地址是否有可执行的EVM代码。

    测试网络(Testnet)
    和主网并行运行的特殊网络主要用于测试目的,其行为特别是EVM对智能合约的解释与执行和主网保持高度一致但确实免费使用的。目前比较主流的测试网络是ropsten,主流客户端如geth和parity以及以太云节点infura都提供对ropsten测试网络的支持。

    交易(Transaction)
    这个是以太坊中最重要的概念之一,整个以太坊世界状态机的状态切换都是由交易所引起和推动的。其本质是一段特殊的数据由源账户进行数字签名后,提交到区块链链并标记了此交易要发送到的目标账户。并且交易相关的元信息中会包括此交易携带的ETH数量、汽油上限以及汽油价格等信息。以太坊中的交易主要分三类:简单的转账交易、合约创建交易以及合约调用交易。

    醋粉儿(Truffer)
    一个流行的用于开发智能合约及配套web页面的框架集。

    图灵完备(Turing complete)
    在可计算性理论里,如果一个系统的数据处理规则(如指令集、编程语言、细胞自动机)可以用来模拟单带图灵机,那么它是图灵完备的。

    钱包(Wallet)
    初期主要功能是保存私钥文件集合的软件,用以完成以太账户管理并和合约进行交互。现在的钱包软件都不直接保存用户私钥文件而是从离线保存的助记词等恢复账户或新生成账户,大都遵循BIP32、BIP44等工业标准等以提供额外的安全性保证。高级的钱包软件还提供DAPP的索引和交互界面。

    第三代互联网标准(WEB3)
    指区块链技术驱动的第三代互联网标准,其概念由以太坊灵魂人物伍德(Gavin Wood)大神首次提出,并实现了一个可用的js框架库web3.js,并成为后续各种变形版本的基石。

    伟(Wei)
    ETH的最小面额单位,1 ETH = 10**18 WEI。以太坊中完整的计量单位如下表示:

    image.png

    1.5 本章小结

    本章首先从比特币及区块链技术的起源出发,介绍了以太坊兴起及发展历史背景以及与此相关的一些人和事,并穿插了笔者自己的一些行业经历,尽量从多角度介绍区块链技术在在国际国内的发展状况以及整个行业经历的一些事情。然后从技术角度剖析了比特币、区块链以及以太坊相关的一些基础性的概念知识,最后重点介绍了以太坊普通及其引入的智能合约编程语言solidity。同时将智能合约编程过程涉及的一些常见术语和专有名词进行了汇总,方便读者进行快速才参考。

    不管是从事私有链、联盟链还是公有链开发,以太坊都是不错的起点并具有很高的性价比。现在新出现的区块链项目都是号称超越以太坊,领导区块链3.0但实际效果可能还有待考证,不过令人欣慰的是不管是哪个区块链项目智能合约已经成为标配,并且大部分都兼容solidity,因为solidity作为链上智能合约的第一个落地实现,已经有了大量成功的商业应用和案列。因此无论从那个角度讲对solidity进行技术投资和储备总是会有丰厚的回报的。本章对背景知识和基础概念进行了全面介绍,从下章开始我们就进入实际操作环节。

    相关文章

      网友评论

          本文标题:1 以太坊基础

          本文链接:https://www.haomeiwen.com/subject/oqwvictx.html