新的环境需要新的思维方式和行动方式
2011年,Marc Andreesen宣称 "软件正在吞噬世界",并预言所有行业都将发生软件革命。随着各行业的转型,我们对其相关环境的思考和互动方式也随之改变。
当软件进入新领域时,思考如何构建该软件的 "正确方式 "经常发生变化。
在计算机的早期,软件是写在打卡机上的,计算机是一种高度专业化的设备,耗资数百万美元。每一个程序都是定制的,专门针对它所运行的机器。
随着时间的推移,计算机的价格不可阻挡地下降,即使它们变得更加强大,这导致了一种新的思考软件的方式。计算机是如此便宜,我们可以把它们看作是商品硬件, 尽管软件正变得越来越复杂和有价值。我们需要有能力将为一台计算机编写的代码在另一台计算机上运行,这种新的编程模式被称为可移植代码。
随着70年代的到来,关系型数据库被引入,业界很快了解到,更新数据库中相关变化序列的一部分会导致各种棘手的问题,于是我们创造了原子性事务的编程范式。"原子性 "只是意味着 "全部或没有":我们将一组更新分组,它们要么全部应用,要么没有,以确保我们的数据保持一致。但是,在传统的编程语言中处理原子事务是很尴尬的,这导致了围绕一种新的语言--SQL的行业标准化。
在随后的十年里,计算机显示器变得足够先进,可以开发出交互式的图形用户界面。与用户的交互式交流并不适合程序化的编程模式,这种模式在 "批处理 "的时代是非常有效的。来自施乐PARC的开发图形界面的团队致力于完善面向对象的编程范式,这对于所有新的虚拟用户界面 "对象",如窗口、图标、菜单和指针,都是一种自然的适应。面向对象的编程像一场风暴一样席卷了计算机行业,催生了一些世界上最普遍的编程语言。Java、C++和C#。
当网络时代到来时,开发者希望用户能够下载程序并在终端用户的计算机上快速执行,而不管浏览器使用的是哪种硬件。这被称为客户端脚本, 是运行软件的一种根本性的新方式,导致了新一波的应用程序为网络带来丰富的功能。保持这种执行环境的高效性,同时保证其安全性,需要一种新的语言:现在无处不在的JavaScript。
当我们第一次开始为一个新的领域建立程序时,我们通常会从使用旧的编程范式开始,因为我们知道它们并且理解它们。但随着时间的推移,我们往往会发现有一种更好的方式来模拟新领域中的常见问题。这往往会导致全新的编程范式,而新的编程范式通常需要创造新的编程语言。
区块链领域有什么新动向?
区块链代表了一种新的软件领域,在去中心化系统上运行的自主软件向所有人提供开放的访问。鉴于以前的领域已经产生了新的编程范式,值得一问。区块链领域有什么新的东西可能需要一个新的编程范式?
有许多不同种类的区块链,从比特币到以太坊这样完整的智能合约平台。然而,无论它们采取什么形式和规模,有两个关键特征在这个新领域中永远存在:稀缺资产和安全地控制对这些资产的访问。
并非所有这些资产都是纯金融性质的。例如,CryptoKitties不可能在证券交易所上市,但使它们变得有趣和有价值的是,每个Kitty的具体属性是由一个公开的、被充分理解的智能合约仔细控制的。如果每个CryptoKitty的稀缺性和个体性不受区块链的保护,它们就没有可交易的价值,这将是一个更不有趣的生态系统。
当然,如果你不能控制谁能获得这些资产,那么拥有一个稀缺资产的概念是没有用的。如果任何人都可以繁殖 你的CryptoKitty,所有权的概念就毫无意义。控制对这些稀缺资产的访问的能力是区块链效用的基础。
为稀缺资产使用数据结构
当然,在数字系统内代表稀缺资产并不是区块链发明的!我们从1950年就开始在计算机系统内代表价值。自20世纪50年代以来,我们一直在计算机系统内表示价值。所有以前的稀缺资产的数字表示都存在于可信机构的围墙花园内,但值得一看的是,现有的编程范式是如何使用标准数据结构处理稀缺资产的。
数据结构是现代软件设计的基础性构件。我们不再把计算机的内存和存储当作一袋简单的字节,而是可以定义具体的结构,映射到现实世界的概念。程序员生产力提高的历史大部分是使数据结构更容易使用的故事:更容易创建,更容易复制,更容易在不再需要时进行清理(即删除或销毁)。
这对于解决大多数编程问题来说是非常好的,但当处理不在受信任机构的数据库中的稀缺资产时,它实际上会造成问题。毕竟,公共区块链在设计上是去中心化和无信任的。当处理任何人都可以访问的区块链上的宝贵资产时,我们希望这些同样的操作被小心翼翼地保护起来,背后有更多的考虑,而不仅仅是数据结构的更新。
在Solidity和WASM中,"稀缺资源 "只是数据结构!
在他们的工具箱中只有一个工具,确保稀缺性的责任完全落在智能合约工程师身上......代价不小。举例来说,CryptoKitties中大约有一半的代码是专门用于管理Kitty的稀缺性和访问控制。
像这样的代码需要在每个项目中重复使用;Solidity程序员需要投入大量的精力,确保访问控制是密不透风的,而且资产不能被欺诈性地创建或意外地销毁。
早在2015年,学术研究人员就注意到了这个问题的一个可能解决方案:在区块链背景下采用 "线性类型"。CMU的一个团队,由Michael Coblenz领导,甚至定义了一种新的智能合约语言,称为Obsidian,其中包含线性类型。
线性类型是一种限制性更强的数据结构形式,在Rust等语言中被用来提高内存效率和防止某些类型的编程错误。确切的细节并不重要,重要的是它们更接近于稀缺资产的必要属性。
这种匹配仍然不完美。线性类型可以防止意外的破坏,但它们仍然允许轻松的创造(在处理稀缺资产时,你可以称之为伪造!),而且在 "唯一引用 "和 "不可复制 "之间存在着一些微妙的技术差异。(尽管,用于跟踪唯一引用的机制也可以应用于防止复制,所以有许多现有的方法来实现这一点。)
线性类型让我们诱人地接近,但我们需要更进一步,引入 "资源"。
资源是具有可控创建和运行时间支持的线性类型
资源是管理稀缺资产的完美匹配;它们的创造受到严格控制,它们是不可复制和不可伪造的,而且它们的销毁必须是明确和故意的。
它们是一种非常受限制的数据结构,来自线性类型,有三个严格执行的规则。
- 每个资源在任何时候都正好存在于一个地方。资源不能被复制或意外地删除,尽管它们可以被移动。
- 资源的所有权是由它的存储地点决定的。不存在需要查阅的中央账簿来确定所有权。
- 对资源上的方法的访问只限于所有者。例如,只有CryptoKitty的主人可以繁殖它,以便生下新的后代。
资源极大地简化了稀缺资产编程的复杂性。在编程语言中加入资源,允许程序员简单地将他们程序中的特定元素标记为资源,而语言本身将安全地自动执行稀缺资产的常见功能:单一所有权、受控创建、不可伪造和故意销毁。
控制访问。基于能力的安全
虽然资源整齐地解决了稀缺资产的问题,但这篇文章一开始就指出了区块链常见的两个问题,这些问题并没有被现有的编程范式很好地解决:稀缺资产和控制访问。
幸运的是,有一种访问控制机制,自20世纪80年代以来被广泛研究,称为基于能力的安全(CBS)。CBS通过使用 "你有什么 "的安全模型(类似于物理钥匙卡)来控制对安全服务的访问,这与通常称为 "访问控制列表 "或ACL的 "你是谁 "的安全模型(类似于把你的名字放在客人名单上)形成鲜明对比。
CBS系统已被证明更容易审计,允许更灵活的访问控制模式,并绕过ACL中固有的一些常见的安全升级问题。另一方面,ACL更容易实现,可以很容易地建立在没有内置安全功能的系统之上,这就是ACL更普遍的原因。
幸运的是,实现CBS安全所需的关键构件是存在一个具有单一所有权、受控创建和故意销毁的不可伪造的对象。这就对了!我们可以创建 "虚拟钥匙卡 "作为资源--与我们用来表示稀缺数字资产的工具相同--并使用它们以比ACL(许多智能合约语言迄今所使用的)更灵活和自然的方式管理访问控制。
新范式。以资源为导向的编程
我们称这种新的范式为面向资源的编程,它自然适合于区块链。你可能会惊讶地发现,已经有两种不同的智能合约编程语言来实现它。
Libra项目在去年发布了Move语言。Move是一种低级、高效的语言,具有直接的字节码表示和高性能的运行时间。作为一种低级语言,它的语法更多的是为机器而不是为人设计的,而且在很大程度上是作为一种中介表示。
Flow团队在今年早些时候宣布了Cadence。Cadence是一种高级的解释性语言,其符合人体工程学的语法使其易于学习,易于编写,易于审计。
这两个项目在一起就像花生酱和果冻一样这些项目背后的团队正在共同努力,将MoveVM的奶油般顺滑的性能与Cadence的香甜的语法制作成完美的智能合约三明治。其结果有望创造出更快、更安全、更强大的智能合约。
如果你有兴趣了解更多关于Cadence的信息,我们有一个详细的 文档部分,或者加入我们的 Discord服务器.