AdminControl
总览
AdminControl
合约是一款用于合约开发的调试工具。 在交易过程中创建合约时,当前交易的发送者会自动成为合约的管理者(admin)。
管理者 admin
的地址可以通过调用接口 setAdmin(address contractAddr, address newAdmin)
将管理权益转交给其他的普通用户地址或零地址。而一个合约不可成为管理者。
合约的管理者具备多个管理权限。管理者可以调用 destroy(address contractAddr)
接口以销毁合约,该操作就像通过合约调用 suicide()
函数那样。而SponsorWhitelist内部合约提供了一些管理员专用的函数。这些函数可以更新赞助者机制中的白名单。我们将在随后进行介绍。
注意:对于所有和管理者权限相关的接口,不论调用成功与否都不会在执行时触发任何错误或异常。 例如,如果一个非管理者地址尝试将管理者地址转移给其自己,该交易会成功但不会造成任何改动。
如果合约拥有非零的管理者地址,ConfluxScan会将合约标记为调试模式。因此请记住,如果你认为你的合约已经准备好进入实际生产环境,你应当将管理者地址设置为零地址。
AdminControl
合约同时也提供了一个可以被任何人调用的查询接口 getAdmin(address contractAddr)
。
需要注意的细节:
- 默认管理者(交易发送者)是在合约开始创建时设置的。因此,如果发送者
A
创建合约B
并在合约构建时设置管理者为C
,在合约部署后合约的管理者为C
。 - 然而,如果发送者
A
调用合约B
,随后合约B
创建合约C
并在合约创建时将管理者设置为D
,则该设置会失败,原因是:C
合约的管理者是A
,但创建合约C
的发起者是B
。 - Conflux会引入一种特别的规则。在案例2中,如果
D
是零地址,则管理者设置成功。这意味着合约创建时可以显示地声明其不需要管理者。
样例
考虑到您可以已经部署了一个地址为 contract_addr
的合约。管理者可以通过调用AdminControl.setAdmin(contract_addr, new_admin)
以变更管理员以及通过调用AdminControl.destroy(contract_addr)
来销毁合约。
const PRIVATE_KEY = '0xxxxxxx';
const cfx = new Conflux({
url: 'http://test.confluxrpc.org',
logger: console,
});
const account = cfx.wallet.addPrivateKey(PRIVATE_KEY); // create account instance
const admin_contract = cfx.InternalContract('AdminControl')
// to change administrator
admin_contract.setAdmin(contract_addr, new_admin).sendTransaction({
from: account,
}).confirmed();
// to kill the contract
admin_contract.destroy(contract_addr).sendTransaction({
from: account,
}).confirmed();
No Comments