迷思
首发于迷思

比特币浅析

与比特币首次结缘大概是 2013 年我结束创业,回到 Juniper 时。有阵子,饭桌上我的同事东哥经常会眉飞色舞地谈起很多关于比特币和中本聪的轶事,还有他做量化交易的有趣经历,并常常劝我也看看这个主题 —— 即便那时我对此并没有太大的感觉。经历过一次如梦般的创业历程,我还在艰难适应朝九晚六的坐班身份,以及,谋划着未来肉身翻墙的事宜。我浅浅看了网上有关比特币的中文资料,简单将其和电子货币画上了等号,根本没有阅读中本聪的论文,也没有关注任何一篇比特币的技术文章,就将其抛诸脑后。

再度被拉回比特币的世界,是去年八九月的事了。有朋想尝试量化交易 —— 我想起了东哥曾经做过这事,又觉得这玩意挺有意思,就拉他一起,业余时间用 elixir 和 datadog 草草做了个 demo(见我的文章:闲扯比特币套利交易系统的设计)。后来大家觉得这事投入资金不小,扣除交易手续费后的收益不大,我们又没有太多的时间仔细打磨,就没有继续下去。

这两次和比特币都是擦肩而过,并没有触及其核心,我所有关于比特币和 blockchain 的知识都源自非技术圈的小道消息。直到最近,朋友老冒的 ArcBlock 引起我的注意 —— ArcBlock ICO 公募启动后不到二十分钟便宣告售罄,还因为散客们投资热情过分高涨,让 ethereum tx 大量积压,引发震动。老冒谈起他入坑的心路历程,是这么说的:『一件事情如果我看不懂,要么是这事本身不靠谱,要么是我能力有限,没看透。但是如果靠谱的人做一件不靠谱的事情,那么可能是我错了,事情本身靠谱,我没看透而已。当我微软的同事,我所敬仰的大牛 Flavien Charlon 也出来做 colored coin 时,我被震动了。我开始严肃看待 blockchain。』



(ethereum tx 拥塞)

我一时呆若木鸡,我对比特币和 blockchain 技术的漠不关心,是否也是我并没有看懂看透这本来靠谱的技术?在老冒的鼓动下,我决定真正深入 blockchain 的技术细节,去探究这种让牛人纷纷为其痴迷(我指技术上)的真正原因。我圈了一批 paper 和白皮书,下载了若干源码,找了若干文章后,开始在周末的时间里撸袖子看起来。在草草一刷比特币创世论文(Bitcoin: A Peer-to-Peer Electronic Cash System),一些白皮书,还有各种文章和视频后,我越来越觉得我有必要把那些基础的问题搞懂 —— 尤其是在主流的技术解读都是流于表面的情况下,比如说:

  • 为什么用 PoW?
  • blockchain 的数据结构长什么样子?
  • 为什么一个 block 要设计成 1M,而一个 block 生成的时间限定为 10min?超过或者小于这个时间怎么办?
  • 为什么币的总量 21M?(为什么 TM 不是 2 的幂?或者一个更大/更小的数字?)
  • tx 为何设计得如此奇特,可以多 input 多 output?
  • 为何 verification 这样一个看似简单的过程要用 opcode 来完成?
  • 如果使用 open ledger,security 和 privacy 是如何保证的?
  • WTF base58?
  • 为什么钱包不直接用 public key,而是 hash 一下多此一举?
  • 为什么会允许不包含任何 tx(除了 incentive tx 外)的 empty block 存在?为什么大家不借此 game system,获取先发优势?
  • 钱包是怎么回事?钱包需要整条链的数据么?
  • 量子计算是否是比特币的终结?
  • 为什么,为什么一个 2008 年的学者,能如此清晰冷静地面向未来思考,面向未来编程?十年后,他所提出的架构仅仅是小修小补,作为一个 ledger,并无大的问题(Ethereum 解决的问题 bitcoin 本来也没打算解决)?

这个问题列表几乎是无穷的。带着这些令人兴奋的问题,我重读了中本聪的论文。和上一次的漫不经心相比,这次,我几乎是跪着读完的。为了吃透小小的 8 页文字,我还翻阅了不少他当年向旁人解释论文的邮件(感谢 mail-archive),以及 V 神早期对此解读的一些文章。我发现我陷入了 the more you know, the more you don’t know 的狂喜 —— 有点 Alice 掉进 rabbit hole 的感觉,或者,一种言语难以形容的 serendipity。我终于从以前那种懵懂无知,步入到了知耻后勇的境地。

按照我的 learning by teaching 的尿性,二刷比特币创世论文后,我便忙不迭地做了 slides,给 team 讲 bitcoin 里面那些激动人心的思考和实现。slides 我就一一不贴了,下面是其中一页:


单单就这一页,就有好多好多值得问的问题:

  • 为什么这个数据结构里面的值要用 little endian?这是设计缺陷还是别有用心?(别轻易下结论,考虑约定俗成的网络序都是 big endian)
  • 为什么计算 nounce 时,不用整个 block,而是选择了这些域(尽管 integrity 还是通过 merkle root得到了保证)?
  • 为什么要费力把 tx 组织成 Merkle Tree 的形式?

不多说,大家自行去 github.com/tyrchen/unchained 下载阅读(我会根据我所学随时更新它)。


说些题外话。互联网时代,做网络协议开发的工程师(简称网工)是个吃力不讨好的差事。价值链的上移让网络设备和基础设施管道化,应用赚够了钱而基础设施也就温饱。虽然不应该用「造原子弹的不如卖茶叶蛋的赚钱」来比喻,但有着十年经验的网工收入比不过两三年经验的脚本小哥是不争的事实。论工作的难度,常年跟红黑树,skiplist,ager ring,hash table 打交道,写段代码不得不考虑 endian issue,定义个数据结构要想着 fit in cache line,有时恨不得一个 bit 一个 bit 扣的网工,要比不管三七二十一,什么都塞到一个 object (dict/map) 里,cache line 啥玩意没听过,传个 bit 都用 json 的脚本小哥工作起来困难的多。可惜的是,你不在价值链的上游,你所有的努力,所有的 proof of work,在互联网,移动互联网的浪潮里,好像荷叶上泻过的水,留不下一点痕迹。这很不幸,但这就是现状。

然而 blockchain 在试图扭转这个价值链,让网络层和传输层,而不是应用层,重新变得重要起来:在这次洪流中,网络开发(及系统开发)的价值重新凸显 —— 你看,比特币的设计中处处体现着对网络的深刻理解,对内存的精妙使用,对数据结构和基础知识的无比重视 —— 别的不说,光是 block header 的结构,那个 0xD9B4BEF9 的 magic number 就让人嗅到了初恋的味道(0xdeadbeef,你丫可好?)

所以,blockchain 可能是网工最好的翻身仗 —— 上不上车不重要,先入坑吧,搞些技术储备总归是好的。没准就相当于 44 年入党了呢?

(谨以此段题外话献给那些和程序君打过交道的,或者没打过交道过的网工们)

发布于 2018-02-23

文章被以下专栏收录