区块链企业钱包开发爬坑日记——疯狂的资金数据类型

    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。

    以上就是我对企业钱包开发跨链整合的第一个坑的总结,为什么这个放在第一个呢,因为数据结构、数据库表的定义是整个开发的基础,一旦基础有偏差,将与资金直接挂钩,造成重大损失,希望大家尽量避免。


    相关文章:

    1、数字货币钱包开发如何对btc进行离线签名交易?

    2、交易所钱包开发 8个步骤成功轻松完成usdt离线签名交易

    3、除了盗币和内鬼,数字货币交易所钱包开发究竟还有哪些难点?

    4、9年资深开发者亲述:这些区块链交易所钱包技术开发核心技能必备!

    在線客服

    申請試用

    申請試用

    設置