
方法、代码与状态
区块链智能合约的方法涉及哪些技术概念,可以从“函数如何改变数据”入手。以太坊开发文档将智能合约描述为特定地址上的代码与状态集合;其中,方法通常指合约定义的函数。本文围绕以太坊及相关合约开发概念展开,其他区块链的实现可能不同。
以库存管理为例,库存数量属于状态,补充库存属于方法,调用者是否有权补充属于执行条件。理解一个方法,需要同时看它接收什么输入、检查哪些条件,以及允许改变哪些数据。
账户、交易与执行环境
用户账户可以通过交易调用合约函数。Solidity、Vyper等语言编写的合约需要编译,由以太坊虚拟机执行;部署属于交易,需要支付Gas费用。
这些概念分别对应调用入口、执行请求、运行环境和资源计量。分析方法时,除了业务规则,也要考虑执行所需资源。自动执行依赖调用和条件满足,不能理解为合约会自行观察所有事件并主动处理。
访问控制与适用条件
OpenZeppelin的访问控制文档介绍了所有者模式和基于角色的权限模式。前者适合单一管理主体,后者适合将不同职责分配给不同账户。拥有某项业务角色,并不自动意味着可以把该角色授予别人;角色管理权限需要单独理解。
例如,补充库存与调整管理权限属于不同职责,可以分别授权。权限设计既要回答“谁能调用”,也要回答“谁能改变调用资格”。最小权限原则强调,各主体仅获得完成职责所需的权限。
合约组合与外部数据
合约能够调用其他合约,因此一个方法可能依赖其他合约的逻辑。需要链外信息时,则涉及预言机:合约自身不能直接获取现实世界的数据,需要通过相应机制将数据带入链上。
组合能力适合复用已有功能,但理解方法行为时也要检查依赖关系。使用预言机时,应区分数据进入链上的过程与合约处理数据的过程;代码按规则执行,并不能独自证明外部输入真实。
常见问题:公开是否等于任意操作
公开可交互与拥有操作权限是不同概念。一个函数即使可以被外部调用,也可能通过身份或角色检查限制执行。判断可用范围,需要查看具体条件。
多签则要求达到规定数量的有效签名后才能执行相关操作,适合需要多人共同授权的场景。它能分散单个密钥承担的责任,但不能替代业务逻辑检查,也不能证明所有被批准的操作都合理。