Appearance
OTP-005: 参数可寻址合约
该提案定义了一种通过参数而不是初始数据来寻址合约的方法。
动机
初始化数据可能与参数非常不同。这使我们能够避免在当前合约的上下文中执行来自其他合约的不受信任代码,或者在某些情况下执行链外的 TVM 代码进行部署,这可能是有风险的。
规范
该规范定义了一种将参数写入初始化数据单元的方法,以便在部署期间由合约代码读取。
前缀
前缀由智能合约本身定义,但默认情况下假定为单个零位。前缀用于合约代码区分已部署状态和未部署状态。
参数编码
参数使用自动编码器(Auto Encoder)进行编码。
合约要求
- 合约必须暴露
lazy_deployment_completed
的 get 方法,如果合约已部署则返回 true,否则返回 false。 - 合约必须暴露
org.ton.deploy.lazy.v0
接口。
示例代码
solidity
(bool) lazy_deployment_completed() {
// 检查合约是否已部署
return is_deployed;
}
缺点
- 合约可能处于半部署状态。
- 有多种写参数的方法,这将导致不同的初始化数据和不同的地址。
- 可以部署一个预初始化的合约,并且它将具有不同的地址,同时仍然完全功能。
- 部署时的 gas 使用量不可预测。部署通常是昂贵的,但该提案使其变得更加昂贵。