Clarity(智能合约语言)

一种旨在可读且可预测的智能合约语言。

circle-info

前往 Clarity 快速入门 以构建你的第一个 Clarity 智能合约。

Clarity 是一种 可判定的 智能合约语言,旨在优化可预测性和安全性,为 Stacks 区块链而设计。从头构建以便于开发者编写安全、可靠的智能合约。Clarity 拥有若干独特特性,使其成为编写智能合约的理想选择。

Clarity 的设计决策在很大程度上基于对常见 Solidity 漏洞的经验教训,并创建了一种以安全为核心目标的专用语言。

是什么让 Clarity 与众不同

以下章节摘自 Clarity 一书, Clarity of Mindarrow-up-right:

智能合约语言的数量逐年增长。选择第一门语言可能具有挑战性,尤其对于初学者而言。选择在很大程度上取决于你感兴趣的生态系统,尽管有些语言适用于多个平台。每种语言都有其优缺点,本书无法涵盖所有语言。相反,我们将关注 Clarity 的独特之处,以及为什么在你需要最高级别的安全性和透明度时它是首选。

Clarity 的核心准则之一是其“设计即安全”。设计过程以审视智能合约工程领域常见的陷阱、错误和漏洞为指导。现实中有无数例子表明开发者失误导致大量代币丢失或被盗。举两个重大例子:被称为 Parity 漏洞的问题导致数百万美元以太坊的不可挽回损失;其次,The DAO(“去中心化自治组织”)被攻破造成的巨大损失,迫使以太坊基金会进行有争议的硬分叉以撤销盗窃。这些以及许多其他错误本可在语言设计阶段避免。

Clarity 是解释型而非编译型

Clarity 代码会被按原样解释并提交到链上。Solidity 和其他语言在提交到链上之前会被编译为字节码。编译型智能合约语言的危险有两方面:首先,编译器增加了一层复杂性。编译器中的漏洞可能导致生成与预期不同的字节码,从而引入风险。其次,字节码不可读,这使得验证智能合约实际执行内容变得非常困难。问问你自己,你会签署一份你无法阅读的合约吗?如果答案是否定的,那么智能合约为什么要例外?使用 Clarity,所见即所得。

Clarity 是可判定的

可判定语言的特性是你可以从代码本身确定程序将如何运行。这避免了诸如停机问题之类的问题。使用 Clarity,你可以确定对于任何输入,程序都会在有限步骤内终止。简单来说:程序执行保证会结束。可判定性还允许对调用图进行完整的静态分析,从而在执行前获得准确的具体成本。Clarity 的调用不可能在调用过程中“耗尽 gas”。我们在关于可判定性的安全深度讨论中会更详细地探讨这一概念并讨论图灵完备性。

Clarity 不允许重入

重入是指一个智能合约调用另一个合约,随后该合约又回调第一个合约——调用“重新进入”相同逻辑。这可能允许攻击者在合约有机会更新其内部账本之前触发多次代币提取。Clarity 的设计将重入视为不良特性,并在语言层面上禁止它。

Clarity 防护溢出和下溢

当计算结果超出可存储的最大或最小范围时,会发生溢出或下溢。这些事件会使智能合约陷入混乱,并可能被攻击者在糟糕的合约中故意触发。通常这会导致合约被冻结或代币被抽干。在 Clarity 中,任何类型的溢出或下溢都会自动导致交易中止。

内建对自定义代币的支持

发行自定义的可替代和不可替代代币是智能合约的常见用例。自定义代币功能内建于 Clarity 语言中。开发者无需担心创建内部账本、管理总供给或触发代币事件。创建自定义代币的内容将在后续章节中深入介绍。

在 Stacks 上,交易由事后条件保护

为了进一步保护用户代币,交易可以附加事后条件,以断言交易完成后链上状态已按某种方式更改。例如,调用智能合约的用户可以附加一个事后条件,声明调用完成后应恰好将 500 个 STX 从一个地址转移到另一个地址。如果事后条件检查失败,则整个交易会被回滚。由于自定义代币支持直接内建于 Clarity,事后条件也可以以相同方式保护其他任何代币。

返回响应不能被忽略

公共合约调用必须返回所谓的响应以指示成功或失败。任何调用另一个合约的合约都必须正确处理该响应。未能如此处理的 Clarity 合约是无效的,无法在网络上部署。像 Solidity 这样的其他语言允许使用低级调用而不要求检查返回值。例如,如果开发者忘记检查结果,代币转移可能会悄然失败。在 Clarity 中无法忽略错误,尽管这显然会防止开发者出现有缺陷的错误处理。响应和错误处理将在函数与控制流章节中广泛覆盖。

组合优于继承

Clarity 采用组合优于继承的设计。这意味着 Clarity 智能合约不会像 Solidity 等语言那样互相继承。开发者改为定义 trait,然后由不同的智能合约实现这些 trait。它允许合约以更大的灵活性符合不同接口。无需担心复杂的类树和具有隐式继承行为的合约。

访问基础链:比特币

Clarity 智能合约可以读取比特币基础链的状态。这意味着你可以在智能合约中将比特币交易用作触发器!Clarity 还提供若干内建函数用于验证 secp256k1 签名并恢复公钥。

最后更新于

这有帮助吗?