Ownable contracts

OpenZeppelin Solidity库里的合约之一,可以通过继承使用。

/**
 * @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);  
    /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    owner = msg.sender;
  }  
   /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }  
   /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }
}

其中与合约同名的函数是合约的构造函数,在合约创建时运行一次之后不会再调用。

Ownable 合约:

  1. 合约创建,运行构造函数,将合约所有人限定为msg.sender,也就是部署合约的人。

  2. 增加修饰符 onlyowner,限制陌生人的访问,将访问某些函数的权限锁定在 owner上。

  3. 有函数可以将合约所有权转让给他人。


节省Gas的方式

一般情况下我们不用考虑像数据类型uint等的变种uint8等,因为solidity对这些类型都是当做uint看待的,但是有种情况下不一样,那就是struct中,我们可以通过将同类型的变量放在一起来节省空间,solidity会将这些同类型的打包在一起。

栗子:

struct aaaa{

    uint a;

    uint8 b;

    uint8 c;

    string d;

    ……;

}

我们还可以通过使用view来节省,因为在以太坊里每个写操作都会创建一个事务,view因为不需要写操作,我们可以通过这个结合函数修饰符(external)来使用,让操作只进行在本地节点,不消耗gas。

注意:如果一个 view 函数在另一个函数的内部被调用,而调用函数与 view 函数的不属于同一个合约,也会产生调用成本。这是因为如果主调函数在以太坊创建了一个事务,它仍然需要逐个节点去验证。


时间单位

Solidity 除了now之外,还包含秒(seconds)分钟(minutes)小时(hours)天(days)周(weeks)年(years) 等时间单位。它们都会转换成对应的秒数放入 uint 中。


可支付

可支付也是一个修饰符,payable。用来表明这个函数调用是需要花费gas的。

function buyPDF() external payable{

    require(msg.value == 0.01 ether);

    transferPDF(msg.sender);

}

这其中我们可以使用this.balance获取合约获得的以太,并通过预定的函数传输到我们的以太地址。