Skip to content

Commit 96816e2

Browse files
committed
Merge remote-tracking branch 'upstream/master'
2 parents 0c6a15d + 50946aa commit 96816e2

File tree

152 files changed

+8856
-31
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

152 files changed

+8856
-31
lines changed

.gitignore

100644100755
File mode changed.

LICENSE

100644100755
File mode changed.

README.md

100644100755
Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
| 依赖软件 | 说明 |备注|
1313
| --- | --- | --- |
14-
| Solidity | 0.4.25 | |
14+
| Solidity | 0.4.25-0.6.10 | |
1515
| Git | 下载需要使用Git | |
1616

1717
## 文档
@@ -41,28 +41,23 @@
4141
|3 | 原有合约功能 | 数学运算增强 |提供开方、指数、对数等运算。|
4242
|4 | 原有合约功能 | 位操作 |提供各种位操作,例如取整数最左或最右的1等。|
4343
|5 | 新增数据结构 | 二维数组 |可针对不同数据类型,提供二位数组的增、删、改、查、遍历、是否存在等操作。|
44-
|6 | 新增数据结构 | 单向链表 | 可针对不同数据类型,提供链表的创建、增、删、改、查、遍历及是否存在等操作。|
45-
|7 | 新增数据结构 | 集合 | 可针对不同数据类型,提供集合(Set)的创建、增、删、改、查、遍历及是否存在等操作。|
46-
|8 | 新增数据结构 | 梅克尔树 | 提供创建梅克尔树及验证功能|
47-
|9 | 新增内置函数 | 摘要计算 | 基于solidity内置函数keccak256、sha3、ripemd160等计算摘要|
48-
|10 | 新增内置函数 | 签名和验签 |提供基于solidity的签名和验证签名等功能|
49-
|11 | 新增内置函数 | 内置函数 |基于block、msg、tx等内置函数提供对应的功能|
50-
|12 | 新增内置函数 | 时间操作 |提供年月日时间计算、转化和查询功能|
51-
|13 | 新增功能模块 | 计数器操作 | 提供基于solidity的计数器功能|
52-
|14 | 新增功能模块 | 隐私计算 |试验zkrp等零知识证明算法,提供一个范围证明验证器合约|
53-
|15 | 新增功能模块 | 匿名投票 |实现匿名投票,在投票期间各票信息以密文形式上链,在投票结束后才公开|
54-
|16 | 新增功能模块 | 代理执行 |一个代理合约,主要包含添加待执行函数与过期时间、函数执行 等接口|
55-
|17 | 新增功能模块 | 角色操作 |提供角色的增、删、改、查等功能。|
56-
|18 | 新增功能模块 | 权限操作 |提供权限的创建、分配、取消等功能|
57-
|19 | 新增功能模块 | 多方签名 |提供一个抽象层面的多方签名功能,可以应用于多方认证的场景|
58-
|20 | 新增功能模块 | 多方投票 |提供多方投票功能,投票策略可多样化|
59-
|21 | 新增功能模块 | 黑白名单 |提供黑白名单的创建、查询、遍历、新增及删除等功能|
60-
|22 | 新增场景 | 商品溯源 |可针对商品溯源的全生命周期或其中的某项环节,提供智能合约的相关解决方案案例。|
61-
|23 | 新增场景 | 版权保护 |包括但不限于文化、专利、艺术品、数字内容的确权、鉴权等方案。|
62-
|24 | 新增场景 | 金融 |对于供应链金融、征信、反洗钱等金融场景,提供相关的智能合约通用化模板。|
63-
|25 | 新增场景 | 慈善公益 |基于慈善公益,提供但不限于善款追溯、善行激励等场景的使用场景|
64-
|26 | 新增场景 | 档案管理 |提供档案管理相关的功能实现,包括但不限于个人简历、学历证明、荣誉证明等使用场景|
65-
|27 | 新增场景 | 共享经济 |针对共享经济中的痛点,提供区块链的解决方案,例如租房、智能电网、图书共享等使用场景。|
44+
|6 | 新增数据结构 | 集合 | 可针对不同数据类型,提供集合(Set)的创建、增、删、改、查、遍历及是否存在等操作。|
45+
|7 | 新增内置函数 | 内置函数 |基于block、msg、tx等内置函数提供对应的功能|
46+
|8 | 新增内置函数 | 时间操作 |提供年月日时间计算、转化和查询功能|
47+
|9 | 新增功能模块 | 计数器操作 | 提供基于solidity的计数器功能|
48+
|10 | 新增功能模块 | 隐私计算 |提供隐私计算相关的合约,例如零知识证明等|
49+
|11 | 新增功能模块 | 匿名投票 |实现匿名投票,在投票期间各票信息以密文形式上链,在投票结束后才公开|
50+
|12 | 新增功能模块 | 代理执行 |一个代理合约,主要包含添加待执行函数与过期时间、函数执行 等接口|
51+
|13 | 新增功能模块 | 权限操作 |提供权限的创建、分配、取消等功能|
52+
|14 | 新增功能模块 | 多方签名 |提供一个抽象层面的多方签名功能,可以应用于多方认证的场景|
53+
|15 | 新增功能模块 | 多方投票 |提供多方投票功能,投票策略可多样化|
54+
|16 | 新增功能模块 | 黑白名单 |提供黑白名单的创建、查询、遍历、新增及删除等功能|
55+
|17 | 新增场景 | 商品溯源 |可针对商品溯源的全生命周期或其中的某项环节,提供智能合约的相关解决方案案例。|
56+
|18 | 新增场景 | 版权保护 |包括但不限于文化、专利、艺术品、数字内容的确权、鉴权等方案。|
57+
|19 | 新增场景 | 金融 |对于供应链金融、征信、反洗钱等金融场景,提供相关的智能合约通用化模板。|
58+
|20 | 新增场景 | 慈善公益 |基于慈善公益,提供但不限于善款追溯、善行激励等场景的使用场景|
59+
|21 | 新增场景 | 档案管理 |提供档案管理相关的功能实现,包括但不限于个人简历、学历证明、荣誉证明等使用场景|
60+
|22 | 新增场景 | 共享经济 |针对共享经济中的痛点,提供区块链的解决方案,例如租房、图书共享等使用场景。|
6661

6762
【报名方式】
6863
扫描下方二维码,回复:智能合约,加小助手微信入活动社群,填写在线报名表。

contracts/base_type/BasicDemo.sol

100644100755
File mode changed.

contracts/base_type/LibAddress.sol

100644100755
File mode changed.

contracts/base_type/LibConverter.sol

100644100755
File mode changed.
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
pragma solidity^0.4.25;
2+
import "./LibSafeMathForUint256Utils.sol";
3+
4+
library LibSafeMathForFloatUtils {
5+
using LibSafeMathForUint256Utils for uint256;
6+
7+
/*
8+
fmul:浮点数乘法
9+
a:被乘数
10+
dA:被乘数a的精度,若a = 1234,dA=2,实际表示浮点型数为12.34
11+
b:乘数
12+
dB:乘数的精度
13+
返回值:乘法后的结果,精度值(以被乘数精度为准)
14+
100.01 * 100.01 = 10000.0001 => 10000.00
15+
*/
16+
function fmul(uint256 a, uint8 dA, uint256 b, uint8 dB) internal pure returns (uint256 c, uint8 decimals) {
17+
decimals = dA;
18+
c = a.mul(b).div(10 ** uint256(dB));
19+
}
20+
21+
/*
22+
fdiv:浮点数除法
23+
a:被除数
24+
dA:被除数a的精度,若a = 1234,decimalsA=2,实际表示浮点型数为12.34
25+
b:除数
26+
dB:除数的精度
27+
返回值:除法后的结果,精度值(以被除数精度为准)
28+
10000.00 / 100.00 = 100.00
29+
*/
30+
function fdiv(uint256 a, uint8 dA, uint256 b, uint8 dB) internal pure returns (uint256 c, uint8 decimals) {
31+
decimals = dA;
32+
if(dA == dB) {
33+
c = a.mul(10 ** uint256(dA)).div(b);
34+
}
35+
else if(dA > dB) {
36+
//第一个参数精度更大
37+
b = b.mul(10 **uint256(dA - dB) );
38+
c = a.mul(10 ** uint256(dA)).div(b);
39+
} else {
40+
//第2个参数精度更大
41+
b = b.div(10 ** uint256(dB - dA) );
42+
c = a.mul(10 ** uint256(dA)).div(b);
43+
}
44+
}
45+
46+
/*
47+
fadd:浮点数加法
48+
a:加数a
49+
dA:加数a的精度,若a = 1234,decimalsA=2,实际表示浮点型数为12.34
50+
b:加数b
51+
dB:加数b的精度
52+
返回值:加法后的结果,精度值(以第1个参数精度为准)
53+
*/
54+
function fadd(uint256 a, uint8 dA, uint256 b, uint8 dB) internal pure returns (uint256 c, uint8 decimals) {
55+
decimals = dA;
56+
if(dA == dB) {
57+
c = a.add(b);
58+
}
59+
else if(dA > dB) {
60+
//第一个参数精度更大
61+
b = b.mul(10 **uint256(dA - dB) );
62+
c = a.add(b);
63+
} else {
64+
//第2个参数精度更大
65+
b = b.div(10 ** uint256(dB - dA) );
66+
c = a.add(b);
67+
}
68+
}
69+
70+
/*
71+
fsub:浮点数减法
72+
a:被减数
73+
dA:被减数a的精度,若a = 1234,decimalsA=2,实际表示浮点型数为12.34
74+
b:减数
75+
dB:减数b的精度
76+
返回值:减法后的结果,精度值(以第1个参数精度为准)
77+
*/
78+
function fsub(uint256 a, uint8 dA, uint256 b, uint8 dB) internal pure returns (uint256 c, uint8 decimals) {
79+
decimals = dA;
80+
if(dA == dB) {
81+
c = a.sub(b);
82+
} else if (dA > dB) {
83+
c = a.sub(b.mul(10 ** uint256(dA - dB)));
84+
} else {
85+
c = a.sub(b.div(10 ** uint256(dB - dA)));
86+
}
87+
88+
}
89+
90+
91+
}
92+
93+
94+

contracts/base_type/LibSafeMathForUint256Utils.sol

100644100755
File mode changed.
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
pragma solidity ^0.4.25;
2+
/**
3+
* @author wpzczbyqy <[email protected]>
4+
* @title uint256类型 二维数组操作
5+
* 提供二维数组的操作,增加新元素,删除元素,修改值,查找值,合并扩展数组等
6+
**/
7+
8+
library Lib2DArrayForUint256 {
9+
/**
10+
*@dev 二维数组中增加一个数组元素
11+
*@param array uint256类型二维数组
12+
*@param value uint256类型一维数组
13+
**/
14+
function addValue(uint256[][] storage array,uint256[] value) internal{
15+
require(value.length > 0, "Empty Array: can not add empty array");
16+
array.push(value);
17+
}
18+
19+
/**
20+
*@dev 查找二维数组中指定位置的值
21+
*@param array uint256类型二维数组
22+
*@param row 值所在的行
23+
*@param col 值所在的列
24+
*@return uint256 返回查找的值
25+
**/
26+
function getValue(uint256[][] storage array, uint256 row, uint256 col) internal returns (uint256) {
27+
if(array.length == 0){
28+
return 0;
29+
}
30+
require(row < array.length,"Row: index out of bounds");
31+
require(col < array[row].length, "Col: index out of bounds");
32+
return array[row][col];
33+
}
34+
35+
/**
36+
*@dev 修改二维数组中指定位置的值
37+
*@param array uint256类型二维数组
38+
*@param row 值所在的行
39+
*@param col 值所在的列
40+
*@param val 修改指定位置的值为val
41+
*@return uint256[][] 返回修改后的数组
42+
**/
43+
function setValue(uint256[][] storage array, uint256 row, uint256 col, uint256 val) internal returns (uint256[][]) {
44+
if(array.length == 0){
45+
return;
46+
}
47+
48+
require(row < array.length,"Row: index out of bounds");
49+
require(col < array[row].length, "Col: index out of bounds");
50+
array[row][col] = val;
51+
return array;
52+
}
53+
54+
/**
55+
*@dev 修改二维数组中指定位置的值
56+
*@param array uint256类型二维数组
57+
*@param row 值所在的行
58+
*@param col 值所在的列
59+
*@param val 修改指定位置的值为val
60+
*@return uint256[][] 返回修改后的数组
61+
**/
62+
function firstIndexOf(uint256[][] storage array, uint256 val) internal returns (bool, uint256, uint256) {
63+
uint256 row;
64+
uint256 col;
65+
if (array.length == 0) {
66+
return (false, 0, 0);
67+
}
68+
for(uint256 i = 0; i < array.length; i++) {
69+
for(uint256 j = 0; j < array[i].length; j++) {
70+
if(array[i][j] == val){
71+
row = i;
72+
col = j;
73+
return (true, row, col);
74+
}
75+
}
76+
}
77+
return (false, 0, 0);
78+
}
79+
80+
/**
81+
*@dev 删除二维数组中的某个数组元素
82+
*@param array uint256类型二维数组
83+
*@param index 删除第index个数组元素
84+
*@return uint256[][] 返回修改后的数组
85+
**/
86+
function removeByIndex(uint256[][] storage array, uint256 index) internal returns(uint256[][]) {
87+
require(index < array.length, "Index: index out of bounds");
88+
delete array[index];
89+
90+
while(index < array.length -1) {
91+
delete array[index];
92+
for(uint256 i = 0; i < array[index + 1].length; i++){
93+
array[index].push(array[index + 1][i]);
94+
}
95+
index++;
96+
}
97+
array.length--;
98+
return array;
99+
}
100+
101+
/**
102+
*@dev 合并两个二维数组
103+
*@param array1 uint256类型二维数组
104+
*@param array2 uint256类型二维数组
105+
*@return uint256[][] 返回合并后的数组
106+
**/
107+
function extend(uint256[][] storage array1, uint256[][] storage array2) internal returns(uint256[][]){
108+
require(array2.length > 0, "Extend: can not extend empty array");
109+
110+
for(uint256 i = 0; i < array2.length; i++){
111+
array1.push(array2[i]);
112+
}
113+
return array1;
114+
}
115+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
pragma solidity ^0.4.25;
2+
pragma experimental ABIEncoderV2;
3+
4+
import "./Lib2DArrayForUint256.sol";
5+
6+
contract TwoDArrayDemo {
7+
8+
uint256[][] private array;
9+
uint256[][] private array2;
10+
uint256[] val = [1,2];
11+
uint256[] val2 = [3, 4, 5];
12+
uint256[] val3 = [6, 7, 8, 9];
13+
14+
function addAndGetValue(uint256 row, uint256 col) public view returns (uint256) {
15+
array = new uint256[][](0);
16+
Lib2DArrayForUint256.addValue(array,val);
17+
Lib2DArrayForUint256.addValue(array,val2);
18+
// (1,1) => expected Return values:(4)
19+
return Lib2DArrayForUint256.getValue(array,row,col);
20+
}
21+
22+
function firstIndexOf(uint256 key) public view returns (bool, uint256, uint256) {
23+
array = new uint256[][](0);
24+
Lib2DArrayForUint256.addValue(array,val);
25+
// (2) => expected Return values:(true, 0, 0)
26+
return Lib2DArrayForUint256.firstIndexOf(array,key);
27+
}
28+
29+
30+
function setValue(uint256 row, uint256 col, uint256 key) public view returns (uint256[][]) {
31+
array = new uint256[][](0);
32+
Lib2DArrayForUint256.addValue(array,val);
33+
Lib2DArrayForUint256.addValue(array,val2);
34+
// (1, 0, 9) => expected Return values:([[1, 2] [9, 4, 5] ] )
35+
return Lib2DArrayForUint256.setValue(array,row,col,key);
36+
}
37+
38+
function removeByIndex(uint256 index) public view returns (uint256[][]) {
39+
array = new uint256[][](0);
40+
Lib2DArrayForUint256.addValue(array,val);
41+
Lib2DArrayForUint256.addValue(array,val2);
42+
Lib2DArrayForUint256.addValue(array,val3);
43+
// 1 => expected Return values:([[1, 2] [6, 7, 8, 9] ] )
44+
return Lib2DArrayForUint256.removeByIndex(array,index);
45+
46+
}
47+
48+
function extend() public view returns (uint256[][]) {
49+
array = new uint256[][](0);
50+
array2 = new uint256[][](0);
51+
Lib2DArrayForUint256.addValue(array,val);
52+
Lib2DArrayForUint256.addValue(array,val2);
53+
Lib2DArrayForUint256.addValue(array2,val3);
54+
// expected Return values:([[1, 2] [3, 4, 5] [6, 7, 8, 9] ] )
55+
return Lib2DArrayForUint256.extend(array,array2);
56+
}
57+
}

0 commit comments

Comments
 (0)