AdminControl
概览
AdminControl 合约是一个用于合约开发调试的工具。 当在一个交易中创建一个合约时,当前交易的发送方将自动成为合约的管理员。
admin地址可以通过调用接口setAdmin(address contractAddr, address newAdmin)将管理员权限转移给其他普通地址或零地址。 合约永远不能被设置为admin地址.
管理员在合约中有多种管理员权限。 它可以调用接口 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是零地址,则设置管理员会成功。 这意味着合约可以在创建时声明“不需要管理员”
接口
管理员控制合约的十六进制地址是 0x0888000000000000000000000000000000000000, 接口如下:
pragma solidity >=0.4.15;
contract AdminControl {
/*** Query Functions ***/
/**
* @dev 得到特定合约的管理员
* @param contractAddr 特定合约的地址
*/
function getAdmin(address contractAddr) public view returns (address) {}
/**
* @dev 合约管理员设定设定 `contractAddr`为新的管理员 `newAdmin`.
* @param contractAddr The address of the contract
* @param newAdmin The new admin address
*/
function setAdmin(address contractAddr, address newAdmin) public {}
/**
* @dev Contract admin destroy contract `contractAddr`.
* @param contractAddr The contract to be destroied
*/
function destroy(address contractAddr) public {}
}
JS 示例
假设你已经部署了一个地址为 contractAddr的合约。 管理员可以通过调用 AdminControl.setAdmin(contractAddr, new_admin)来更改管理员,并调用AdminControl.destroy(contractAddr)销毁合约。
const { Conflux } = require('js-conflux-sdk');
function main() {
const cfx = new Conflux({
url: 'https://test.confluxrpc.com',
networkId: 1,
});
const PRIVATE_KEY = '0xxxxxxx';
const account = cfx.wallet.addPrivateKey(PRIVATE_KEY); // create account instance
const adminContract = cfx.InternalContract('AdminControl');
// make sure account is the admin of contractAddr
const contractAddr = 'cfxtest:acepe88unk7fvs18436178up33hb4zkuf62a9dk1gv';
// to change administrator
adminContract.setAdmin(contractAddr, new_admin).sendTransaction({
from: account,
}).executed();
// to kill the contract
adminContract.destroy(contractAddr).sendTransaction({
from: account,
}).executed();
}
main();