智能合约简介
本章是一个关于什么是智能合约,它们有什么用途,以及为什么区块链开发者会使用Cairo和Starknet的高度简介。 如果你已经熟悉了区块链编程,可以跳过这一章。不过最后一部分应该还是有点意思的。
智能合约
随着以太坊的诞生,智能合约得到了普及并变得更加广泛。智能合约本质上是部署在区块链上的程序。术语 "智能合约 "有些误导,因为它们既不 "智能 "也不是 "合约",而只是根据特定输入执行的代码和指令。它们主要由两部分组成:存储和函数。部署后,用户可以通过启动包含执行数据的区块链交易(调用哪个函数,输入什么参数)与智能合约互动。智能合约可以修改和读取底层区块链的存储。智能合约有自己的地址,因此它是一个区块链账户,意味着它可以持有代币。
用于编写智能合约的编程语言因区块链的不同而不同。例如,在以太坊和EVM兼容的生态系统生态系统上,最常用的语言是Solidity,而在Starknet上,是Cairo。代码的编译方式也根据区块链的不同而不同。在Ethereum上,Solidity被编译成字节码。在Starknet上,Cairo被编译成Sierra,然后再编译成Cairo Assembly(casm)。
智能合约具有几个独特特征。它们是 无需许可 的,意味着任何人都可以在网络上部署智能合约(当然是在去中心化的区块链上)。智能合约也是 透明 的;由智能合约存储的数据对任何人都是可访问的。构成合约的代码也可以是透明的,从而实现 可组合性。这使得开发人员可以编写使用其他智能合约的智能合约。智能合约只能访问和与其部署所在的区块链上的数据进行交互。它们需要第三方软件(被称为 oracle
)来访问外部数据(例如代币的价格)。
对于开发者来说,要想建立能够相互互动的智能合约,就必须知道其他合约的是什么样。因此,以太坊开发者建立了一些智能合约开发的标准,即 ERCxx
。两个最常用和最著名的标准是 ERC20
,用于建立 USDC
、DAI
或 STARK
等代币,以及 ERC721
,用于 CryptoPunks
或 Everai
等NFT(Non-fungible token)。
使用案例
智能合约有许多可能的用例。唯一的限制是区块链的技术限制和开发者的创造力。
DeFi
眼下,智能合约的主要用例与以太坊或比特币的用例类似,基本上是处理金钱。在比特币承诺的替代支付系统的背景下,我们在以太坊上可以使用智能合约创建去中心化的金融应用,不需要再依赖传统的金融中介机构。这就是我们所说的DeFi(去中心化金融)。DeFi由各种项目组成,如借贷应用、去中心化交易所(DEX)、链上衍生品、稳定币、去中心化对冲基金、保险等等。
代币化
智能合约可以促进现实世界资产的代币化,如房地产、艺术品或贵金属。代币化将资产划分为数字代币,可以在区块链平台上轻松交易和管理。这可以增加流动性,实现部分所有权,并简化购买和销售过程。
投票
智能合约可用于创建安全和透明的投票系统。投票可以记录在区块链上,确保不可更改性和透明度。然后,智能合约可以自动统计票数并宣布结果,将欺诈或操纵的可能性降到最低。
特许权使用费(版税)
智能合约可以为艺术家、音乐家和其他内容创作者自动支付版税。当一段内容被消费或出售时,智能合约可以自动计算并将版税分配给合法的所有者,确保公平的补偿并减少对中间人的需求。
去中心化身份 DIDs
智能合约可用于创建和管理数字身份,允许个人控制其个人信息,并与第三方安全地分享。智能合约可以验证用户身份的真实性,并根据用户的凭证自动授予或撤销对特定服务的访问。
随着以太坊的不断成熟,我们可以预期智能合约的用例和应用将进一步扩大,带来令人兴奋的新机会,并会更好地重塑传统系统。
Starknet和Cairo语言的崛起
以太坊作为应用最广泛、弹性最大的智能合约平台,成为了自身成功的牺牲品。随着前面提到的一些用例(主要是DeFi)的快速采用,执行交易的成本变得非常高,使得网络几乎无法使用。生态系统中的工程师和研究人员开始研究解决这一可扩展性问题的方案。
区块链领域有一个著名的不可能三角(The Blockchain Trilemma),即不可能同时实现高水平的可扩展性、去中心化和安全性;我们必须做出权衡。以太坊处于去中心化和安全性的交叉点。最终,人们决定以太坊的目的是作为一个安全的结算层,而复杂的计算将被卸载到建立在以太坊之上的其他网络。这些网络被称为二层网络(L2)。
L2的两种主要类型是乐观rollup和有效性rollup。这两种方法都涉及压缩和批量处理大量交易,计算新状态,并将结果结算在以太坊(L1)上。区别在于在L1上结算结果的方式。对于乐观rollup,默认情况下新状态被认为是有效的,但节点有7天的窗口期来识别恶意交易。
与此相反,有效性rollup(如Starknet)使用加密技术来证明新状态的计算是正确的。这就是STARKs的目的,这种加密技术可以使有效性rollup的扩展能力大大超过乐观rollup。你可以从Starkware的Medium文章中了解更多关于STARKs的信息,它是一个很好的入门读物。
Starknet的架构在Starknet Book中有详细描述,是了解Starknet的重要资源。
还记得Cairo吗?事实上,它是一种专门为STARKs开发的语言,并使其具有通用性。使用Cairo,我们可以编写可证明的代码。在 Starknet 中,这可以证明从一个状态到另一个状态的计算的正确性。
大多数(也许不是全部)Starknet的竞争对手都选择使用 EVM(原版或改版)作为基础层,而Starknet则不同,它采用了自己的虚拟机。这使开发人员摆脱了 EVM 的束缚,开辟了更广阔的可能性。加上交易成本的降低,Starknet 与 Cairo 的结合为开发人员创造了一个令人兴奋的乐园。原生账户抽象使我们称之为 "智能账户" 的账户和交易流的逻辑更加复杂。新兴用例包括 透明人工智能 和机器学习应用。最后,区块链游戏 可以完全在 链上 开发。Starknet 经过专门设计,可最大限度地发挥 STARK 证明的能力,实现最佳可扩展性。
在Starknet Book中了解更多关于账户抽象的信息。
Cairo程序和Starknet合约:有何区别?
Starknet合约是Cairo程序的一个特殊子集,所以之前在本书中学到的概念仍然适用于编写Starknet合约。
你可能已经注意到,一个Cairo程序必须始终有一个函数main
,作为这个程序的入口:
fn main() {}
Starknet合约本质上是可以在Starknet操作系统上运行的程序,因此可以访问Starknet的状态。要让编译器把一个模块当作合约来处理,就必须用 #[starknet::contract]
属性来标注它。