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

	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 合约所有者
 */