我相信区块链的未来,相信技术,相信分布式。
简介
正在看这篇文章的你,应该是一名被区块链技术所吸引的开发者或者极客。我相信你已经理解了区块链的技术原理,并急切地想要搞清楚这项技术将为你和你的开发技术栈带来怎样的影响。
如果你需要更基础的区块链技术介绍,可以阅读比特币和以太坊的白皮书。
这篇文章的目标是:
解释区块链项目的开发和现有软件开发模式的区别。
提供上下文,帮助你更好地思考该领域的机遇和挑战。
提供区块链领域的基础资源和资料,便于开发区块链项目。
开发模式的转变
互联网的网络效应产生了大量的中心化的数据,这些数据促进了互联网应用的发展。受惠于共享开放的网络协议(比如 TCP/IP,HTTP),诸如 Yelp,Facebook 和 Amazon 这样的公司得以把自己的用户——当然也包括用户产生的数据——集中存储在自己的服务器上。这样一来,这些互联网巨头们除了比用户量小的企业更有优势之外,他们还对自己所拥有的海量用户数据如何变现有着 100% 的控制权。用数字货币投资者 Joel Monegro 的话说就是,现有的互联网模式使得绝大部分的价值被应用层所攫取,而应用层的基础,也就是底层的协议层则获利很少(即,“胖”应用层,“瘦”协议层模式)。
相反,区块链技术带来的价值分布模式,可以被理解为是一种“胖”协议层,“瘦”应用层的模式。正是密码学货币的创新,使得这种模式成为可能。正如 USV 的 Albert Wagner 所说:
“一直以来,靠协议赚钱的方式只有一种,那就是基于该协议开发软件并出售(当然最近都转为出租了)… 然而密码学货币则提供了一种直接在协议层变现的可能,并且随着基于该协议的应用越来越丰富,底层协议的变现能力也会随之越来越强,反映在数字货币上就是价格越来越高。”
从前那些互联网开放协议的开发者们,也就是 DARPA 网的研究员们或者那些无偿的贡献者们,并不会因为开放协议的发展或基于其上的应用越来越多,而获得直接的经济回报。不同的是,现在的协议开发者们可以直接发行数字货币了,比如比特币或以太币,而这些数字货币则直接代表了去中心化协议的价值。
Joel Monegro 相信,区块链技术所带来的这种模式上的转变,将促使开发者重新审视自己的应用。“数据的开放共享和内生激励机制的结合,最终会终结“赢者通吃”的市场现象。这将改变应用层的游戏规则,并且催生一批有着全新业务模型的公司。而这些公司业务模型的不同将主要集中在协议层。”
以太坊
前面的讨论带给我们的结论是:区块链技术带来的创新让开发者们可以直接在协议层获得价值。接下来我们将继续讨论,区块链技术是如何朝着开发者友好的方向演进的。8 年前,一种无需中心化金融机构背书的数字货币出现了,它就是现在人们耳熟能详的比特币。一开始,开发者们试图将数据直接存储在比特币的区块链上来开发应用,结果表明,这种方式非常低效(Joel 的这篇文章是个很好的例子)。其中一位开发者 Vitalik Buterin 实在是受够了比特币对于新特性极端谨慎和保守的态度,于是他开发了一个新的区块链平台以太坊(Ethereum)。
比特币的初衷是创造一种新的价值存储的媒介。以太坊则是为了实现一个图灵完备的区块链开发平台。在以太坊网络中,开发者们可以使用 Solidity 这门编程语言编写智能合约,这些合约则由以太坊虚拟机(EVM)来运行。从 Vitalik Buterin 的例子中我们不难看出,开发者们完全可以开发一个全新的区块链网络,以此来满足自己多样的需求。当然,从头开发新的区块链网络也有缺点,比如你要从头开始构建开发者社区。但直接在类似以太坊这类成熟的网络上开发,则没有这样的问题。而且一个显著的不同是,开发基于区块链网络的应用,开发者不仅会是这个应用的所有者,也会成为因此而繁荣的底层协议的直接受益人。
去中心化应用(Dapps),代币和智能合约
现在的开发者们基于现有的区块链协议(比如以太坊)开发出了满足不同用户需求的去中心化应用(dapp)。开发者一般会在 dapp 中发行自己的代币(token),用户可以通过消耗代币来让 dapp “执行”相应的操作来实现某个“功能”。代币其实并不神秘,你可以把它想象成人们在商场的电玩世界里买的游戏币。这些通过“智能合约”实现的“功能”通过收取一定的费用(代币),使得 dapp 可以在不依赖第三方的情况下对外提供可靠的服务。用游戏币来类比就是,只要有足够的游戏币,你随时都可以把游戏币塞到篮球机里玩一局!
一般情况下,代币的总量是固定的,因此随着某个 dapp 提供的服务越来越流行,基于简单的供需原理,代币的价格肯定会水涨船高。基于这个逻辑,dapp 的开发者们往往通过发售代币的方式来募集开发资金(而不是通过传统的融资渠道),这一过程的另一个众所周知的名字就是 ICO(初始代币销售)。
看到这里你可能会问,“为什么每个 dapp 都要发行专用的代币,而不是用现成的,比如以太币(eth)呢?”。这个不难解释,因为专用的代币利于特定应用生态里的小微经济。换句话说,专用的代币可以针对应用的特定功能和需求作出灵活的调整,如此一来,这个代币就能更好地服务于这款 dapp。说到这里,我们不得不提到以太坊(Ethereum)。以太坊正是这么一个让 dapp 开发者们可以方便地发行代币的平台。
早期机会
有了上述这些对于 dapp 底层机制的理解,接下来你应该思考这么一个问题了:去中心化到底会给你的用户带来什么价值?我们希望你可以先想清楚上面这个问题,而不是一上来就开始急着“去中心化”现有的产品。举个例子,Augur 这款产品依靠区块链技术实现了一个预测市场。为什么要用区块链技术实现?正是因为这项技术带来的鼓励诚实的经济激励机制,使得散布在世界各地的参与者因此而能够作出更准确的预测。
在开发者层面,区块链技术也带来了一次技术栈的创新机会。现有区块链的开发者们很喜欢把现在的情形跟互联网早期做类比,那个时候各种开发工具和框架都还不够完善,而现在的区块链开发领域正是如此。来自 Stream 的 Ben Yu 认为这是开发者的新机会:“很多看起来是举手之劳的基础工作亟待完成,如果说区块链技术社区的现状很像 1994 年的互联网的话,那么,为了将其演进到 2017 年的互联网,还要完成很多基础架构工作”。
由于区块链技术的创新,很多人已经看到了创建全新的、去中心化的网络栈的机会。这种全新的网络栈将不再依赖中心化的政府或公司。传统的网络栈由 TCP/IP,DNS,数据库,网络服务器,鉴权系统和 CDN 这些基础组件构成,而现在,我们有机会通过类似于以太坊这样的平台,用去中心化的方式,重新实现传统网络栈中的各个组件。
“不可篡改”带来的挑战
就像早期的 Javascript 技术一样,区块链技术演进的过程必然伴随着各式各样的挑战。其中最大的挑战之一,也是区块链技术最突出的特性,那就是“不可篡改”。由于这个特性,开发者们无法更改底层的区块链,也无法更改顶层的智能合约,对基础库和合约进行版本控制也非常困难。最近 Parity 的一个 bug 直接导致了价值 1.5 亿美金的以太币被锁。诸如此类的事故不断地提醒我们,构建经得住未来考验的架构是非常重要的。
关于这种不可篡改性对业务安全所带来的影响,来自 0x 项目的开发者 Brandon Millman 跟我们分享了他的看法:“跟传统项目相比,在这个领域做开发意味着你要加倍小心,因为任何问题都将直接影响用户数字资产的安全。一直以来,区块链技术对于私有财产的有力保护广为人知,也就是说,只要你安全地控制着私钥,理论上没有人可以偷走你的资产。但这个领域更多的偷窃行为并不是通过直接盗取用户的私钥来实施的。骗子们更多地是通过诱骗的方式,让用户将数字资产转移到他们的钱包,最终达成行窃的目的。”
开发者们,尤其是那些来自创业公司习惯了快节奏开发的开发者们,不得不停下来思考如何在速度和安全性之间找到平衡。就像来自 Stream 的 Ben Yu 说的那样:“开发者们普遍推崇的一个原则是:move fast and break things. 这句话在区块链领域只有前半句成立。这个领域的发展日新月异,所以你必须 move fast 才不至于被竞争对手超越,但 break things 则意味着成千上万的金钱损失。”
区块链领域的开发需要更加周密的计划。由于开发者对于整个系统缺少中心化的控制,因此 dapp 是很难像传统应用那样做快速热修复的。相反的,在区块链世界要想做系统级别的变更,则往往意味着整个协议的硬分叉。
以太坊的局限性
除了上面讲到的“不可篡改”带来的挑战,开发者在以太坊网络上还可能碰到一些其他限制。比如,以太坊网络不支持通过外部调用的方式获取自身区块链以外的数据。开发者们需要依赖第三方数据提供商来向智能合约注入外部数据,这类数据提供商也常常被称作预言机(Oracle)。
除此之外,以太坊的性能不足以支持实时计算。以太坊网络中区块的处理时间长达 15 秒(跟比特币网络的 10 分钟比起来已经很快了)。因此,开发者们需要写一些异步代码来进行状态的更新(这一点跟 React 很像)。
同时,在以太坊网络中,合约执行的每一步都需要消耗 gas,而 gas 最终会以以太币(eth)进行结算。因此,开发者们可能经常会碰到由于 gas 设置过低,导致计算无法完成的情况(比如这款象棋游戏)。也就是说,以太坊的“链上计算”是非常昂贵的,同时也非常消耗带宽。因此,市面上也产生了一些像 Truebit 这类旨在降低计算成本的“链下计算”服务。
如何开始
简单来说,这是一个令人叹为观止的领域。区块链技术是交叉学科的典型代表,这一技术涉及了经济学、博弈论、金融学、计算机科学、数学、密码学等众多学科领域。而交叉学科往往也意味着,有很多基础工作需要完成。
对于区块链领域的新人,来自 0x 项目团队的 Brandon 给的建议是,选择自己感兴趣或跟自身经历相关的领域为切入点,而不是一上来就想吃成大胖子:“如果你之前做的是 JS 开发工作,那么这个领域有非常多的 JS 库需要你这样的人来完善。假以时日,在开发过程中,你就会逐渐理解并熟悉这一领域。你无须有完成一门课程才能入门的负担。”
正如区块链技术所宣扬的“去中心化”思想那样,这一领域的绝大多数项目的代码都是开源的。下面就列出了一些可以让你快速上手的资源:
• Solidity 官方文档 是学习这门语言的很好的开始。
• Truffle 框架 是 solidity 最好的开发框架之一。
• 在 zeppelinOS 代码库 里可以看到很多知名的开源库。
• Blockgeeks 提供了一个详细的 以太坊代币开发指引,并附有一些代码示例和抽象概念。
• 你也可以从火爆全网的 Crypto Kitties 那里学习 如何在区块链上创建自己的游戏。
除此之外,下面是一些高质量的开发者社区:
• https://www.reddit.com/r/ethereum/
• https://www.reddit.com/r/ethdev/
如果你想做一些项目练手,也许下面这些主意不错:
• 创建自己的钱包应用。可以是网页版,移动版或桌面版
• 发行自己的 ERC-20 代币,并部署在测试网络上。
• 改一改 crypto kitties 的代码(比如改成狗,坦克,僵尸)并部署在测试网络上。
展望未来
目前看来,我们必须承认,围绕区块链的开发一团乱麻。跟现有成熟的网络开发相比,区块链领域还没有好用的框架和工具。但换个角度想,这种早期的混乱,正是一个机会,更重要的是,这是一个极有可能带来开发模式巨变的机会。
在区块链上,你不需要部署任何中心化的服务器,这就意味着单点失败的风险为零。如果你的整个技术栈都是去中心化的,那么就不需要引入“可信”的第三方,而没有第三方则意味着可以 100% 对抗审查。区块链技术带来了数据开放的新机会,基于区块链的去中心化数据库未来可期。
有了区块链技术,我们可以预见这样一个未来世界:一个没有中间人,并且信息和权利被系统性地分散开来的世界。