笔记

https://blog.csdn.net/boss2967/

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
/

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

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

函数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();
}
储存
所有的标识符(合约名称,函数名称和变量名称)都只能使用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链接

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

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

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

函数可见性定义符
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

全局变量

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

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

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

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

独立汇编

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

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

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

Events 事件
底层的日志接口

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

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

.balance。
访问block, tx, msg中的任何成员,除了msg.sig和msg.data之外。
调用任何未标记为pure的函数。
使用包含某些操作码的内联程序集。
编译器没有强制要求pure方法不读取状态
视图函数
当承诺不修改状态时,函数可以声明view
下面的语句被认为是修改状态:

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

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

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

函数修饰器
执行的函数之前自动检查条件
但整个执行逻辑会在前一个修改器后面定义的”_”后继续执行。
Getter函数
编译器会自动为所有public状态变量创建getter函数
Assert, Require, Revert 和 Exceptions
Solidity使用state-reverting异常来处理错误。 这种异常将回滚当前调用(及其所有子调用)状态的所有变化,并将错误标志给调用者
函数assert和require可以用于检查条件,如果条件不满足则抛出异常
assert函数只能用于测试内部错误,并检查不变量
应该使用require函数来确认input或合约状态变量满足条件,或者验证调用外部合约的返回值
作用域和声明
已声明的变量将具有其字节表示为全0的初始值
变量的初始值是任何类型的典型“零状态”(“zero-state)
对于静态大小的数组和bytes1到bytes32
在函数中任何位置声明的变量,它的作用域为整个函数,与声明位置无关
如果变量被声明,则在函数的开头将其初始化为其默认值
函数调用和赋值
前合约的函数可以直接内部(Internal)调用,也可以递归地调用
外部函数调用
请注意构造函数不能这样被调用, 因为这时合约还没有被创建
当调用其他合约的函数时, 发送的金额(Wei)和gas可以通过.value() 和 .gas()来设置
修饰符payable用在函数info上,因为如果不这么做的话,.value()将不可用
如果调用的合约不存在(帐户不包含代码)、被调用的合约内部抛出异常或gas不足,会导致异常
另外,在调用你的系统的其他合同或在第一次调用返回之前回到当前合约时也要小心。因为被调用的合约可以通过其函数调用,改变当前合约的状态变量。因此,在对你的合约中状态变量进行任何更改之后,调用外部函数,这样你的合约就不易受到重用。
如果两个合约同时调用另外一个合约的函数,那么在调用时候那些状态变量是共享的吗
具名调用和匿名函数参数
函数调用参数如果被包含在{}中, 可以任何顺序输出,参数列表必须和函数声明中的参数重合,但是可以任意顺序排序。
省略函数参数名
可以省略未使用的参数(尤其是返回值)的名称。这些参数仍然存在于堆栈上,但它们是不可访问的。
通过new创建合约 合约可以使用new关键字创建新合约
合约可以使用new关键字创建新合约。必须事先知道要创建的合约的完整代码,因此递归创建依赖(recursive creation-dependencies)是不可能的
表达式的计算次序
赋值(Assignment)
数组和结构体的组合
赋值到局部变量的成员(或元素)将改变状态。
输入输出参数
输入参数的声明方式与变量相同。不过有一个不同之处:输入参数中未使用的参数可以省略变量名。例如,假设我们希望我们的合同接受一个带有两个整数的外部调用,可以这样写:
输入参数的声明方式与变量相同
入参数中未使用的参数可以省略变量名
输出参数
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
  10. HashOperateLib OwnableCon
  11. insertHash param_Self是保存数据的地方
  12. deleteHash dev删除Hash,DELETE方法
  13. selectHash selectHash,选择方法
  14. transferOwnership dev允许所有者将合同控制权转让给新所有者。
  15. insertHash dev插入哈希,将散列插入到合约
  16. selectHash selectHash,从合同中选择散列
  17. deleteHash dev删除Hash,删除散列到合同
  18. kill dev杀死,销毁合同,并将乙醚发送至_upgrater
  19. withdraw dev退出,发送以太到目标
  20. 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

  1. 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 从本合同中撤回代币

  1. 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
withdrawTokens
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’