从 Sway 的角度来看,断言是返回布尔值的程序,表示在执行时对某些资源的所有权为 true。它们无法访问合约存储。以下是一个微不足道的断言,它始终计算为 true:
predicate;
// 所有断言都需要一个返回布尔值的主函数。
fn main() -> bool {
true
}
该断言的地址为 0xd19a5fe4cb9baf41ad9813f1a6fef551107c8e8e3f499a6e32bccbb954a74764
。向该地址发送的任何资产都可以通过执行上述断言来解锁或索取,因为它总是计算为 true。
它不需要部署到区块链,因为它只存在于交易期间。尽管如此,断言地址在链上作为一个或多个 UTXO 的所有者存在。
在 Fuel 中,硬币可以发送到断言的地址(计算出的字节码根,在此处计算 )。
硬币 UTXO 变得可消费,并不是基于提供有效签名,而是如果提供的断言既具有与其所有者匹配的根,又 评估为 true
。
如果一个断言回滚,或尝试访问不纯的 VM 操作码,则评估自动为 false
。
对于断言的类比是,与其传统的生成私钥并创建有效签名的 12 或 24 个字的种子短语不同,断言的代码可以被视为私钥。任何拥有该代码的人都可以执行一个断言,但只有当断言评估为 true 时,该地址拥有的资产才能被释放。
断言可以检查消费其硬币的交易(输入、输出、脚本字节码等),并可以接受运行时参数,其中任一或两者可能会影响断言的评估。
重要的是要注意,断言无法读取或写入内存。但它们可以检查交易的输入和输出。例如,在 OTC 断言交换示例 中,用户可以指定他们想要用 asset1
交换 asset2
,并且数量为 5
。然后用户将 asset1
发送到断言。只有当断言能够验证输出包括将 5
枚 asset2
发送给原始用户时,才能将 asset1
从断言中转出。
因为它们没有任何副作用(它们是 pure 的),断言无法创建收据。因此,它们无法进行日志记录或创建堆栈回溯。这意味着除了使用单步调试器之外,没有本地调试它们的方法。
作为一种解决方法,断言可以首先编写、测试和调试为 script
,然后再更改为 predicate
。