
合约的基础:代码、状态与地址
区块链中的合约涉及哪些技术概念,可以从“规则如何执行、数据如何保存、操作由谁授权”三个问题理解。这里讨论智能合约,并以以太坊为主要适用范围;其他区块链的具体实现可能不同。
以太坊智能合约是在特定地址保存代码和状态的程序。代码中的函数规定可执行的操作,状态记录程序维护的数据。地址用于定位合约,合约账户还可以持有余额。理解一个合约,需要同时看它允许哪些操作,以及操作会怎样改变数据。

执行机制:交易、编译与Gas
Solidity、Vyper等语言编写的合约,需要编译后交由以太坊虚拟机执行。部署合约本身是一笔交易;用户也可以提交交易调用合约函数。部署和交易执行涉及Gas,用于计量计算资源消耗。

“自动执行”指程序按已写好的条件处理调用,并不意味着合约会自行感知外界变化。以库存规则为例,检查数量是否足够与更新库存是两个相连的步骤,输入是否满足条件决定后续操作能否完成。
系统连接:可组合性与预言机
合约可以调用其他合约,将已有功能组合起来。涉及现实世界信息时,则需要预言机等机制把链外数据提供给合约,因为合约本身不能直接获取这些信息。
两者解决的问题不同:合约调用连接链上功能,预言机连接外部数据。程序能够按规则处理输入,不代表输入必然准确。因此,理解依赖外部信息的应用,还要区分数据提供环节与链上执行环节。
权限管理:所有者、角色与多签
OpenZeppelin的Ownable适用于单一管理主体;AccessControl通过角色划分操作权限,并由对应管理员管理角色的授予与撤销。拥有某项操作权限,不必然拥有分配该权限的资格。多签则要求达到设定数量的有效签名才能执行相关操作。
当系统存在不同管理职责时,角色划分可以表达职责边界;需要多人共同授权时,多签可以表达批准条件。两者可以结合:角色决定谁具备资格,多签决定某个管理账户如何形成授权。
常见问题:公开是否意味着任何人都能管理
合约公开、可以被调用,不意味着所有函数都允许任何人执行。公开可见性与操作权限属于不同层面,管理功能仍可检查调用者身份或角色。
放弃所有权也不等于所有功能继续正常运行。对于受onlyOwner保护的功能,移除所有者会使其无法再被调用。判断权限调整的影响,需要具体检查哪些功能依赖该权限,以及角色管理员是否仍能改变授权关系。