Solidity智能合約庫:區(qū)塊鏈工程師的隨身工具箱

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容器數(shù)量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));}}
區(qū)塊鏈技術完善的防篡改機制:使用區(qū)塊鏈技術保全證據(jù),進一步加強了證據(jù)不可篡改性。
證據(jù)效力得到機構認可:司法機構作為鏈上節(jié)點,對鏈數(shù)據(jù)參與認可和簽名,事后可從鏈上確認數(shù)據(jù)的真實有效性。
服務持續(xù)有效:數(shù)據(jù)被多方共識上鏈后,即使有部分共識方退出也不會造成數(shù)據(jù)的丟失或失效。
在存證場景中可以抽象出三類典型用戶:存證方、審核方和取證方。存證方提交需要存證的申請。
審核方基于內容,對存證數(shù)據(jù)進行審核和簽名確認。實際業(yè)務場景中,審核方可能會涉及投票和多方審核的多簽過程。
當存證上鏈后,取證方可隨時查詢存證者地址、時間戳和審核詳情等相關信息進行核驗。


Authentication:權限合約,用于提供基礎的權限控制功能。
EvidenceRepository:存證數(shù)據(jù)倉庫,它繼承了權限合約,所有存證數(shù)據(jù)都被保存到數(shù)據(jù)合約里。這樣可以起到統(tǒng)一存儲、統(tǒng)一管理的效果。
RequestRepository:請求數(shù)據(jù)倉庫,存儲了存證數(shù)據(jù)和投票請求信息等。存證方開始提交存證數(shù)據(jù)并不會直接被寫入存證倉庫中,而是經(jīng)過審核方簽名完成后才會真正提交,審核方可以為多方。
EvidenceController:控制器,引入了兩個數(shù)據(jù)倉庫合約,可以完成所有用戶接口的交互。包含了創(chuàng)建存證請求,審核人根據(jù)請求進行投票的功能。
區(qū)塊鏈技術可以增加品牌曝光度:多個機構組成積分聯(lián)盟,積分可有效通兌,實現(xiàn)客戶資源引流,提升營銷效果。 保證積分安全性:所有積分的生成和流轉過程保存到鏈上,防止商戶篡改和抵賴。 提升用戶體驗:不同商戶和用戶之間實現(xiàn)積分流轉、互通,更加便利。


Admin:管理并生成合約,控制訪問Data合約的地址
Controller:合約層對外暴露服務的控制器
Data:存儲業(yè)務合約相關的數(shù)據(jù)
BasicAuth、IssuerRole:權限、角色的工具合約
LibRoles、LibSafeMath:權限mapping,數(shù)值計算的庫
如項目對您有幫助,歡迎點亮我們的小星星(點擊項目左上方Star按鈕)。
歡迎提交代碼(Pull requests)。
提問和提交BUG。
如果發(fā)現(xiàn)代碼存在安全漏洞,可通過以下地址上報:
https://security.webank.com/
FISCO BCOS的代碼完全開源且免費
下載地址↓↓↓
https://github.com/FISCO-BCOS/FISCO-BCOS

