20181219 工作日志

版权声明:忠于祖国,忠于人民 https://blog.csdn.net/boss2967/article/details/85106917

address(0):address(0)代表 https://etherscan.io/address/0x0000000000000000000000000000000000000000 这个地址。
modifier-继承这个modifier修饰的function加上一个特定的约束,判断是不是复合一个条件。
if(msg.sender != owner) { throw; }
完全等价于如下三种形式:
if(msg.sender != owner) { revert(); }
assert(msg.sender == owner);
require(msg.sender == owner);
equire函数用于:

  • 确认有效条件,例如输入,
  • 确认合约声明变量是一致的
  • 从调用到外部合约返回有效值验证用户输入,即: require(input<20);
    验证外部合约响应,即: require(external.send(amount));
    执行合约前,验证状态条件,即: require(block.number > SOME_BLOCK_NUMBER) 或者 require(balance[msg.sender]>=amount)
    一般地,尽量使用 require 函数
    一般地,require 应该在函数最开始的地方使用
    以下场景使用 assert():
    检查 overflow/underflow,即:c = a+b; assert(c > b)
    检查非变量(invariants),即:assert(this.balance >= totalSupply);
    验证改变后的状态
    预防不应该发生的条件
    一般地,尽量少使用 assert 调用
    一般地,assert 应该在函数结尾处使用
      我的理解是CryptoKitties里面调用了ERC20合约(对,合约可以调用任何已经发布了的合约里面的public函数)。而ERC20合约的地址在address(0)。为了避免出现混乱吧。
    constant:常量

mapping:类似于字典(dict)的键值对
//对于金融应用程序,将用户的余额保存在一个 uint类型的变量中: mapping (address => uint) public accountBalance; //或者可以用来通过userId 存储/查找的用户名 mapping (uint => string) userIdToName;

require:当不满足某些条件时抛出错误,并停止执行:
1 function sayHiToVitalik(string _name) public returns (string) {
2 // 比较 _name 是否等于 “Vitalik”. 如果不成立,抛出异常并终止程序
3 // (敲黑板: Solidity 并不支持原生的字符串比较, 我们只能通过比较
4 // 两字符串的 keccak256 哈希值来进行判断)
5 require(keccak256(_name) == keccak256(“Vitalik”)); // 如果返回 true, 运行如下语句
6
7 return “Hi!”; }
8
9 //ps:因此在调用函数之前,用 require 验证前置条件时非常必要的。

storage:永久存储在区块链的变量,需要花费大量的gas
ps:在函数外声明的变量默认为 storage 类型,并永久写入区块链,某些特殊情况需要在函数内部手动声明。

memory:临时存储的变量,外部函数对某合约调用完成时,内存型变量即被移除。花费少量的gas。所以能用memory处理就坚决不适用storage
ps:在函数内部声明的变量默认是 memory 类型,函数调用结束后消失

时间单位:
  Solidity 还包含秒(seconds),分钟(minutes),小时(hours),天(days),周(weeks) 和 年(years) 等时间单位。它们都会转换成对应的秒数放入 uint 中。
  所以 1分钟 就是 60,1小时是 3600(60秒×60分钟),1天是86400(24小时×60分钟×60秒),以此类推。

一些全局变量
this:指的是当前合约的地址

msg.sender:当前调用者(或智能合约)的address
ps:在solidity中,功能执行始终需要从外部调用者开始。一个合约只会在区块链上什么也不能做,除非有人调用其中的函数。所以msg.sender总是存在的。

msg.value:一种可以查看向合约发送了多少以太的方法,如:0.001 ether
1 ether = 10^18 wei;

this.balance:将返回当前合约存储了多少以太。
使用 SafeMath 库的时候,我们将使用 using SafeMath for uint256 这样的语法
首先我们有了 library 关键字, 库允许我们使用 using 关键字,它可以自动把库的所有方法添加给一个数据类型:
assert 和 require
assert 和 require 相似,若结果为否它就会抛出错误。 assert 和 require 区别在于,require 若失败则会返还给用户剩下的 gas, assert则不会。所以大部分情况下,你写代码的时候会比较喜欢 require,assert 只在代码可能出现严重错误的时候使用,比如 uint 溢出。

说修饰高数的代码
注意 hello 函数上的 onlyOwner 修饰符。 当你调用 hello 时,首先执行 onlyOwner 中的代码, 执行到 onlyOwner 中的 _; 语句时,程序再返回并执行 hello 中的代码。
可见,尽管函数修饰符也可以应用到各种场合,但最常见的还是放在函数执行之前添加快速的 require检查。
因为给函数添加了修饰符 onlyOwner,使得唯有合约的主人(也就是部署者)才能调用它。


address(0):address(0)代表 https://etherscan.io/address/0x0000000000000000000000000000000000000000 这个地址。
modifier-继承这个modifier修饰的function加上一个特定的约束,判断是不是复合一个条件。
if(msg.sender != owner) { throw; }
完全等价于如下三种形式:
if(msg.sender != owner) { revert(); }
assert(msg.sender == owner);
require(msg.sender == owner);
equire函数用于:

  • 确认有效条件,例如输入,
  • 确认合约声明变量是一致的
  • 从调用到外部合约返回有效值验证用户输入,即: require(input<20);
    验证外部合约响应,即: require(external.send(amount));
    执行合约前,验证状态条件,即: require(block.number > SOME_BLOCK_NUMBER) 或者 require(balance[msg.sender]>=amount)
    一般地,尽量使用 require 函数
    一般地,require 应该在函数最开始的地方使用
    以下场景使用 assert():
    检查 overflow/underflow,即:c = a+b; assert(c > b)
    检查非变量(invariants),即:assert(this.balance >= totalSupply);
    验证改变后的状态
    预防不应该发生的条件
    一般地,尽量少使用 assert 调用
    一般地,assert 应该在函数结尾处使用
      我的理解是CryptoKitties里面调用了ERC20合约(对,合约可以调用任何已经发布了的合约里面的public函数)。而ERC20合约的地址在address(0)。为了避免出现混乱吧。
    constant:常量

mapping:类似于字典(dict)的键值对
//对于金融应用程序,将用户的余额保存在一个 uint类型的变量中: mapping (address => uint) public accountBalance; //或者可以用来通过userId 存储/查找的用户名 mapping (uint => string) userIdToName;

require:当不满足某些条件时抛出错误,并停止执行:
1 function sayHiToVitalik(string _name) public returns (string) {
2 // 比较 _name 是否等于 “Vitalik”. 如果不成立,抛出异常并终止程序
3 // (敲黑板: Solidity 并不支持原生的字符串比较, 我们只能通过比较
4 // 两字符串的 keccak256 哈希值来进行判断)
5 require(keccak256(_name) == keccak256(“Vitalik”)); // 如果返回 true, 运行如下语句
6
7 return “Hi!”; }
8
9 //ps:因此在调用函数之前,用 require 验证前置条件时非常必要的。

storage:永久存储在区块链的变量,需要花费大量的gas
ps:在函数外声明的变量默认为 storage 类型,并永久写入区块链,某些特殊情况需要在函数内部手动声明。

memory:临时存储的变量,外部函数对某合约调用完成时,内存型变量即被移除。花费少量的gas。所以能用memory处理就坚决不适用storage
ps:在函数内部声明的变量默认是 memory 类型,函数调用结束后消失

时间单位:
  Solidity 还包含秒(seconds),分钟(minutes),小时(hours),天(days),周(weeks) 和 年(years) 等时间单位。它们都会转换成对应的秒数放入 uint 中。
  所以 1分钟 就是 60,1小时是 3600(60秒×60分钟),1天是86400(24小时×60分钟×60秒),以此类推。

一些全局变量
this:指的是当前合约的地址

msg.sender:当前调用者(或智能合约)的address
ps:在solidity中,功能执行始终需要从外部调用者开始。一个合约只会在区块链上什么也不能做,除非有人调用其中的函数。所以msg.sender总是存在的。

msg.value:一种可以查看向合约发送了多少以太的方法,如:0.001 ether
1 ether = 10^18 wei;

this.balance:将返回当前合约存储了多少以太。
使用 SafeMath 库的时候,我们将使用 using SafeMath for uint256 这样的语法
首先我们有了 library 关键字, 库允许我们使用 using 关键字,它可以自动把库的所有方法添加给一个数据类型:
assert 和 require
assert 和 require 相似,若结果为否它就会抛出错误。 assert 和 require 区别在于,require 若失败则会返还给用户剩下的 gas, assert则不会。所以大部分情况下,你写代码的时候会比较喜欢 require,assert 只在代码可能出现严重错误的时候使用,比如 uint 溢出。

说修饰高数的代码
注意 hello 函数上的 onlyOwner 修饰符。 当你调用 hello 时,首先执行 onlyOwner 中的代码, 执行到 onlyOwner 中的 _; 语句时,程序再返回并执行 hello 中的代码。
可见,尽管函数修饰符也可以应用到各种场合,但最常见的还是放在函数执行之前添加快速的 require检查。
因为给函数添加了修饰符 onlyOwner,使得唯有合约的主人(也就是部署者)才能调用它。

猜你喜欢

转载自blog.csdn.net/boss2967/article/details/85106917