深入理解EVM

原文在这里: https://blog.qtum.org/diving-into-the-ethereum-vm-6e8d5d2f3c30

Solidity offers many high-level language abstractions, but these features make it hard to understand what’s really going on when my program is running. Reading the Solidity documentation still left me confused over very basic things.

What are the differences between string, bytes32, byte[], bytes?

Which one do I use, when?What’s happening when I cast a string to bytes? Can I cast to byte[]?How much do they cost?

How are mappings stored by the EVM?

Why can’t I delete a mapping?Can I have mappings of …

我理解的区块链

我从2016年开始接触比特币技术,一年多以前开始读比特币源码,从比特币摸到了以太坊,再从以太坊接触到了EOS, CITA,Hyperledger Fabric等,对区块链的认识和理解也浅入深,虽然离专家水平还太远,打算从技术角度说说我的理解。

小说<三体>有一段类似的话:

一个穷凶极恶的人,如果想让别人认为他是安全的,那么他必须自己把手绑起来,而不是手里拿着刀。

在一个黑暗森林的守宙中,一个文明想证明自己是安全的,那么必须把自己裹在低光速黑域中。

我觉得如果说整个互联网是一个黑暗森林,那么区块链也许就是能证明一个互联网服务是安全的,或者是可信任的。因为区块链技术已经把信息篡改的手已经绑起来了。

分布式账本

首先,区块链是一个分布式账本,人类早就知道鸡蛋不能放在同一个篮子里,要分在不同一篮子里,这个比喻当然不够恰当,因为区块链里的分布式账本,是把一份同样的账本分别存储(备份)到不同的机器,如果是一条公链,任何人都可以备份到这个账本;如果是一个联盟链,加入到这条链的所有许可机器,都可以备份到账本。

这些账本只要有数据更新,就全立即同步,把更新内容同步到其它的机器上。只要网络不出问题,都会努力使自己的账本数据最新,这样账本就有了公开性。分布式存储,这个概念并不新鲜。

把一定时间内(比如10秒)的记账数据(交易)打成一个包(按照一定的结构组织起来),区成一个区块,这个区块中放入了上一个区块的区块hash,当下一个区块打包时,也将当前区块计算出来的hash放入区块中,这样就形成了一条单向链表,从0块到N块的一条链。

那么是怎么做到不可篡改的呢?对于区块链来说,不可篡改这个概念其实并不准确,由于块中只记录了交易,所有的数据状态改变都是通过交易来完成,只能说所有的数据篡改都会留下痕迹。

当机器(节点)收到新的数据(块)时,就会对数据进行验证,把每一条交易都检查一遍,如果是合约,那就用把交易再本地虚拟机里再执行一遍,只有全部都检查通过了,才会接收这个最新的块。(由此也可以想到随机数为什么是伪随机数)

共识

决定谁来打包这个块,就是共识。也就是大家共同维护同一账本的共同约定。

为了维护同一本账本,必须要先出一个打包交易的机器,这样账本才能不断地更新数据和状态。但怎么选择哪台机器来作这个工作,里面却是充满了现实中人类社会协作的影子。

给出一道题,谁最快解出来谁打包(pow)

能力越大,责任越大(pos)

选出一群人来代表群众(dpos)

投票得到大多人承认,就是合法的(BFT,PBFT,Tendermint)

区块存储 

从区块链存储的角度,我觉得区块链只是一种新的信息的组织方式。

经典的软件架构设计模式MVC,即模型,视图,控制器。

如果把MVC模式来理解区块的存储,我觉得可以分为MVS,即模型,视图,存储。

V:视图,区块只是存储数据的一种视图,我们同步到的区块有区块头,交易列表等,这些都只是存储的数据的外在表现,而并非实际的存储就是如此。

M:模型,把底层的数据用各种树的形式结构化起来,目的是为了更好地检索和更新。

S:存储,真正存储在各种key-value数据库中的数据

区块存储以后打算展开再来写。

应用

既然区块链只是一种新的信息组织方式,我觉得区块链的应用在于信息本身。

1.信息公开,区块链的特点并不是不可篡改,而是把所有修改信息的痕迹都记录下来,基于这个特点,可以用来做信息公开,这样信息公开方就相当于把自己修改信息的手绑起来了。想到前几天电影流浪地球的影评被修改的问题,是不是可以使用区块链技术来消除市场的质疑。现在的各种产品溯源,也是这种想法。

但这样会不会又引发另一个问题,就是为了圆一个谎言,需要再编5个谎言去圆它。 

2.信息标准化。联盟链各组织之间,通过区块链实现信息共享和标准化,现在各银行之间已有的安全认证机制是否有可能替代。

挑战

区块链是利用密码学技术,达到某种共识的分布式账本。我觉得在应用上也存在几个挑战:

密码学:这是区块链应用最重要的基础之一,所有账户,交易都基于密码学的安全性,如果密码学本来出现问题,比如sha-2被攻破,公私钥被破解等,那现有的公链的安全性将无复存在。

共识:我觉得找到一种高效安全的共识,能高效地使用区块链的关键

2018以及近况

2018

2018年过得太快了,一恍而过。

这一年在杭州,全身心投入到区块链的研发之中,为公司的技术方案调研的时候,看了很多大大小小项目的源代码,包括读的比较深入的bitcoin,go-ethereum,Cita以及Poa bridge。对区块链的底层技术学习了一遍,以太坊的一整套技术架构也深入地学习了一遍,自己从一个区块链的入门到对区块链技术有一定的理解。都发生在这一年。

这一年要接触的技术太多了,感觉自己以前所积累的还远远不够用,前几年每年解锁一项新技能,除了Lua外,这一年全部用上。还是庆幸自己前几年的坚持。坚持linux和linux方向是最大的益处,这一点上,这一年里也影响了其它同事,不知道是在给他们挖坑还是帮助,不可而知。

这一年,对技术的理解更上一层楼,更加觉得只有掌握底层技术,才能更加好的驱动上层技术。

这一年学了rust语言,这是我遇到过了最麻烦的语言,但是到现在都使用不好,不能用原来的类C的语言的作对比,rust就是一个新的物种,但是它的安全性却是公认的,对于c和c++来说,一个sengmentation fault 就让多少程序员白了头,rust最大的优势就是能避免此类错误,我觉得用来开发区块链是比较合适的。

这一年读的书比较少,但都很厚很厚:

<重构>:如何更好的修改和重新设计既有代码

<unix环境高级编程>:对unix/linux系统开发接口进行了解,但说实话对工作没有直接的帮助

<unix网络编程>:看了卷二,严格意义上讲不应该叫网络编程,应该叫进程间通讯应该更恰当一些,整本书讲的就是讲各种进程间的通讯模型,读完对进程间通讯有了彻底的理解。这本书和<unix环境高级编程>的进程间通讯部分有重合。

年底,工作各种不顺,区块链市场变冷,公司裁员,项目搁浅,只留我带两个人继续开发一个dapp平台。我也有了离职的做想法。

去年一年多没有写博客,一来是工作忙,二来是一些研究性的东西,在没研究明白之前也不敢写出来误导大家,在研究明白后也不想写了,其它说到底,还是自己变懒了,自己的文笔表达也生疏了。今年要坚持写博客。

近况

过年后离职在家,休息了几天,开始找工作。顺便看一些书,把自己的知识点重新梳理一下,把理解不深的知识补一下,做IT的,在大悲剧在于要不断地学习新的知识,我想一大乐趣也在于此吧,试问有谁能趟在老本上吃一辈子,我现在对新的东西还是充满了兴趣。

对于找工作,才发现自己已经有那么久没找过工作了,简历也不会写了,于是慌的一逼的我赶紧去找了一些模板,最后还是发现用markdown的方式写最符合我的性(尿)格(性),理科生思维。但是写自己的经历的时候,怎么看都觉得生硬。总之,找工作这事,也不着急,欲速则不达吧。

对于区块链最近思考的比较多,我一直觉得从技术角度,区块链没有新的东西,新东西只有区块链理念,以及组织信息的方式。从技术上讲没有难的东西,但是一个相当复杂的系统,做区块链系统架构,就比如一个主板厂商,用各种已研发出来的零部件组合成一个稳定高效的集成电路系统。而对于区块链系统来也,保持稳定,安全,高效也是一个最重要的任务。