contract Ownable {
 address owner_; //合约所有者

 event OwnershipRenounced(address indexed previousOwner); //合约所有权放弃事件
 event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); //合约所有权转让事件

 /**
  * @dev 构造函数
  */
 constructor() public {
  owner_ = msg.sender; //合约所有者为合约创建者
 }

 /**
     * @dev 合约所有者
     */
 function owner() public view returns (address) {
  return owner_;
 }

 /**
     * @dev onlyOwner函数修改器：判断合约使用者是不是合约拥有者，是合约拥有者才能执行
     */
 modifier onlyOwner() {
  require(msg.sender == owner_);
  _;
 }

 /**
  * @dev 转让合约所有权：只有合约所有者能使用，转让合约所有权给newOwner
  * @param  newOwner 新的合约所有者
  */
 function transferOwnership(address newOwner) public onlyOwner {
  require(newOwner != address(0));
  emit OwnershipTransferred(owner_, newOwner);
  owner_ = newOwner;
 }
}
/**
 * @title 所有权合约
 * @dev 用于控制合约的所有权，可以转让所有权
 */
function owner() public view returns (address) {
 return owner_;
}

/**
 * @dev 合约所有者
 */