在智能合约中保留其他智能合约实例的引用,也就是声明一个其他智能合约类型的变量。
合约示例:
import "SomeEncrypyion.sol";
contract EncrypyionContract {
//库智能合约的引用
SomeEncrypyion encrypyionLibrary;
//初始化库智能合约引用的构造函数
constructor (SomeEncrypyion _encrypyionLibrary) {
encrypyionLibrary = _encrypyionLibrary;
}
funcion changeLibrary(SomeEncrypyion _encrypyionLibrary) {
encrypyionLibrary = _encrypyionLibrary;
}
...
}
这是一个看起来很自然的想法,在构造函数中传入所依赖的库智能合约地址,然后保存到智能合约状态变量中,而且还有一个函数可以用来修改这个引用。但存在明显风险和漏洞,
-
构造函数都传入地址可能非预期;
-
changeLibrary函数为声明可见性是默认public的,谁都可以调用;
-
changeLibrary函数接受的传参可能由某个智能合约的某个函数传入,其地址类型不可控,要 做好相应的错误处理;
正确做法 在明确知道SomeEncrypyion代码情况下,在构造函数中直接 new 一个新智能合约,而不是传入一个智能合约地址。即使库智能合约被毁,它也完全可控,我们可以通过当前的智能合约代码避免人为意外或者误操作。