Solidity智能合约库:区块链工程师的随身工具箱
共 10511字,需浏览 22分钟
·
2021-04-22 11:36
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 + b
uint256 c = LibSafeMathForUint256Utils.add(a,b);
// a - b
uint256 d = LibSafeMathForUint256Utils.sub(a,b);
// a * b
uint256 e = LibSafeMathForUint256Utils.mul(a,b);
// a/b
uint256 f = LibSafeMathForUint256Utils.div(a,b);
}
function f() public view {
uint256 a = 25;
uint256 b = 20;
// a % b
uint256 c = LibSafeMathForUint256Utils.mod(a,b);
// a ^ b
uint256 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 2
LibArrayForUint256Utils.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 ABCD
return c;
}
}
pragma solidity ^0.4.25;
import "./LibString.sol";
contract Test {
function f() public view {
bool r = LibString.equal("abcd","abcd");//Expected to be true
require(r);
}
}
pragma solidity ^0.4.25;
import "./LibString.sol";
contract Test {
function f() public view {
bool r = LibString.startWith("abcd","ab");//Expected to be true
require(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