区块链企业钱包开发爬坑日记——疯狂的资金数据类型
2020-04-16 20:09:58 #区块链钱包开发 #区块链企业钱包开发 #区块链企业级钱包开发

本人2018年入坑区块链钱包开发,期间也踩了不少的坑。从今天开始,我将会在优盾钱包用户群(想进群的朋友可添加小助手二维码)定期分享一些关于区块链钱包开发方面的科普文章,可以让各位初学区块链的朋友少走一些弯路。
区块链的概念,我就不多做赘述了,网上有很多资料。现在我就企业级钱包和个人版钱包的区别给大家做一个简单的讲解。顾名思义,个人钱包是服务于个人的,类似于BTC core这种个人版钱包也仅仅支持单个币种,没有相关的业务支持功能,可延展性较差,仅仅适用于个人管理自己的数字资产。企业级钱包是服务于企业客户的,是一款旨在为一个甚至多个生态服务钱包管理工具。以优盾钱包为例,从区块链角度上来说企业钱包支持跨链、多地址。从业务角度来说,区块链企业钱包提供SDK进行业务的对接,可延展性强,类似交易所、商城等业务系统都可以实现对接。从管理的角度来说,企业钱包对用户、用户权限、钱包、钱包权限进行综合有效的管理。从安全角度上来说,企业钱包属于冷钱包,仅仅交易通过节点进行发送,钱包导入行为可使用授权码导入,且有时效性,这也为钱包持有者在分配钱包权限给其他用户使用时降低了风险。
之所以介绍区别,是因为一些刚入坑的小伙伴,大部分都是以BTC为研究对象进行钱包开发的,可以认为是从个人版钱包爬坑出来的。以BTC为例,精度Decimals为8,发行总量为2100万,以最小单位计算,BTC的最大值为2100000000000000,我们在跨链整合的道路上就可能踩中第一个坑了。
在这种情况下,很多人资金定义的数据类型,分为两种,一种是以标准单位BTC为基准,将类型定义为Double、Float、Decimal,表字段类型定为了decimal、float、decimal。另外一种是以最小单位为进准,将数据类型定义成Long,表字段类型也定义为了long。下面我们对以上几种类型进行一下分析:
1、Double
①精度:16位有效数字
②值范围:[-1.7976931348623157E+308, 1.7976931348623157E+308]
11987654.32198765 打印 出来 11987654.32198765
2、Float
①精度:7位有效数字
②值范围[-3.4028235E+38, 3.4028235E+38]
11987654.32198765 打印 出来 11987650.00000000
3、Decimal
①精度:38 位有效数字,默认18位
②值范围[-79228162514264337593543950335,79228162514264337593543950335]
11987654.32198765 打印 出来 11987654.32198765
4、Long
①精度:15位有效数字
②值范围[-79228162514264337593543950335,79228162514264337593543950335]
1198765432198765 打印 出来 1198765432198765
经过上述分析可以看出,Float直接就可以放弃了,也就选择了Double、Decimal、Long类型其中一个作为资金的数据类型了,如果你也是这样,那恭喜你,入坑了。
企业钱包第一个接入的币种是BTC系列,那么第二个币种应该就是ETH系列币了,这两个系列币在币圈太具有代表性了,以至于很多不接触币圈的人都知道这两种系列币。以下以ETH系列币为例再对几个类型进行进一步分析:
1、接ETH系列币初期,币种精度Decimals为18,自此Double被弃用。
2、中期接触到大额的ETH系列币转账时,会发现ETH系列币是没有发行上限的,理论上是2^256-1,在这种情况下Decimal和Long也就无法满足了。
这就是我在入区块链遇到的第一个大坑,且是在ERC20都已经接入时暴露出来的,且填坑填了很久。如果你发现自己也入了这个坑,赶紧矫正过来,如果还没有开始开发,那请避免。
1、资金数据类型采用String、BigDecimal或者BigInteger,使用时转换成BigDecimal进行换算。
①部分语言没有C、C++、C#(4.0及以下)没有BigDecimal、BigInteger,可自行封装。
②Net Framework4.5后有了BigDecimal和BigInteger,所以使用此语言的伙伴可以直接使用4.5框架。
2、数据库资金数据类型采用String,查询排序时使用CAST为decimal后排序。查询过后转换成BigDecimal或BigInteger。
3、算数运算符与比较运算符的使用
① 我们通常使用的算数运算符是 + - * / ,BigDecimal和BigInteger算数运算符为Add、Subtract、Multiply、Divide,使用 + - * /得到的值可能是错误的。
②比较运算符一般为 < == > ,BigDecimal和BigInteger比较运算符为compareTo,根据值比较值与0的大小进行比较。a.compareTo(b) == -1,a小于b;a.compareTo(b) == 0,a等于b;a.compareTo(b) == 1,a大于b。
以上就是我对企业钱包开发跨链整合的第一个坑的总结,为什么这个放在第一个呢,因为数据结构、数据库表的定义是整个开发的基础,一旦基础有偏差,将与资金直接挂钩,造成重大损失,希望大家尽量避免。
相关文章:
2、交易所钱包开发 8个步骤成功轻松完成usdt离线签名交易
在線客服
申請試用
設置