Solidity智能合约库:区块链工程师的随身工具箱

pragma solidity ^0.4.25;import "./LibAddress.sol"contract Demo {...address addr = 0xE0f5206BBD039e7b0592d8918820024e2a7437b9;bytes memory bs = LibAddress.addressToBytes(addr);}
function f() public view {uint256 a = 25;uint256 b = 20;// a + buint256 c = LibSafeMathForUint256Utils.add(a,b);// a - buint256 d = LibSafeMathForUint256Utils.sub(a,b);// a * buint256 e = LibSafeMathForUint256Utils.mul(a,b);// a/buint256 f = LibSafeMathForUint256Utils.div(a,b);}
function f() public view {uint256 a = 25;uint256 b = 20;// a % buint256 c = LibSafeMathForUint256Utils.mod(a,b);// a ^ buint256 d = LibSafeMathForUint256Utils.power(a,b);}
function f() public view {uint256 a = 25;uint256 b = 20;// max(a, b)uint256 c= LibSafeMathForUint256Utils.max(a,b);// min(a, b)uint256 d = LibSafeMathForUint256Utils.min(a,b);// average(a, b)uint256 e = LibSafeMathForUint256Utils.average(a,b);}
function f() public view{uint256 a = 25;uint8 b = LibConverter.toUint8(a);}
function f() public view{uint256 a = 25;bytes memory b = LibConverter.uintToBytes(a);}
function f() public view{bytes memory a = "25";int b = LibConverter.bytesToInt(a);}
address addr = 0xE0f5206BBD039e7b0592d8918820024e2a7437b9;bytes memory bs = LibAddress.addressToBytes(addr);
bytes memory bs = newbytes(20);address addr = LibAddress.bytesToAddress(bs);
address addr = 0xE0f5206BBD039e7b0592d8918820024e2a7437b9;string memory addrStr = LibAddress.addressToString(addr);
string memory str="0xE0f5206BBD039e7b0592d8918820024e2a7437b9";address addr = LibAddress.stringToAddress(str);
uint[] private array;function f() public view {array=new uint[](0);// array add element 2LibArrayForUint256Utils.addValue(array,2);// array: {2}}
uint[] private array1;uint[] private array1;function f() public view {array1=new uint[](2);array2=new uint[](2);LibArrayForUint256Utils.extend(array1,array2);// array1 length 4}
uint[] private array;function f() public view {array=new uint[](2);array[0]=2;array[1]=2;LibArrayForUint256Utils.distinct(array);// array: {2}}
uint[] private array;function f() public view {array=new uint[](3);array[0]=3;array[1]=2;array[2]=1;LibArrayForUint256Utils.qsort(array);// array: {1,2,3}}
uint[] private array;function f() public view {array=new uint[](3);array[0]=3;array[1]=2;array[2]=1;uint256 key=3;LibArrayForUint256Utils.binarySearch(array,key);// array: {true, 1}}
uint[] private array;function f() public view {array=new uint[](3);array[0]=3;array[1]=2;array[2]=1;LibArrayForUint256Utils.removeByValue(array,2);// array: {3, 1}}
pragma solidity ^0.4.25;import "./LibString.sol";contract Test {function f() public{string memory str = "你好";uint256 lenOfChars = LibString.lenOfChars(str);uint256 lenOfBytes = LibString.lenOfBytes(str);require(lenOfChars == 2);require(lenOfBytes == 6);}}
pragma solidity ^0.4.25;import "./LibString.sol";contract Test {function f() public view returns(string memory) {string memory c = LibString.toUppercase("abcd");// Expected to be ABCDreturn c;}}
pragma solidity ^0.4.25;import "./LibString.sol";contract Test {function f() public view {bool r = LibString.equal("abcd","abcd");//Expected to be truerequire(r);}}
pragma solidity ^0.4.25;import "./LibString.sol";contract Test {function f() public view {bool r = LibString.startWith("abcd","ab");//Expected to be truerequire(r);}}
pragma solidity ^0.4.25;import "./LibBytesMap.sol";contract Test {using LibBytesMap for LibBytesMap.Map;LibBytesMap.Map private map;event Log(bytes key, uint256 index);function f() public {string memory k1 = "k1";string memory k2 = "k2";string memory k3 = "k3";string memory v1 = "v1";string memory v2 = "v2";string memory v3 = "v3";map.put(bytes(k1),bytes(v1));map.put(bytes(k2),bytes(v2));map.put(bytes(k3),bytes(v3));// 开始迭代uint256 i = map.iterate_start();while(map.can_iterate(i)){emit Log(map.getKeyByIndex(i), i);i = map.iterate_next(i);}}}
pragma solidity ^0.4.25;import "./LibAddressSet.sol";contract Test {using LibAddressSet for LibAddressSet.AddressSet;LibAddressSet.AddressSet private addressSet;event Log(uint256 size);function testAddress() public {//添加元素;addressSet.add(address(1));// {1}// 查询set容器数量uint256 size = addressSet.getSize();require(size == 1);// 获取指定index的元素address addr = addressSet.get(0);require(addr == address(1));// 返回set中所有的元素addressSet.getAll();// {0x1}// 判断元素是否存在bool contains = addressSet.contains(address(1));require(contains== true);// 删除元素addressSet.remove(address(1));}}
区块链技术完善的防篡改机制:使用区块链技术保全证据,进一步加强了证据不可篡改性。
证据效力得到机构认可:司法机构作为链上节点,对链数据参与认可和签名,事后可从链上确认数据的真实有效性。
服务持续有效:数据被多方共识上链后,即使有部分共识方退出也不会造成数据的丢失或失效。
在存证场景中可以抽象出三类典型用户:存证方、审核方和取证方。存证方提交需要存证的申请。
审核方基于内容,对存证数据进行审核和签名确认。实际业务场景中,审核方可能会涉及投票和多方审核的多签过程。
当存证上链后,取证方可随时查询存证者地址、时间戳和审核详情等相关信息进行核验。


Authentication:权限合约,用于提供基础的权限控制功能。
EvidenceRepository:存证数据仓库,它继承了权限合约,所有存证数据都被保存到数据合约里。这样可以起到统一存储、统一管理的效果。
RequestRepository:请求数据仓库,存储了存证数据和投票请求信息等。存证方开始提交存证数据并不会直接被写入存证仓库中,而是经过审核方签名完成后才会真正提交,审核方可以为多方。
EvidenceController:控制器,引入了两个数据仓库合约,可以完成所有用户接口的交互。包含了创建存证请求,审核人根据请求进行投票的功能。
区块链技术可以增加品牌曝光度:多个机构组成积分联盟,积分可有效通兑,实现客户资源引流,提升营销效果。 保证积分安全性:所有积分的生成和流转过程保存到链上,防止商户篡改和抵赖。 提升用户体验:不同商户和用户之间实现积分流转、互通,更加便利。


Admin:管理并生成合约,控制访问Data合约的地址
Controller:合约层对外暴露服务的控制器
Data:存储业务合约相关的数据
BasicAuth、IssuerRole:权限、角色的工具合约
LibRoles、LibSafeMath:权限mapping,数值计算的库
如项目对您有帮助,欢迎点亮我们的小星星(点击项目左上方Star按钮)。
欢迎提交代码(Pull requests)。
提问和提交BUG。
如果发现代码存在安全漏洞,可通过以下地址上报:
https://security.webank.com/
FISCO BCOS的代码完全开源且免费
下载地址↓↓↓
https://github.com/FISCO-BCOS/FISCO-BCOS

