12.26,工作笔记

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

*********************杂项笔记 181218
/

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,使得唯有合约的主人(也就是部署者)才能调用它。
/
************************ Dapp 函数整理
/

getOneDepositRec 拿到了一份存款记录
getWithdrawNum 得到取款记录号
getOneWithdrawRec 得到一份提取记录
DRCWalletManager 在平台上管理钱包操作的合同
CreateDepositAddress 事件
FrozenTokens 事件
ChangeDefaultWallet 事件
initialize 用令牌、参数和存储地址
params = IDRCWalletMgrParams(_walletParams);// 这种声明格式还是不太明白,就是说去调用一个 变量返回一个变量
createDepositContract 默认取款钱包创建存款合约地址
address _deposit = address(deposWithdr);//地址 ,这是啥,我再看看
doDeposit dev将资金价值存入存款地址
getDepositAddress GET存款合同地址使用默认取款钱包
getDepositInfo dev通过使用存款地址
getDepositWithdrawCount dev获取提款钱包地址的编号,绑定到存款合同地址
getDepositWithdrawList dev获取与存款合同地址
changeDefaultWithdraw dev更改绑定到存款合同地址
freezeTokens dev冻结存款地址中的令牌
withdrawWithFee dev将令牌从存款地址提取到默认钱包并收取费用
checkWithdrawAddress dev检查钱包名称是否与预期的钱包地址
withdrawFromThis dev从本合同中撤回令牌,发送令牌到目标取款钱包
withdrawWithFee dev撤回令牌,发送令牌到目标取款钱包
destroyDepositContract dev破坏旧的凭证合约并收回代币
interface 的使用
renounceOwnership dev允许当前所有者放弃对合同的控制权。
transferOwnership dev允许当前所有者将合同控制权转移给新所有者。
_transferOwnership dev将合同控制权转让给新所有者。
withdraw dev退出,将以太发送到目标
withdrawToken dev撤回令牌,将令牌发送到目标
destroy 通知终止合同,并将ERC 20或ERC20Basic令牌合同的地址列表退还给所有者
向业主转让合同并终止合同
onlyPendingOwner 修饰符 dev修饰符如果被除下摆所有者以外的任何帐户调用,都会抛出。
transferOwnership dev允许当前所有者设置摆在所有者的地址。
claimOwnership Dev允许待决所有者的地址最后确定转移。
TransferRecord[] deposRecs 记录所有存款的TX数据
TransferRecord[] withdrRecs 记录所有提取的tx数据
ReceiveDeposit 监听事件
构造函数-绑定的钱包地址-到该存款提取合同
setWithdrawWallet dev设置默认钱包地址
bytesToBytes32 util函数将字节数据更改为by tz 32 data
assembly 内联汇编
receiveApproval 受ERC 20令牌协议的批准,获取一个记录
recordWithdraw dev记录撤回到本合同中
checkWithdrawAmount dev检查如果取款量无效
withdrawToken dev撤回令牌,将令牌发送到目标
withdrawTokenToDefault dev撤回令牌,将令牌发送到目标默认钱包
getDepositNum 获得存款记录号码
getOneDepositRec Dev拿到了一份存款记录
getWithdrawNum 得到取款记录号
getOneWithdrawRec 得到一份提取记录
DelayedClaimable
setLimits dev用于指定挂起的所有者可以声明所有权的时间段
claimOwnership dev允许待决的Owner地址完成传输,只要它在指定的开始和结束时间内被调用。
bindContract dev将合同绑定为其所有者
changeOwnershipto dev将合同所有者从该合同地址更改为另一个合同地址。
ownedOwnershipTransferred dev确认拥有合同的所有人已被转让。
DRCWalletManager
initialize dev用令牌、参数和存储地址
createDepositContract dev为默认取款钱包创建存款合约地址
doDeposit dev将资金价值存入存款地址
getDepositAddress GET存款合同地址使用默认取款钱包
getDepositInfo dev通过使用存款地址
getDepositWithdrawCount dev获取提款钱包地址的编号,绑定到存款合同地址
getDepositWithdrawList dev获取与存款合同地址
changeDefaultWithdraw dev更改绑定到存款合同地址
freezeTokens dev冻结存款地址中的令牌
withdrawWithFee dev将令牌从存款地址提取到默认钱包,并收取费用
checkWithdrawAddress dev检查钱包名称是否与预期的钱包地址
withdrawFromThis dev从本合同中提取令牌,将令牌发送到目标取款钱包
withdrawWithFee dev撤回令牌,发送令牌到目标取款钱包
destroyDepositContract dev破坏旧的凭证合约并收回代币
DRCWalletMgrParams
***********************
DRCWalletMgrParams 台上定义钱包管理参数的合同只有所有者才能初始化参数,但国会合同可以在将来设置这些参数
renounceOwnership dev允许当前所有者放弃对合同的控制权。
transferOwnership dev允许当前所有者将合同的控制权转移到NetWOWner。
_transferOwnership dev将合同控制权转让给新所有者。
initialCongress dev为此初始化一个国会合同地址
changeCongress dev为此设置了一个国会合同地址
destroy Dev将当前余额转移给所有者并终止合同。
onlyPendingOwner 开发修饰符如果被其他帐户调用,则抛出
transferOwnership dev允许当前所有者设置摆在所有者的地址。
claimOwnership Dev允许待决所有者的地址最后确定转移。
DRCWalletMgrParamsInterface *****
DRCWalletStorage******
addDeposit dev添加默认取款钱包的存款合约地址
removeDepositAddress dev从存款地址列表中删除地址
removeDeposit dev从存储中删除存款合约地址
addWithdraw dev为一个存款地址添加取款地址
increaseBalance dev增加此存款地址的余额
decreaseBalance dev减少此存款地址的余额
changeDefaultWallet dev更改绑定到存款合同地址
changeWalletName dev更改存款合同地址
freezeTokens dev冻结存款地址中的令牌
wallet dev获取存款地址的钱包地址
walletName dev获取存款地址的钱包名称
walletsNumber dev获取存款地址的钱包名称
isExisted dev获取存款帐户的余额
balanceOf dev获取存款帐户的余额
frozenAmount dev获取存款地址的冻结金额
depositAddressByIndex dev按索引获取存款地址
DRCWalletStorageFlatened*****************
renounceOwnership dev允许当前所有者放弃对合同的控制权。
transferOwnership dev允许当前所有者将合同的控制权转移到NetWOWner。
_transferOwnership dev将合同控制权转让给新所有者。
withdraw dev退出,将以太发送到目标
withdrawToken dev撤回令牌,将令牌发送到目标
transferOwnership dev允许当前所有者设置摆在所有者的地址。
claimOwnership Dev允许待决所有者的地址最后确定转移。
addDeposit dev添加默认取款钱包的存款合约地址
removeDepositAddress dev从存款地址列表中删除地址
removeDeposit dev从存储中删除存款合约地址
addWithdraw dev为一个存款地址添加取款地址
increaseBalance dev增加此存款地址的余额
decreaseBalance dev减少此存款地址的余额
changeDefaultWallet dev更改绑定到存款合同地址
changeWalletName dev更改存款合同地址
freezeTokens dev冻结存款地址中的令牌
wallet dev获取存款地址的钱包地址
walletName dev获取存款地址的钱包名称
walletsNumber dev获取存款地址的钱包名称
isExisted dev获取存款帐户的余额
frozenAmount dev获取存款地址的冻结金额
depositAddressByIndex dev按索引获取存款地址
ERC20Basic**************************

****** 1224 DRCWalletManager
Withdrawable 可以撤回以太或代币的合同 继承ownable
payable 涉及交易的函数都要带payable
withdraw dev退出,将以太发送到目标
withRoles.soldrawToken 开发撤回令牌,将令牌发送到目标
bindContract Dev使合同作为其所有者具有约束力
changeOwnershipto dev将合同所有者从该合同地址更改为另一个合同地址
ownedOwnershipTransferred 确认拥有合同的所有人已经被转让。
OwnerContract.sol

pragma solidity ^0.4.24;

import “./Roles.sol”;

Token 函数整合
Ownable 合约所有权管理
Roles.sol 角色管理
RBAC.sol 角色扩展
CanReclaimToken.sol 可回收的TOKEN
Claimable.sol 合约的扩展
DelyedClaimable.sol 添加了区块限制的合约所有权转移
HasNoContract.sol 合约回收
HasNoEther.sol 锁定指定合约,防止以太币转入
Heritable.sol 合约继承者
Superuser.sol 超级用户管理
*/

****************************** openzip库整理
/*
math库详解
SafeMath.sol 安全运算
Math.sol uint256与uint64的最值获取

Access详解
signatureBouncer.sol 签约保护合约,只能制定的角色才能进行签名
whitelist.sol 白名单

introspection库
ERC165.sol 通过指定接口ID查询接口
SupportInterfaceWithLookup 支持查找的接口

Proposals库
TokenMetaData.sol 对ERC-URI的设置

TOKEN_ERC20库
ERC20.sol ERC20合约的扩展
ERC20Basic.sol ERC20基础合约
BasicToken.sol 最简单的ERC20接口实现
StandardToken.sol 标准token实现
铸币权限控制
cappedToken.sol 铸币上限
DetailERC20.sol token详情
PauseableToken.sol 暂停
StandardBurnableToken 标准token的销毁
TokenTimeLock 锁定
TokenVestion 释放

TOKEN_ERC721库

ERC721 NFT 元信息
ERC721Basic ERC721接口原型
ERC721BasicToken ERC721接口的基本实现
ERC721Token ERC721接口的扩展实现
Crowdsale 众筹合约
CappedCrowdsale 众筹上限
IndividuallyCappedCrowdsale 个人的众筹上限
TimedCrowdsale 众筹时间范围
WhitelistedCrowdsale 白名单
IncreasingPriceCrowdsale token价格变动
RefundableCrowdsale 退款
PostDeliveryCrowdsale 锁仓
FinalizableCrowdsale 众筹完成之后的操作

*/

***********************************Solidity 181220
/

  1. storage memory
    Storage 变量是指永久存储在区块链中的变量
    Memory 变量则是临时的,当外部函数对某合约调用完成时,内存型变量即被移除。
    状态变量(在函数之外声明的变量)默认为“storage”形式,并永久写入区块链;而在函数内部声明的变量默认是“memory”型的,它们函数调用结束后消失。
    手动声明存储类型,主要用于处理函数内的结构体和数组

  2. public与private
    public 修饰的变量和函数,任何用户或者合约都能调用和访问。
    private 修饰的变量和函数,只能在其所在的合约中调用和访问,即使是其子合约也没有权限访问。
    external (外部)只能在合约之外调用 - 它们不能被合约内的其他函数调用
    internal (内部)某个合约继承自其父合约,这个合约即可以访问父合约中定义的“内部”函数。
    internal、private、external、public这4种关键字都是可见性修饰符,互不共存

    1. 函数returns多个值的接收方式
      函数返回多个值
      //函数可以返回多个值
      function multipleReturns() returns(uint a, uint b, uint c) {
      return (1, 2, 3);
      }
      //同时接收所有返回值
      function processMultipleReturns() {
      uint a;
      uint b;
      uint c;
      //这样来做批量赋值:
      (a, b, c) = multipleReturns();
      }
      //只接收部分返回值
      // 或者如果我们只想返回其中一个变量:
      function getLastReturnValue() {
      uint c;
      // 可以对其他字段留空:
      (,c) = multipleReturns();
      }
    2. 储存
      所有的标识符(合约名称,函数名称和变量名称)都只能使用ASCII字符集。UTF-8编码的数据可以用字符串变量的形式存储。
      小心使用Unicode文本,因为有些字符虽然长得相像(甚至一样),但其字符码是不同的,其编码后的字符数组也会不一样。
      5.Solidity 源文件结构

    版本杂注
    import “filename”;//导入语句
    import * as symbolName from “filename”;//此语句将从 “filename” 中导入所有的全局符号到当前全局作用域中(不同于 ES6,Solidity 是向后兼容的)
    import {symbol1 as alias, symbol2} from “filename”;

    路径
    /为分割目录
    .表示当前目录
    …表示父目录
    当.或者…后面跟随的字符是/时候,他们才被当做当前目录或者父目录,只有路径以当前目录.或者父目录…开头,才会被视为相对目录
    用 import “./x” as x; 语句导入当前源文件同目录下的文件 x 。 如果用 import “x” as x; 代替,可能会引入不同的文件(在全局 include directory 中)
    import “github.com/ethereum/dapp-bin/library/iterable_mapping.sol” as it_mapping;

    6.合约结构
    状态变量: 状态变量是永久地存储在合约存储中的值
    函数:函数是合约中代码的可执行单元
    函数修饰器:函数修饰器可以用来以声明的方式改良函数语义
    事件:事件是与以太坊虚拟机日志工具的方便接口,触发事件
    结构类型:结构是可以将几个变量分组的自定义类型
    枚举类型:枚举可用来创建有一定数量的值的自定义类型

    7.值类型
    int/uint
    address
    balance
    transfer
    send
    send与transfer的很类似,区别在于,send 如果执行失败,当前合约不会停止并抛出异常,但send将返回false。
    调用call, 调用码callcode和代理调用delegatecall
    length
    8.映射
    mapping(_KeyType => _KeyValue)

    9.左值运算符
    delete
    delete a将对应类型的初始值赋值给a,即相当于a= 0
    静态数组使用delete时,是将数组内所有元素置为初值。而对于动态数组时,则是将长度置为0
    结构体使用delete会将其中的所有成员变量一一置为初值
    delete对mapping没有效果(因为映射的密钥可以是任意的,并且通常是未知的)
    如果delete一个struct,将重置所有不是映射的mapping,也会递归到成员中,除非它们是映射。不过,单独的键和键对应的值可以被delete。
    delete a的行为非常类似于对a赋值,即a中存储了一个新的对象
    10.隐式转换和显式转换
    如果将一个运算符应用于多个不同类型,编译器会试图隐式地把其中一个操作数的类型转换为另一个操作数的类型。赋值操作在同样的情况下也会这样
    如果转换后不会造成信息会丢失,会自动进行隐式转换
    unt8可转换成uint16, int128, int256
    int8不能转换成uint256,因为uint256放不下负数
    无符号整数可以转换成相同或更大的尺寸的bytes , 但反过来不行
    任何可以转化为uint160的类型,也可以转换为address

    显式转换
    如果编译器不允许某种隐式转换,但你可以手动显式转换
    int8 y = -3;
    uint x = uint(y);
    类型推导
    编译器会自动从第一个赋值表达式的变量类型里推断出新变量的类型
    uint24 x = 0x123;
    var y = x;
    对于函数参数或返回值不能使用var
    //死循环
    for (var i = 0;< 2000;i+ +){

    }
    11.单位和全局变量
    货币单位
    1 ether == 10^3 finney
    1 ether == 10^6 szabo
    1 ether == 10^18 wei

    时间单位
    1 == 1 seconds
    1 minutes == 60 seconds
    1 hours == 60 minutes
    1 days == 24 hours
    1 weeks == 7 days
    1 years == 365 days

    小心使用这些单位进行日历计算,因为不是每年都等于365天
    闰秒不是每天都有24小时。 由于闰秒无法预测,因此必须通过外部预言(external oracle)更新精确的日历库
    特殊变量和函数
    block.blockhash(uint blockNumber) returns (bytes32): 给定区块的哈希值 - 仅适用于最新的256个区块,不包括当前区块
    block.coinbase (address):当前区块的矿工的地址
    block.difficulty (uint):当前区块的难度系数
    block.gaslimit (uint):当前区块gas限制
    block.number (uint):当前区块编号
    block.timestamp (uint):当前块的时间戳
    msg.data (bytes):完整的calldata
    msg.gas (uint):剩余的gas
    msg.sender (address):消息的发送方(当前调用)
    msg.sig (bytes4):calldata的前四个字节(即函数标识符)
    msg.value (uint):所发送的消息中wei的数量
    now (uint):当前块时间戳(block.timestamp的别名)
    tx.gasprice (uint):交易的gas价格
    tx.origin (address):交易发送方(完整的调用链)
    错误处理
    assert(bool condition):如果条件不满足则抛出异常 - 用于内部错误。
    require(bool condition):如果条件不满足则抛出异常 - 用于输入或外部组件中的错误。
    revert():中止执行并恢复状态更改
    数学和加密功能
    地址相关

    .balance (uint256): 该地址的余额,单位是Wei
    .transfer(uint256 amount): 给该地址发送金额,单位是Wei,发送失败抛出异常,消耗2300 gas 费用,不可调整
    .send(uint256 amount) returns (bool): 给该地址发送金额,单位是Wei,发送失败返回false,消耗2300 gas 费用,不可调整
    .call(...) returns (bool): 发出 low-level CALL, 失败时返回false , 消耗所有可用gas, 可调整
    .callcode(...) returns (bool): 发出 low-level CALLCODE, 失败时返回false , 消耗所有可用gas, 可调整
    .delegatecall(...) returns (bool): 发出 low-level DELEGATECALL, 失败时返回false , 消耗所有可用gas, 可调整 callcode不建议使用,未来将会移除 this (current contract’s type): 当前的合约,可显式转换为地址Address selfdestruct(address): 销毁当前合约,其资金发送给指定的地址 suicide(address recipient): selfdestruct的别名 12.输入输出参数 输入参数

    library 在library中我们不能定义任何storage类型的变量。因为library只是意味着代码的重用而不是进行state的状态管理。
    library 简单的说就是公共类,但是在部署的时候,要首先部署他,然后再创建I链接

    1. 二进制接口(ABI)说明
      (ABI) 是从区块链外部与合约进行交互以及合约与合约间进行交互的一种标准方式
      函数选择器:一个函数调用数据的前 4 字节,指定了要调用的函数。这就是某个函数签名的 Keccak(SHA-3)哈希的前 4 字节(高位在左的大端序)(译注:这里的“高位在左的大端序“,指最高位字节存储在最低位地址上的一种串行化编码方式,即高位字节在左)。 这种签名被定义为基础原型的规范表达,基础原型即是函数名称加上由括号括起来的参数类型列表,参数类型间由一个逗号分隔开,且没有空格。
      参数编码:从第5字节开始是被编码的参数。这种编码也被用在其他地方,比如,返回值和事件的参数也会被用同样的方式进行编码,而用来指定函数的4个字节则不需要再进行编码
      类型
      函数选择器和参数编码
      动态类型的使用
      事件
      JSON
      处理元组类型
      非标准打包模式

    2. 合约的元数据
      Solidity编译器自动生成JSON文件,即合约的元数据,其中包含了当前合约的相关信息
      编译器会将元数据文件的 Swarm 哈希值附加到每个合约的字节码末尾
      因此你必须上传所有源文件和元数据文件
      元数据哈希字节码的编码
      源代码验证的使用方法

    3. 函数可见性定义符、修饰符、保留字

      函数可见性定义符
      public:在外部和内部均可见(创建存储/状态变量的访问者函数)
      private:仅在当前合约中可见
      external: 只有外部可见(仅对函数)- 仅仅在消息调用中(通过this.fun)
      internal: 只有内部可见

      修饰符
      pure for functions: 不允许修改或访问状态变量-这还没有强制执行。
      view for functions: 不允许修改状态变量-这还没有强制执行。
      payable for functions: 允许函数在调用同时接收Ether。
      constant for state variables: 不允许赋值(除了初始化),不占用存储槽。
      constant for functions:等同于view.
      anonymous for events: 不将events存储为topic。
      indexed for event parameters: 将参数存储为topic

    4. 全局变量

      abi.encode(…) returns (bytes):对给定的参数进行ABI编码。
      abi.encodePacked(…) returns (bytes): Performes packed encoding of the given arguments
      abi.encodeWithSelector(bytes4 selector, …) returns (bytes)::对给定的参数进行ABI编码——从第二个预置给定的四字节选择器开始
      abi.encodeWithSignature(string signature, …) returns (bytes):相当于abi.encodeWithSelector(bytes4(keccak256(signature), …)
      block.blockhash(uint blockNumber) returns (bytes32): 给定的块的hash值, 只有最近工作的256个块的hash值—— 在 0.4.22 后请使用blockhash(uint blockNumber).
      block.coinbase (address): 当前块的矿工的地址
      block.difficulty (uint): 当前块的难度
      block.gaslimit (uint): 当前块的gaslimit
      block.number (uint):当前块的数量
      block.timestamp (uint):当前块的时间戳
      gasleft() returns (uint256): 剩余 gas
      msg.data(bytes): 完整的calldata
      msg.gas(uint): 剩余 gas - 0.4.21后请使用 gasleft()
      msg.sender (address): 消息的发送者(当前调用)
      msg.value (uint): 和消息一起发送的wei的数量
      now (uint): 当前块的时间戳(block.timestamp的别名)
      tx.gasprice (uint):交易的gas价格
      tx.origin (address):交易的发送者(全调用链)
      assert(bool condition): abort execution and revert state changes if condition is false (用于内部错误)
      require(bool condition): abort execution and revert state changes if condition is false (用于输入错误或外部组件的错误)
      require(bool condition, string message): abort execution and revert state changes if condition is false (用于输入错误或外部组件的错误). 并提供错误信息.
      revert(): 中止执行并还原状态更改
      revert(string message):中止执行并还原状态更改,提供解释字符串
      blockhash(uint blockNumber) returns (bytes32): : 给定的块的hash值, 只有最近工作的256个块的hash值
      keccak256(…) returns (bytes32):计算(紧凑排列的)参数的 Ethereum-SHA3 hash值
      sha3(…) returns (bytes32): an alias to keccak256
      sha256(…) returns (bytes32): 计算(紧凑排列的)参数的SHA256 hash值
      ripemd160(…) returns (bytes20):计算 256个(紧凑排列的)参数的RIPEMD
      ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address): 椭圆曲线签名公钥恢复,错误时返回0
      addmod(uint x, uint y, uint k) returns (uint): compute (x + y) % k where the addition is performed with arbitrary precision and does not wrap around at 2256. Assert that k != 0 starting from version 0.5.0.
      mulmod(uint x, uint y, uint k) returns (uint): compute (x * y) % k where the multiplication is performed with arbitrary precision and does not wrap around at 2
      256. Assert that k != 0 starting from version 0.5.0.
      this (current contract’s type): 当前合约,在地址上显式转换
      super: 在层次关系上一层的合约
      selfdestruct(address recipient): 销毁当前的合约,将其资金发送到指定address
      suicide(address recipient): a deprecated alias to selfdestruct

      .balance (uint256): address地址中的账户余额(以wei为单位)
      .send(uint256 amount) returns (bool): 将一定量wei发送给address地址,若失败返回false。
      .transfer(uint256 amount): 将一定量wei发送给address地址,若失败抛出异常。
    5. 提示和技巧
      在数组中使用delete,就是删除数组中的所有元素
      使用较短的类型和结构元素,短类型分组在一起进行排序。SSTORE操作可能合并成一个单一的SSTORE,这可以降低gas的成本(sstore消耗5000或20000 gas,所以这是你必须优化的原因)。使用天gas的价格估算功能(优化器 enable)进行检查!
      让你的状态变量为public-编译器会自动创建 getters
      如果你结束了输入或状态的检查条件,请尝试使用函数修饰符
      如果你的合约有一个send函数, 但你想使用内置的send函数,请使用 address(contractVariable).send(amount)。
      如果存储结构具有紧密封装的属性,则用单独的赋值初始化它:x.a = 1; x.b = 2;这样,优化器将更容易一次更新存储,从而使赋值的开销更小。

    6. 源文件映射
      编译器也可以生成字节码到生成指令源代码的范围映射 sourceList

    7. 内存布局
      Solidity预留了4个32字节大小的槽位:
      0x00 - 0x3f: 哈希方法的暂存空间(scratch space)
      0x40 - 0x5f: 前已分配内存大小,也称空闲内存指针(free memory pointer)
      0x60 - 0x7f: 零槽(zero slot)
      大家不应该认为空闲的内存一定已经是清零(zeroed out)的
      内部机制 - 清理变量
      当一个值占用的位数小于32字节时,那些没有用到的位必须被清除掉。Solidity编译器设计实现为,在任何可能受到潜在的残存数据带来的副作用之前,清理掉这些脏数据

    8. 存储中状态变量的布局
      在存储块中的第一项是存储低阶对齐的。
      基本类型只使用了正好存储它们的字节数。
      如果一个基本类型不适合存储块的剩余部分,则移动到下一个存储块中。
      结构和数组的数据总是开始一个新的块并且占整个块(根据这些规则,结构或数组项都是紧凑排列的)
      当使用小于32字节的元素时,合约的gas使用可能会更高。这是因为EVM一次运行32个字节。因此,如果元素小于该元素,则EVM必须使用更多的操作,以便将元素的大小从32字节减小到所需的大小
      因为EVM一次运行32个字节
      只有在处理存储值时,使用缩减大小的参数才是有益的,因为编译器将多个元素打包到一个存储槽中,因此,将多个读或写组合到单个操作中。在处理函数参数或内存值时,没有固有的好处,因为编译器不打包这些值
      最后,为了允许EVM对此进行优化,确保您尝试对存储变量和struct成员进行排序,以便它们可以被紧密打包。例如,以uint128, uint128, uint256而不是uint128, uint256, uint128的顺序声明存储变量,前者只占用两个存储槽,而后者将占用三个存储槽
      结构和数组元素是一个接着一个存储排列的,就如当初它们被声明的次序
      由于无法预知的分配的大小,映射和动态尺寸大小的数组类型(这两种类型)是使用sha3 计算来找到新的起始位置,来存放值或者数组数据。这些起始位置总是满栈块

    9. 独立汇编

    10. using for
      指令using A for B;用来附着库里定义的函数(从库A)到任意类型B。
      using A for B;指令仅在当前的作用域有效
      需要注意的是所有库调用都实际上是EVM函数调用。这意味着,如果你传的是memory类型的,或者是值类型,那么仅会传一份拷贝,即使是self变量。变通之法就是使用存储类型的变量,这样就不会拷贝内容。

    11. Libraries
      库与合约类似,但它的目的是在一个指定的地址,且仅部署一次,然后复用代码
      调用库函数的方式非常类似,如库L有函数f(),使用L.f()即可访问。此外
      对比普通合约来说,库的限制:
      无状态变量。
      不能继承或被继承
      不能接收ether
      库的调用保护

    12. 抽象合约和接口
      如果构造函数参数是一个常量,并且定义了合约的行为或描述了它的行为,第一种方式比较方便。
      如果父构造函数参数依赖于派生合约的构造函数,则必须使用第二种方法。
      如果在这个荒谬的例子中,这两个地方都被使用,修饰符样式的参数优先。

    13. Events 事件
      底层的日志接口

    14. 函数的重载
      返回参数没有考虑到重载解析
      29.回退函数
      一个合约可以有一个匿名函数
      每当合同接收没有数据的纯Ether时,会执行回退函数
      回退函数必须标记为payable
      函数调用通常只有2300gas可用
      在这种情况下,函数调用通常只有2300gas可用,所以使回退函数尽可能便宜是很重要的
      所需的gas要高得多,因为每个事务都收取额外的21000gas或更多的用于签名检查之类。
      以下操作将比回退函数消耗更多的gas:
      写入storage
      创建合约
      调用一个消耗大量gas的外部函数
      发送Ether
      请彻底测试回退函数,以确保在部署合约之前执行消耗小于2300gas

    15. 纯函数
      当承诺不读取或修改状态时,函数可以声明为pure
      以下语句被认为是读取状态:
      从状态变量读取。
      访问this.balance或

      .balance。
      访问block, tx, msg中的任何成员,除了msg.sig和msg.data之外。
      调用任何未标记为pure的函数。
      使用包含某些操作码的内联程序集。
      编译器没有强制要求pure方法不读取状态

    16. 视图函数
      当承诺不修改状态时,函数可以声明view
      下面的语句被认为是修改状态:

      写入状态变量
      发生事件
      创建其他合约
      使用自毁selfdestruct
      通过调用发送Ether
      调用任何未标记view或pure的函数
      使用低级调用(low-level calls)
      使用包含某些操作码的内联程序集
      constant是view的别名
      Getter方法被标记为view
      编译器还没有强制要求view方法不修改状态

    17. 常量
      constant
      以下功能的表达式不被允许:

    访问storage
    访问区块链数据,如now,this.balance,block.number
    访问合约执行的中间数据,如msg.gas
    向外部合约发起调用。
    允许内存分配带来可能的副作用的原因是,因为这将允许构建复杂的对象,比如,查找表。
    编译器并不会为常量在storage上预留空间,每个使用的常量都会被对应的常量表达式所替换,也许优化器会直接替换为常量表达式的结果值
    不是所有的类型都支持常量,当前支持的仅有值类型和字符串

    1. 函数修饰器
      执行的函数之前自动检查条件
      但整个执行逻辑会在前一个修改器后面定义的”_”后继续执行。
      Getter函数
      编译器会自动为所有public状态变量创建getter函数
    2. Assert, Require, Revert 和 Exceptions
      Solidity使用state-reverting异常来处理错误。 这种异常将回滚当前调用(及其所有子调用)状态的所有变化,并将错误标志给调用者
      函数assert和require可以用于检查条件,如果条件不满足则抛出异常
      assert函数只能用于测试内部错误,并检查不变量
      应该使用require函数来确认input或合约状态变量满足条件,或者验证调用外部合约的返回值
    3. 作用域和声明
      已声明的变量将具有其字节表示为全0的初始值
      变量的初始值是任何类型的典型“零状态”(“zero-state)
      对于静态大小的数组和bytes1到bytes32
      在函数中任何位置声明的变量,它的作用域为整个函数,与声明位置无关
      如果变量被声明,则在函数的开头将其初始化为其默认值
    4. 函数调用和赋值
      前合约的函数可以直接内部(Internal)调用,也可以递归地调用
      外部函数调用
      请注意构造函数不能这样被调用, 因为这时合约还没有被创建
      当调用其他合约的函数时, 发送的金额(Wei)和gas可以通过.value() 和 .gas()来设置
      修饰符payable用在函数info上,因为如果不这么做的话,.value()将不可用
      如果调用的合约不存在(帐户不包含代码)、被调用的合约内部抛出异常或gas不足,会导致异常
      另外,在调用你的系统的其他合同或在第一次调用返回之前回到当前合约时也要小心。因为被调用的合约可以通过其函数调用,改变当前合约的状态变量。因此,在对你的合约中状态变量进行任何更改之后,调用外部函数,这样你的合约就不易受到重用。
      如果两个合约同时调用另外一个合约的函数,那么在调用时候那些状态变量是共享的吗
      具名调用和匿名函数参数
      函数调用参数如果被包含在{}中, 可以任何顺序输出,参数列表必须和函数声明中的参数重合,但是可以任意顺序排序。
      省略函数参数名
      可以省略未使用的参数(尤其是返回值)的名称。这些参数仍然存在于堆栈上,但它们是不可访问的。
      通过new创建合约 合约可以使用new关键字创建新合约
      合约可以使用new关键字创建新合约。必须事先知道要创建的合约的完整代码,因此递归创建依赖(recursive creation-dependencies)是不可能的
      表达式的计算次序
      赋值(Assignment)
      数组和结构体的组合
      赋值到局部变量的成员(或元素)将改变状态。
    5. 输入输出参数
      输入参数的声明方式与变量相同。不过有一个不同之处:输入参数中未使用的参数可以省略变量名。例如,假设我们希望我们的合同接受一个带有两个整数的外部调用,可以这样写:
      输入参数的声明方式与变量相同
      入参数中未使用的参数可以省略变量名
      输出参数
      returns关键字
      contract Simple {
      function arithmetics(uint _a, uint _b)
      public
      pure
      returns (uint o_sum, uint o_product)
      {
      o_sum = _a + _b;
      o_product = _a * _b;
      }
      }

*/

******************ES6 ********20181220

/* module.exports -
箭头函数 -

*/

****************************************20181225 Dapp 
 Q在平台上管理钱包操作的合同 

/*
1. 初始化令牌,参数,存储地址
2. 默认为取款钱包创建存款合约地址
3. 将资金价值存入存款地址
4. get存款合同地址使用默认取款钱包
5. 通过使用存款地址
6. 获取提款钱包地址的编号,绑定到存款合同地址
7. dev获取与存款合同地址
8. dev更改绑定到存款合同地址
9. dev冻结存款地址中的令牌
10. dev将令牌从存款地址提取到默认钱包并收取费用
11. dev检查钱包名称是否与预期的钱包地址
12. dev从本合同中撤回令牌,发送令牌到目标取款钱包
13. dev撤回令牌,发送令牌到目标取款钱包
14. dev破坏旧的凭证合约并收回代币

Q平台上定义钱包管理参数的合同(只有所有者才能初始化参数)

	//单次提取最小值
	//单次提取的最大值
	//提取一天的最大价值
	//提取一个月的最高价值
	//最大提取计数数
	//收取退还费用的地址
	//初始化单次提取最大值
	
	//初始化函数
	初始化单次提取最大值
	初始化单次提取最小值
	初始化一天提取最大值
	初始化一天最大提取计数数
	初始化一天最大提取计数数
	初始化收款收费
	初始化收取退换费用的地址
	
	设置单次提款最大值
	设置单次提款最小值
	设置一天的最值
	设置一天提取计数数
	设置一个月的最高提取值
	设置取款收费
	
	
 	

 Q平台上管理钱包操作的合同
 
 1.	dev添加默认取款钱包的存款合约地址
 2.	dev从存款地址列表中删除地址
 3.	dev从存储中删除存款合约地址
 4.	dev为一个存款地址添加取款地址
 5.	dev增加此存款地址的余额
 6.	dev减少此存款地址的余额
 7.	dev更改绑定到存款合同地址
 8.	dev更改存款合同地址
 9.	dev冻结存款地址中的令牌
 10.dev获取存款地址的钱包地址
 11.dev获取存款地址的钱包名称
 12.dev获取存款帐户的余额
 13.dev获取存款帐户的余额
 14.dev获取存款地址的冻结金额
 15.dev按索引获取存款地址
 
 
 
 
 DRCHash 
 HashDataCon.sol 
 
 1. HashOperateLib OwnableCon
 2.	insertHash param_Self是保存数据的地方
 3.	deleteHash dev删除Hash,DELETE方法
 4.	selectHash selectHash,选择方法
 5.	transferOwnership dev允许所有者将合同控制权转让给新所有者。
 
 6.	insertHash 	dev插入哈希,将散列插入到合约
 7.	selectHash	selectHash,从合同中选择散列
 8.	deleteHash	dev删除Hash,删除散列到合同
 9.	kill	dev杀死,销毁合同,并将乙醚发送至_upgrater
10.	withdraw 	dev退出,发送以太到目标
11.	dev回退,如果合同将收到以太

Migrations.sol 
 1. setCompleted
 2.	upgrade



*/

*********************************DRC-token 整理 181216
/*DRC-token 整理

1.Autonomy.sol (本合约的功能是继承自Ownable.sol,实现对合同地址的初始化和修改)
	合约 Autonomy
	onlyCongress
	initialCongress 																		dev为此初始化一个国会合同地址
	changeCongress																			dev为此设置了一个国会合同地址
2.DRCFlattenedToken.sol(本合约主要是对令牌的增加,减少,传递,销毁)
	接口类似于抽象合同,但它们不能实现任何功能
	无法继承其他合同或接口
	无法定义构造函数
	无法定义变量
	无法定义结构体
	无法定义枚举
	接口 tokenRecipient  receiveApproval 
	library
		mul
		div
		sub
		add
合约Ownable
	OwnershipTransferred
	dev-ownable构造函数将合同的原始‘owner’设置为发件人*帐户
	如果被所有者以外的任何帐户调用,/*@dev将抛出。**
	transferOwnership  dev允许当前所有者将合同控制权转移给新所有者。
合约 Pausable
	whenNotPaused  																			dev修饰符,使函数仅在合约未暂停时才可调用。
	whenPaused  																			dev修饰符,使函数仅在合同暂停时才可调用
	pause																					dev由所有者调用以暂停、触发器停止状态
	unpause																					dev被所有者调用以取消暂停,返回到正常状态
合约 ERC20Basic
	balanceOf
	transfer
	Transfer 事件 
合约 BasicToken 继承ERC20Basic
	transfer		param_到要传输到的地址的
	balanceOf		dev获取指定地址的余额
合约 BurnableToken  继承 BasicToken
	Burn 事件
	burn			dev焚烧特定数量的令牌
合约ERC20 继承ERC20Basic
	allowance
	transferFrom
	approve
	Approval
合约 StandardToken
	transferFrom																			dev将令牌从一个地址传输到另一个地址
	approve																					dev批准传递的地址,以代表msg.发件人使用指定数量的令牌	
	allowance																				dev函数检查所有者允许使用的令牌数量。
	allowed																					应该是允许使用的令牌
	increaseApproval																		dev增加所有者允许使用的令牌数量
	decreaseApproval																		dev减少所有者允许使用的令牌数量
合约  MintableToken 继承 StandardToken,Ownable
	mint 																					dev函数到mint令牌
	finishMinting																			dev函数停止创建新令牌
合约 PausableToken	继承 StandardToken,Pausable
	transfer
	transferFrom
	approve																
	increaseApproval																		dev增加所有者允许使用的令牌数量
	decreaseApproval																		dev减少所有者允许使用的令牌数量
合约DRCToken 继承 BurnableToken,MintableToken,PausableToken
	DRCToken
	freezeAccount 																			dev冻结帐户余额
	transfer																				dev传输令牌用于指定地址,并冻结状态检查
	transferFrom																			dev将令牌从一个地址转移到另一个地址,检查冻结状态
	transferMultiAddress																	devdev传输令牌,并对要传输到的地址进行冻结状态检查
	transferMultiAddressFrom																dev将令牌从一个地址传输到另一个地址,检查冻结状态
	burn																					dev销毁特定数量的令牌
	burnFrom																				从其他帐户中销毁令牌
	mint																					dev函数到mint令牌
	finishMinting																			dev函数停止创建新令牌
	approveAndCall																			为其他地址设置备抵,并通知
	tokenRecipient

3.DRCTestFlattenedToken.sol(主要功能设置代币的信息,总量,名称,性质)
	tokenRecipient			tokenRecipient
	receiveApproval

library	 公共类 
		mul
		div
		sub
		add
合约 																						Ownable
OwnershipTransferred                   														事件
Ownable																						dev-ownable构造函数将合同的原始‘owner’设置为发件人*帐户
onlyOwner																					如果由所有者以外的任何帐户调用,则DEV抛出
transferOwnership																			dev允许当前所有者将合同控制权转移给新所有者
合约 Pausable 继承 Ownable													
	Pause													
	Unpause													
	whenNotPaused 函数修饰器																dev修饰符,使函数仅在合约未暂停时才可调用
	whenPaused 函数修饰器  																	dev修饰符,使函数仅在合同暂停时才可调用
	pause																					dev由所有者调用以暂停、触发器停止状态
	unpause																					dev被所有者调用以取消暂停,返回到正常状态

合约 ERC20Basic
	balanceOf
	transfer
	Transfer 事件 
合约 BasicToken 继承 ERC20Basic
	transfer																				dev传输令牌
	balanceOf																				dev获取指定地址的余额
合约	BurnableToken													
	Burn																					销毁特定容量令牌
合约 ERC20 继承 ERC20Basic													
	allowance																				dev函数检查所有者允许使用的令牌数量。
	transferFrom													
	approve																					dev批准传递的地址,以代表msg.发件人使用指定数量的令牌
StandardToken 继承ERC20, BasicToken													
	transferFrom													
	approve																					dev批准传递的地址,以代表msg.发件人使用指定数量的令牌
	allowance																				dev函数检查所有者允许使用的令牌数量
	increaseApproval																		dev增加所有者允许使用的令牌数量
	decreaseApproval													
合约 MintableToken 继承 StandardToken,														Ownable
	Mint																					dev函数到mint令牌
	MintFinished													
	canMint 函数修饰器 													
	mint																					dev函数到mint令牌
	finishMinting																			dev函数停止创建新令牌
合约PausableToken 继承 StandardToken, Pausable
	transfer
	transferFrom
	approve
	increaseApproval
	decreaseApproval
合约 DRCTestToken 继承(这应该是代币初始化(重要)) 	BurnableToken,MintableToken,PausableToken
	FrozenFunds			事件 
	DRCTestToken																			设置令牌总数			
	freezeAccount																			冻结帐户余额
	transfer													
	transferFrom													
	transferMultiAddress													
	transferMultiAddressFrom																dev将令牌从一个地址传输到另一个地址,检查冻结状态
	burn																					dev焚烧特定数量的令牌
	burnFrom																				从其他帐户中销毁令牌
	mint																					dev函数到mint令牌
	finishMinting																			dev函数停止创建新令牌
	approveAndCall																			为其他地址设置备抵,并通知
4.DRCTestToken.sol (测试的)
	接口 tokenRecipient 
合约 DRCTestToken 继承 BurnableToken,MintableToken,PausableToken
FrozenFunds 
	freezeAccount						冻结帐户余额
	transfer
	transferFrom
	transferMultiAddress
	transferMultiAddressFrom
	burnFrom
	mint
	finishMinting						approveAndCall
	approveAndCall				
	
5. DRCTFlattenedToken.sol()
	library 公共类  
		mul
		div
		sub
		add
合约 Ownable ownable契约有一个所有者地址,并提供基本的授权控制
	OwnershipTransferred 事件 
	Ownable 函数修饰器
	transferOwnership 						dev允许当前所有者将合同控制权转移给新所有者。
合约 ERC20Basic
	totalSupply
	balanceOf
	transfer
	Transfer  事件 
合约 ERC20 继承 ERC20Basic
	allowance
	transferFrom
	approve
合约 BasicToken 继承 ERC20Basic
	using 						dev用外部方法转换为内部类型
	totalSupply					dev存在的令牌总数
	transfer
	balanceOf
合约 StandardToken 继承 ERC20,BasicToken
	transferFrom
	approve
	allowance
	increaseApproval
	decreaseApproval
合约 BurnableToken 继承 BasicToken
	Burn 事件 
	burn 
合约 MintableToken 继承 StandardToken,Ownable
	Mint事件
	MintFinished()事件
	canMint 函数修饰器 
	mint 
	finishMinting
合约 Pausable 继承 Ownable
	Unpause
	Pause
	whenNotPaused 函数修饰器
	whenPaused 
	pause
	unpause
合约 PausableToken 继承 StandardToken,Pausable
	transfer
	transferFrom
	approve
	increaseApproval
	decreaseApproval
合约 Claimable 继承 Ownable 		dev扩展为所有者合同,其中需要声明所有权
	onlyPendingOwner 函数修饰器 	(所有调用者跳出,所有者例外)
	transferOwnership				
	claimOwnership					dev允许待决所有者地址最后确定转帐。
合约 Autonomy 继承 Ownable			dev更简单的民主组织契约
	initialCongress					dev函数停止创建新令牌
	changeCongress					dev为此设置了一个国会合同地址
	tokenRecipient					接口
		receiveApproval				受ERC 20令牌协议的批准,获取一个记录
合约 DRCToken 继承 BurnableToken,MintableToken,PausableToken,Claimable,Autonomy
	代币初始化(名称,编码,小数,初始供应量)
	构造方法
	freezeAccount					dev冻结帐户余额
	freezeAccountPartialy			dev冻结帐户余额(部分)
	transfer
	transferFrom
	burn
	burnFrom
	forceBurnFrom					dev以武力从其他帐户销毁令牌,只有国会合同才能代表
	mint
	finishMinting					dev函数停止创建新令牌
	restartMint(只有国会合约)		dev函数重新启动造币功能。只有国会合同才能做到这一点
	approveAndCall					dev为其他地址设置备抵,并通知
	
6.DRCToken.sol(多个合约,接口)
	接口 tokenRecipient
			 receiveApproval
合约 DRCToken 继承 BurnableToken,MintableToken,PausableToken,Claimable,Autonomy
	Autonomy
	FrozenFundsPartialy
	BurnFrom						事件 
	构造函数 
	freezeAccount					dev冻结帐户余额
	freezeAccountPartialy			dev冻结帐户余额(部分)
	transfer	
	transferFrom
	burn
	burnFrom
	forceBurnFrom					dev以武力从其他帐户销毁令牌,只有国会合同才能代表
	mint
	finishMinting					dev函数停止创建新令牌
	restartMint						dev函数重新启动造币功能。只有国会合同才能做到这一点
	approveAndCall					为其他地址设置备抵,并通知
7.DRCTokenFlattened.sol (接口)
	tokenRecipient 接口 
		receiveApproval
library  SafeMath
	mul
	div
	sub
	add
合约 Ownable
	OwnershipRenounced
	OwnershipTransferred
	构造函数
	函数修饰器
	renounceOwnership				dev允许当前所有者放弃对合同的控制权
	transferOwnership				param_newOwner将所有权转移到指定地址
	_transferOwnership				dev将合同控制权转让给新所有者
合约 Autonomy 继承 Ownable 
	函数修饰器 
	initialCongress					dev为此初始化一个国会合同地址
	changeCongress					dev为此设置了一个国会合同地址

合约 Pausable 继承Ownable
	Pause  
	Unpause
	whenNotPaused 函数修饰器 
	whenPaused 函数修饰器
	pause
	unpause
合约 Claimable 继承 Ownable 
	onlyPendingOwner
	transferOwnership
	claimOwnership					dev允许待决所有者地址最后确定转帐
合约 ERC20Basic
	totalSupply
	balanceOf
	transfer
	Transfer
合约 BasicToken 继承 ERC20Basic
	totalSupply						dev存在的令牌总数
	transfer						param_到要传输到的地址的
	balanceOf						dev获取存款帐户的余额
合约 BurnableToken 继承 BasicToken
	Burn							dev焚烧特定数量的令牌
	_burn
合约 ERC20 继承 ERC20Basic
	allowance
	transferFrom					dev函数检查所有者允许使用的令牌数量
	approve							dev批准传递的地址,以代表msg.发件人使用指定数量的令牌	
合约 	StandardToken 继承 ERC20,BasicToken
	transferFrom
	approve
	allowance						dev函数检查所有者允许使用的令牌数量
	increaseApproval				dev增加所有者允许使用的令牌数量
	decreaseApproval
合约 MintableToken 继承 StandardToken,Ownable
	Mint
	MintFinished
	canMint(函数修饰器)
	hasMintPermission(函数修饰器)
	mint
	finishMinting					dev函数停止创建新令牌
合约PausableToken 继承 StandardToken,Pausable
	transfer
	transferFrom
	approve
	increaseApproval
	decreaseApproval
合约 DRCToken 继承 BurnableToken,MintableToken,PausableToken,Claimable,Autonomy
	构造函数 
	freezeAccount					dev冻结帐户余额
	freezeAccountPartialy
	transfer
	transferFrom
	burn
	burnFrom
	forceBurnFrom
	mint
	finishMinting
	restartMint
	approveAndCall
8.DRCTOwner.sol (接口 )
	导入 sol.
	接口 (
	freezeAccount
	freezeAccountPartialy
	balanceOf
	allowance
	initialCongress
	mint
	finishMinting
	pause
	unpause
		)
9.合约 DRCTOwner 继承 MultiOwnerContract
	setOnceMintAmount					dev函数设置薄荷标记数量
	initCongress
	mint
	finishMinting						dev函数停止创建新令牌
	freezeAccountDirect					dev在紧急情况下冻结帐户余额
	freezeAccount
	freezeAccountPartialy
	pause								dev由所有者调用以暂停、触发器停止状态
	unpause
9.DRCTOwnerFlattened.sol (接口 )
	接口(
	freezeAccount
	freezeAccountPartialy
	balanceOf
	allowance
	initialCongress
	mint
	finishMinting
	pause
	unpause
		)
library	StringUtils 公共类 
	compare								dev对两个字符串进行逐字节词典编纂比较
	equal								@dev比较两个字符串,并在它们相等时返回true
	indexOf

公共类 SafeMath
	mul
	div
	sub
	add
合约 Ownable
	OwnershipRenounced
	OwnershipTransferred
	构造函数 
	onlyOwner 函数修饰器 
	renounceOwnership					dev允许当前所有者放弃对合同的控制权
	transferOwnership					dev允许当前所有者将合同控制权转移给新所有者
	_transferOwnership					dev将合同控制权转让给新所有者
合约 Claimable 继承 Ownabe
	onlyPendingOwner 	函数修饰器 
	transferOwnership					dev允许当前所有者设置摆在所有者的地址
	claimOwnership						dev允许待决所有者地址最后确定转帐
	
合约 DelayedClaimable  继承 Claimable
	setLimits							dev用于指定挂起的
	claimOwnership						dev允许待决的Owner地址完成传输,只要它在指定的开始和结束时间内被调用
合约 RBAC
	checkRole							dev如果addr没有角色
	hasRole								dev确定addr是否具有角色
	addRole								dev将角色添加到地址
	removeRole							dev从地址移除
	onlyRole 函数修饰器 
合约 MultiOwners 继承 DelayedClaimable,RBAC
	OwnerAdded
	OwnerRemoved
	InitialFinished
	onlyMultiOwners 函数修饰器 
	canInitial							dev在初始化阶段抛出
	authorize							dev发送者将授权一种事件类型
	deAuthorize							发件人将清除他为该事件授予的授权
	hasAuth								dev判断该事件是否已获授权
	clearAuth							dev清除对某一类型事件的所有授权
	addAddress							dev添加一个地址作为多所有者之一
	initAddressAsMultiOwner				dev向白名单中添加地址
	finishInitOwners					dev函数停止初始阶段
	addAddressAsMultiOwner				dev向白名单
	isMultiOwner						getter以确定地址是否在多所有者列表
	removeAddressFromOwners				dev从白名单中删除地址
合约 MultiOwnerContract 继承 MultiOwners
	bindContract						dev将合同绑定为其所有者
	changeOwnedOwnershipto				dev将合同所有者从该合同地址更改为另一个合同地址
	ownedOwnershipTransferred
合约 DRCTOwner 继承 MultiOwnerContract
	setOnceMintAmount					dev函数设置薄荷标记数量				
	initCongress						dev将合同所有者从该合同地址更改为另一个合同地址
	mint
	finishMinting
	freezeAccountDirect					dev在紧急情况下冻结帐户余额
	freezeAccount
	freezeAccountPartialy				部分冻结
	pause
	unpause
library Roles  公共类 
	add
	remove
	check								dev检查地址是否具有此角色
	has									dev检查地址是否具有此角色
	
10.DRCTParams.sol (平台上定义钱包管理参数的合同)
合约 DRCWalletMgrParams 继承 Claimable,Autonomy
	initialReMintCap
	initialOnceMintAmount
	setReMintCap
	setOnceMintAmount
11.FlyDropToken.sol (标题转移令牌到多个地址)
合约 FlyDropToken 继承 Claimable
	ReceiveApproval   事件 
	receiveApproval						dev收到ERC 20令牌合同的批准,取一个记录
	multiSend							dev将令牌发送到一个函数中的其他多个地址
	multiSendFrom						dev将令牌发送到一个函数中的其他多个地址
	getApproveRecord					dev获取关于批准的记录
12.FlyDropTokenFlattened.sol (安全运算)
	安全运算
	mul
	div
	sub
	add
合约 Ownabe
	OwnershipTransferred				构造函数,把合同owner谢伟创建者
	onlyOwner
	transferOwnership					dev允许当前所有者设置摆在所有者的地址
合约 Claimable 继承 Ownable 
	onlyPendingOwner
	transferOwnership
	claimOwnership
合约 FlyDropToken 继承 	Claimable
	ReceiveApproval
	receiveApproval						dev收到ERC 20令牌合同的批准,取一个记录
	multiSend
	multiSendFrom
	getApproveRecord
合约 ERC20Basic
	totalSupply
	balanceOf
	transfer
	Transfer
合约 ERC20	 继承 ERC20Basic
	allowance
	transferFrom
	approve
	Approval
13.FlyDropTokenMgr.sol (管理多个地址的传输令牌)
合约 FlyDropTokenMgr 继承 Poweruser
	prepare								dev将令牌发送到一个函数中的其他多个地址
	flyDrop								dev将令牌发送到一个函数中的其他多个地址
	上面这两个为什么一样呢?我也不知道,但是个人觉得应该是中间调用把
14.FlyDropTokenMgrFlattened.sol(又是安全运算)
library SafeMath 安全运算
	mul
	div
	sub
	add
合约 	Ownable
	OwnershipRenounced
	OwnershipTransferred
	renounceOwnership
	transferOwnership
合约 Claimable 继承 Ownable	
	onlyPendingOwner
	transferOwnership
	claimOwnership
合约 SimpleFlyDropToken 继承 Claimable
	setToken
	multiSend								dev将令牌发送到一个函数中的其他多个地址
合约	DelayedClaimable 继承  	Claimable
	setLimits
	claimOwnership
合约 FlyDropTokenMgr 继承  DelayedClaimable
	prepare
	flyDrop
合约 ERC20Basic
	totalSupply
	balanceOf
	transfer
合约 ERC20 继承 ERC20Basic
	allowance
	transferFrom
	approve
	Approval 事件
15.FlyDropTokenMgrInterface.sol(标题管理到多个地址的传输令牌)
	接口 IFlyDropTokenMgr
	prepare
	flyDrop
	isPoweruser
16.LockedStorage.sol(锁定存储)
合约 LockedStorage 继承 Withdrawable,Claimable
	addAccount						dev添加默认取款钱包的定金契约地址
	removeAccountAddress			dev从帐户地址列表中删除一个地址
	removeAccount					dev从存储中移除存款合同地址
	addLockedTime					dev添加一个帐户的时间记录
	removeLockedTime				dev从一个帐户的时间记录列表中删除时间记录
	increaseBalance					dev增加此存款地址的余额
	decreaseBalance					dev减少此存款地址的余额
	freezeTokens					dev冻结存款地址
	isExisted						dev获取存款帐户的余额
	walletName						dev获取存款地址的钱包名称
	balanceOf						dev获取存款帐户的余额
	frozenAmount					dev获取存款地址的冻结金额
	addressByIndex 					dev按索引获取帐户地址
	changeEndTime					dev设置帐户释放时间的新结束时间
	setNewReleaseEndTime			dev设置帐户的新发布期间结束时间
	decreaseRemainLockedOf			dev减少帐户的剩余锁定量
	lockedStagesNum					dev获取帐户的锁定阶段
	endTimeOfStage					dev获取帐户的锁定阶段的结束时间
	remainOfStage					dev获取帐户锁定阶段的剩余未租赁令牌
	amountOfStage					dev获取帐户锁定阶段的剩余未租赁令牌
	releaseEndTimeOfStage			dev获取帐户的剩余释放期结束时间
17.LockedStorageInterface.sol(接口)
	接口 ILockedStorage
	frozenAccounts					获取钱包地址的冻结状态
	isExisted						根据帐户地址和索引获取钱包地址
	walletName						根据帐户地址和索引获取钱包名称
	frozenAmount					获取帐户地址的冻结金额
	balanceOf						获取帐户地址的余额
	addressByIndex					按索引获取帐户地址
	lockedStagesNum					获取目标地址的锁定阶段数
	endTimeOfStage					获取帐户锁定阶段的结束时间
	remainOfStage					获取帐户锁定阶段的未租赁令牌
	amountOfStage					获取帐户锁定阶段的未租赁令牌	
	releaseEndTimeOfStage			获取帐户的剩余释放期结束时间
	size							获取帐户地址的冻结金额
	addAccount						为那个钱包加上一个帐户地址
	addLockedTime					添加一个帐户的时间记录
	freezeTokens					冻结或释放已锁定在帐户地址中的令牌
	increaseBalance					增加此帐户地址的余额
	decreaseBalance					减少此帐户地址的余额
	removeAccount					从存储中删除帐户契约地址	
	removeLockedTime				从一个帐户的时间记录列表中删除时间记录
	changeEndTime					设置帐户的新发布期间结束时间
	setNewReleaseEndTime			设置帐户的新发布期间结束时间
	decreaseRemainLockedOf			减少帐户的剩余锁定金额
	withdrawToken					从本合同中撤回代币
18. Migrations.sol (迁移)
合约 Migrations
	restricted 修饰器
	Migrations 
	setCompleted
	upgrade
19.MintDRCT.sol (初始化DRC)
合约 MintDRCT 继承 OwnerContract,Autonomy
	afterCapInit		函数修饰器 
	initialCaps						dev为每个主要帐户设置容量限制
	mintUnderCap					DRC令牌来自一个特定的钱包地址
	mintAll							DRC令牌来自服务器特定的钱包地址
	mintUptoCap						@dev Mint DRC令牌来自服务器特定钱包地址直至上限限制
	raiseCap						dev提高一个特定钱包地址的供应量
	getMainAccount					dev查询一种类型的主帐户地址
	getAccountCap					dev查询一种主要帐户的供应能力
	setMainAccount					dev将一种主要帐户类型设置为另一种地址
20.MintDRCTFlattened.sol (公共类)
	library SafeMath 安全运算	
		mul
		div
		sub
		add
合约 Ownable
	OwnershipRenounced
	OwnershipTransferred
	构造函数  	constructor
	onlyOwner 函数修饰器 
	renounceOwnership
	transferOwnership
	_transferOwnership
合约 Autonomy 继承 Ownable
	onlyCongress 函数修饰器
	initialCongress
	changeCongress
	changeCongress
合约 Claimable 继承 Ownable
	onlyPendingOwner 函数修饰器
	transferOwnership
	claimOwnership
合约 DelayedClaimable 继承 Claimable
	setLimits
	claimOwnership
合约 OwnerContract 继承 DelayedClaimable
	bindContract
	transferOwnershipBack							dev将合同所有人从合同地址更改为原始地址
	changeOwnershipto								dev将合同所有者从该合同地址更改为另一个合同地址
	
合约 MintDRCT 继承 OwnerContract,Autonomy
	afterCapInit 函数修饰器
	initialCaps										dev为每个主要帐户设置容量限制
	mintUnderCap									DRC令牌来自一个特定的钱包地址
	mintAll											DRC令牌来自服务器特定的钱包地址
	mintUptoCap										@dev Mint DRC令牌来自服务器特定钱包地址直至上限限制
	raiseCap										dev提高一个特定钱包地址的供应量
	getMainAccount									dev查询一种类型的主帐户地址
	getAccountCap									dev查询一种主要帐户的供应能力
	setMainAccount									ev将一种主要帐户类型设置为另一种地址
合约 ERC20Basic
	totalSupply										dev存在的令牌总数
	balanceOf
	transfer
	Transfer
合约 BasicToken 继承 ERC20Basic
	totalSupply										dev存在的令牌总数
	transfer										dev传输令牌用于指定地址
	balanceOf
合约 ERC20 继承 ERC20Basic
	allowance
	transferFrom
	approve
合约 StandardToken 继承 ERC20,BasicToken
	transferFrom
	approve
	allowance
	increaseApproval
	decreaseApproval
合约 MintableToken 继承 StandardToken,Ownable
	Mint
	MintFinished
	hasMintPermission
	mint
	finishMinting
21.MultiOwnerContract.sol(合约暂定)
合约 	MultiOwnerContract 继承 MultiOwners
		bindContract								dev约束合同的所有者
		changeOwnedOwnershipto
		ownedOwnershipTransferred					确认拥有合同的所有人已经被转让
22.MultiOwners.sol(白名单合同有一个地址白名单,并提供基本的授权控制功能)
合约MultiOwners 继承 DelayedClaimable,RBAC
	OwnerAdded
	OwnerRemoved
	InitialFinished
	onlyMultiOwners 函数修饰器 
	canInitial 函数修饰器 
	authorize										dev发送者将授权一种事件类型
	deAuthorize										dev发送者将清除他为该事件授予的授权
	hasAuth											dev判断该活动是否已获授权
	clearAuth										dev清除对某一类型事件的所有授权
	addAddress										dev添加一个地址作为多所有者之一
	initAddressAsMultiOwner							dev向白名单
	finishInitOwners								dev函数停止初始阶段。
	addAddressAsMultiOwner							dev将地址添加到白名单
	isMultiOwner									getter以确定地址是否在多所有者列表中
	removeAddressFromOwners							dev从白名单中删除地址
23.OwnerContract(业主合同)
合约 OwnerContract 继承 DelayedClaimable
	bindContract									dev约束合同的所有者为其所有者
	changeOwnershipto								dev将合同所有者从合同地址更改为另一个地址
	ownedOwnershipTransferred						dev确认拥有合同的所有人已被转让
24.PowerUser.sol (dev Poweruser契约定义了一组也可以退出,有Owner函数的高级用户,即使他不是所有者)
合约 Poweruser 继承 DelayedClaimable,RBAC
构造函数
	onlyPoweruser 函数构造器
	onlyOwnerOrPoweruser 函数构造器	
	isPoweruser										getter以确定Address是否具有Poweruser角色
	addPoweruser									dev作为超级用户添加一个新的帐户地址
	removePoweruser									dev从超级用户列表中删除一个新的帐户地址
24.ReleaseAndLockToken.sol(管理DRCT锁定和释放机制的合同)
合约 ReleaseAndLockToken 继承 OwnerContract
	initialize										dev将合同绑定为其所有者
	needRelease										判断我们是否需要释放一些锁定的令牌
	needReleaseFor									dev判断是否需要释放目标地址的锁定令牌
	freeze											dev冻结帐户的令牌数量
	transferAndFreeze								dev将一笔代币转入帐户,然后冻结令牌
	releaseTokens									dev将一定数量的令牌转移到帐户,然后冻结令牌
	releaseAllOnceLock								dev释放已锁定一次并将立即全部释放的令牌
	releaseAccount									dev释放帐户拥有的锁定令牌,该帐户只有一个锁定时间
	releaseWithStage								dev释放有几个阶段的帐户所拥有的锁定令牌
	setNewEndtime									dev设置帐户的释放时间的新结束时间
	setNewReleasePeriod								dev设置帐户的新发布期间长度
	getLockedStages									dev获取帐户的锁定阶段
	getEndTimeOfStage								dev获取帐户的锁定阶段的结束时间
	getRemainOfStage								dev获取帐户锁定阶段的剩余未租赁令牌
	getRemainLockedOf								dev获取帐户的总保持锁定令牌
	getRemainReleaseTimeOfStage						dev获取帐户的剩余释放期
	releaseMultiAccounts							dev释放多个帐户所拥有的锁定令牌
	releaseMultiWithStage							dev释放帐户所拥有的锁定令牌
	bytes32ToString
	freezeMulti										dev冻结多个帐户
	transferAndFreezeMulti							dev将标记的数量列表转移到帐户列表,然后冻结令牌
25.ReleaseToken.sol (接口实现)
	接口  itoken
	freezeAccount
	freezeAccountPartialy
	transferFrom
	balanceOf
	allowance
	frozenAccount
	frozenAmount
合约 ReleaseToken 继承 OwnerContract
	bindContract									dev约束合同的所有者为其所有者
	removeAccount									dev从冻结帐户列表中删除帐户
	removeLockedTime								dev从一个帐户的时间记录列表中删除时间记录
	getRemainLockedOf								dev获取帐户的总保持锁定令牌
	needRelease
	freeze
	transferAndFreeze
	releaseAllOnceLock
	releaseAccount
	releaseWithStage
	setNewEndtime
	setNewReleasePeriod
	getLockedStages
	getEndTimeOfStage
	getRemainOfStage
	getRemainReleaseTimeOfStage
	releaseMultiAccounts
	releaseMultiWithStage
	freezeMulti
	transferAndFreezeMulti
26.ReleaseTokenFlattened.sol (实现接口)
	接口 itoken(
			freezeAccount
			freezeAccountPartialy
			transferFrom
			balanceOf
			allowance
			frozenAccount
			frozenAmount
				)
library SafeMath 
		mul
		div
		sub
		add
		
合约 Ownable
	OwnershipTransferred
	构造函数 
	onlyOwner 函数修饰器
	transferOwnership
合约 Claimable 继承 Ownable
	onlyPendingOwner 函数修饰器		
	transferOwnership
	claimOwnership
合约  OwnerContract 继承 Claimable
	bindContract
	transferOwnershipBack
	changeOwnershipto
合约 ReleaseToken 继承 OwnerContract
	ReleaseFunds 事件 
	bindContract							dev将合同绑定为其所有者
	removeAccount
	removeLockedTime
	getRemainLockedOf
	needRelease
	freeze
	transferAndFreeze
	releaseAllOnceLock
	releaseAccount
	releaseWithStage
	setNewEndtime
	setNewReleasePeriod						dev设置帐户的新发布期间长度
	getLockedStages
	getEndTimeOfStage
	getRemainOfStage
	getRemainReleaseTimeOfStage
	releaseMultiAccounts
	releaseMultiWithStage
	freezeMulti
	transferAndFreezeMulti	
27.SimpleFlyDropToken.sol(标题转移令牌到多个地址)
合约 	SimpleFlyDropToken 继承 Claimable
	setToken
	multiSend
28.StringUtils.sol (dev对两个字符串进行逐字节词典编纂比较)
library StringUtils
	compare
	equal
	indexOf
29.TestTime.sol (获取时间)
合约 TestTime
	getNow
30.Withdrawable.sol (可撤回以太或代币的合约)
合约 Withdrawable 继承 Ownable
	ReceiveEther 事件
	WithdrawEther
	WithdrawToken
	构造方法
	withdraw
	withdrawToken

s******************************************************
Data location must be “memory” for parameter in function, but none was given.要在参数前面加mem
browser/Factory.sol:15:11: TypeError: Type contract Funding is not implicitly convertible to expected type address.地址类型要用()括起来然后转换
TypeError -所有的TypeError错误,都要加上一个()然后把类型显示的转换一下

"DRC公益扶贫",1000,10000,25000,'0xca35b7d915458ef540ade6068dfe2f44e8fa733c','0xbbf289d846208c16edc8474705c748aff07732db'

猜你喜欢

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