Solidity学习之Ownable.sol、Modifier、Gas

https://cryptozombies.io/zh/lesson/3/chapter/2

  • Ownable.sol

Ownable 合约基本都会这么干:

  • 合约创建,构造函数先行,将其 owner 设置为msg.sender(其部署者) 为它加上一个修饰符

  • onlyOwner,它会限制陌生人的访问,将访问某些函数的权限锁定在 owner 上。

  • 允许将合约所有权转让给他人。

  • modifier:

    修饰符,告诉编译器这不是一个函数,它不能像函数那样被直接调用,只能被添加到函数定义的末尾,用以改变函数的行为。

使用:

/**
 * @dev 调用者不是‘主人’,就会抛出异常
 */
modifier onlyOwner() {
  require(msg.sender == owner);
  _;
}
  function a() external onlyOwner {
    //函数体
  }
  • Gas

https://cryptozombies.io/zh/lesson/3/chapter/4

在 Solidity 中,你的用户想要每次执行你的 DApp 都需要支付一定的 gas,gas 可以用以太币购买,因此,用户每次跑 DApp 都得花费以太币。

一个 DApp 收取多少 gas 取决于功能逻辑的复杂程度。每个操作背后,都在计算完成这个操作所需要的计算资源,(比如,存储数据就比做个加法运算贵得多),一次操作所需要花费的 gas 等于这个操作背后的所有运算花销的总和。

为了防止用户用无限循环堵塞网络,抑或用密集运算来占用大量的网络资源,以太坊的创建者为以太坊上的资源制定了价格,想要在以太坊上运算或者存储,你需要先付费。

省Gas招数
1)结构封装即把uint绑定到struct中。如果一个 struct 中有多个 uint,则尽可能使用较小的 uint, Solidity 会将这些 uint 打包在一起,从而占用较少的存储空间。

2)在数组后面加上 memory关键字, 表明这个数组是仅仅在内存中创建,不需要写入外部存储,并且在函数调用结束时它就解散了。与在程序结束时把数据保存进 storage 的做法相比,内存运算可以大大节省gas开销 – 把这数组放在view里用,完全不用花钱。

  • 当用户 从外部调用一个view函数,是不需要支付一分 gas 的。这是因为 view 函数不会真正改变区块链上的任何数据,它们只是读取。注意:如果一个 view 函数在另一个函数的内部被调用,而调用函数与 view 函数的不属于同一个合约,也会产生调用成本。

此外,OpenZeppelin这个智能合约库主打安保和社区审查(需要的时候好找

你可能感兴趣的:(区块链,以太坊)