在本章之前,不得不说说运行在以太坊的dapp和我们普通的app有着天壤之别,即智能协议的永固性,我们编译的程序会永久的,不可更改的存在在以太网上,不存在像我们中心化的系统上不断的版本迭代的可能。某种程度上,这是对开发者极其不友好的,在我们过去的开发经验中,我们总是在不断迭代我们的系统使其更加稳定健壮,而dapp就只有一次机会,它极大的考验了开发者的代码技巧和细心程度,所以有的人会说区块链某种程度上是和互联网是呈镜像关系的,但正因为如此反而成就了dapp的独一无二的优势,一旦合约被部署确认,任何人将无权更改它,程序会按照原有的代码一丝不苟的执行,如果你的合约产生漏洞,对不起,你只有让你的用户转移到新修复的合约上面去,但是用户大概率是不可能买账开发出漏洞的dapp团队的二次产品,著名的DAO事件还让人历历在目!
还记得之前我们在ZombieFeeding 合约中使用了kittyContract的接口,将address“硬编码”到我们的合约中,假如有天,kittyContract不存在,那么我们的合约也将不能使用,这种将生杀大权交给别人的dapp显然是致命的!
所以一开始的时候我们不会把地址通过变量写入合约,而是通过函数的方式来实现注入!当然,我们不可能让任何人都来修改地址,我们应该只能让合约地址的拥有人可以修改地址。
我们可以通过OpenZeppelin 库的 Ownable 的合约来实现这一目的,我们先来看看ownable.sol的源代码,有了之前的基础,我想看起来还是很简单的:
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
*/
contract Ownable {
address public owner;
//这里是个事件,供前端监听
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**