区块链技术在经历了十余年的发展后,渐呈“燎原之势”,不断在各行业落地生根。但同时,从技术的角度看,区块链应用开发仍然有着较高的门槛,存在不少痛点。为了提升应用开发各环节的用户体验,微众银行将自主研发的区块链应用开发组件WeBankBlockchain-SmartDev全面开源,多维度提速区块链应用开发效率。开源公告详见《区块链应用开发组件:助力低代码开发》。
WeBankBlockchain-SmartDev所包含的智能合约库组件,涵盖了从基础类型到上层业务的常见Solidity库代码,用户可根据实际需要进行参考、复用。该智能合约库已经集成到国家信息中心顶层设计的区块链服务网络BSN、微众银行自主研发的区块链中间件平台WeBASE中,并在供应链金融、存证、农牧溯源等多个业务场景中广泛应用。我们期待区块链技术爱好者和开源社区的伙伴们,一同参与共建,协力推动Solidity智能合约库向更成熟的技术、更完善的生态上发展。
智能合约库简介
作为一门实现了图灵完备的智能合约编程语言,Solidity编程语言的开发、设计、迭代、演化的逻辑完全基于区块链,并在区块链领域具有广泛的影响力和详尽的文档,被众多区块链底层平台所支持,其中就包括FISCO BCOS。
但是,Solidity编程语言也存在若干挑战。首先,受区块链昂贵的资源限制,Solidity舍去了诸多在其他语言中常见的特性,例如高级的语法等。其次,流行的Solidity智能合约库多为公有链所开发,与FISCO BCOS存在兼容性的问题。最后,智能合约编程的安全性要求高,且较难对合约进行升级,一旦存在安全漏洞,后果不堪设想。
为了解决上述问题,WeBankBlockchain-SmartDev-Contract智能合约库应运而生,包含了基础类型、数据结构、通用功能、上层业务等智能合约库。用户可根据实际需求进行参考、复用。智能合约库的设计初衷是提供场景化、通用化、可插拔的智能合约代码,从而最大程度地节约开发智能合约的时间,改变智能合约工具库匮乏的局面。
SmartDev-Contract智能合约库是一个“麻雀虽小,五脏俱全”的智能合约的工具类库,通过Solidity的library封装,旨在帮助Solidity开发者提升开发体验,避免重复造轮子,让编写Solidity语言也可以如编写Python语言那样“丝滑顺畅”。
SmartDev-Contract智能合约库的每个合约文件都来自于微众银行区块链工程师的细致打磨,来自于实际使用场景的“聚沙成塔”,覆盖了业务场景开发中的各种“犄角旮旯”,是开发智能合约的“10倍工程师”的不二法门。
从功能上来看,SmartDev-Contract智能合约库涵盖了从基础类型到上层业务的常见代码,用户可根据实际需要进行参考、复用。具体如下:
痛点及解决方式
以在Solidity语言中将address类型转为string为例。
过去:
打开搜索引擎或github->搜索关键字“Solidity address convert to string”->找到相关的搜索结果->拷贝相关的代码->粘贴到自己的智能合约代码中。
如果无法搜索到相关的代码,开发者必须重新造轮子,耗时耗力的同时,还可能引入新的风险。
现在:
直接下载智能合约代码库->解压->找到相关的库合约->引入代码->调用相关函数。智能合约代码库地址:
https://github.com/WeBankBlockchain/SmartDev-Contract/archive/refs/tags/V1.0.0.zip
pragma solidity ^0.4.25;
import "./LibAddress.sol"
contract Demo {
...
address addr = 0xE0f5206BBD039e7b0592d8918820024e2a7437b9;
bytes memory bs = LibAddress.addressToBytes(addr);
}
开发者引入或拷贝网络上未知来源的代码可能出现重大的bug。同样的,自己重新编写的代码可能因为缺乏测试或实践检验,更易出现风险。智能合约库提供了方便、成熟、安全、低成本的解决方案。
痛点一:计算可能溢出
在智能合约的开发中,数值计算问题不可避免。但是,Solidity内置的运算机制不够安全,因计算问题导致的智能合约安全事故屡见不鲜。
SmartDev-Contract智能合约库提供了安全计算的代码类库。以uint256数据类型为例,LibSafeMathForUint256Utils提供了Uint256类型的相关计算操作,且保证数据的正确性和安全性,包括加法、减法、乘法、除法、取模、乘方、最大值、最小值和平均数等操作。其他的数值类型可以自行参考实现。
1、加减乘除运算
functi