1. Hi区块链首页
  2. 资讯
  3. 技术指南

墨客区块链(MOAC BlockChain) 钱包开发(2)

墨客区块链(MOAC BlockChain) 钱包开发(2)

从开发者的角度看,钱包的作用就是管理用户的私钥、通过私钥签名交易管理用户在区块链上的数字货币Cryptocurrency。它是用户对链上cryptocurrency的所有权凭证,这是一个不记名、不可挂失的凭证。

概念:幂等性

幂等性的定义是:一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外)。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。

这里需要关注的内容:

1、幂等不仅仅只是一次(或多次)请求对资源没有副作用(比如查询数据库操作,没有增删改,因此没有对数据库有任何影响)。2、幂等还包括第一次请求的时候对资源产生了副作用,但是以后的多次请求都不会再对资源产生副作用。3、幂等关注的是以后的多次请求是否对资源产生的副作用,而不关注结果。4、网络超时等问题,不是幂等的讨论范围。

幂等性是系统服务对外一种承诺(而不是实现),承诺只要调用接口成功,外部多次调用对系统的影响是一致的。声明为幂等的服务会认为外部调用失败是常态,并且失败之后必然会有重试。

鉴于区块链的共识机制,幂等性在交易及区块打包的过程中是需要考虑的。

1.钱包的分类

w81l5n7Wc0gr8urFwQFI7oVrwuXPjlIEz8Wsf2nt.png

on-chain:给一个钱包地址发送数字货币, 这笔交易在全网广播、被确认、被打包进区块。这是发生在链上的,被称为on-chain交易。on-chain钱包需要自己保管私钥。

off-chain:相对于on-chain交易是off-chain交易。通常,通过交易所进行的交易是off-chain的,本人并没有私钥。私钥在交易所,由交易所托管。所以交易所的钱包也是中心化的钱包。

冷钱包:冷即离线、断网,也就是说私钥存储的位置不能被网络所访问。例如纸钱包、脑钱包、硬件钱包等等。

热钱包:热即联网,也就是私钥存储在能被网络访问的位置。 例如存放在交易所的、在线钱包网站、手机App钱包都属于热钱包。通常而言,冷钱包更加安全,热钱包使用更加方便。

全节点钱包:除了保存私钥外,全节点钱包还保存了所有区块的数据。

轻钱包:它不必保存所有区块的数据,只保存跟自己相关的数据。基本可以实现去中心化。

中心化钱包:

所谓中心化钱包就是将所有的私钥文件存储在钱包服务商的服务器内,由服务商来报关这些文件,也就是说资产属于你,但私钥不由你保管。这样做的好处是用户根本不用记住私钥,只用记住在平台所开设的账户、登录密码和支付密码即可。即使忘记了密码,还是可以通过平台提供的忘记密码功能找回。当然,这样就不具有去中心化钱包的优点了。

去中心化钱包的好处是不用担心平台从中作梗,不用担心平台被黑客攻击而导致资产损失。

2.钱包的功能

钱包对外呈现可能有不同的功能,充值、提现、转账等,但从本质上来说只有一个功能,那就是转账。区块链本质上就是一个账本,记录着一笔笔交易,钱包当然离不开这个本质。

1、充值是钱包的外部账户向钱包的地址转账;2、提现是钱包的账户向钱包之外的地址转账;3、转账功能包括钱包内地址互转和向钱包外地址转账;

在此基础上,钱包一般包含以下基础功能:

1、创建新账号,生成私钥、生成助记词。

2、导入私钥,通过助记词、keystore或者私钥导入钱包;3、导出私钥或keystore;4、转账功能,也就是接收、发送数字资产、扫描二维码进行支付等;5、查询功能,查询资产余额及交易记录;6、修改密码等;

其他辅助功能:

1、资讯信息(交易类、项目方/币方信息、行业信息等);

2、观察地址(监听某些钱包地址的token数量);3、dapp容器。4、糖果;5、红包;

6、社交;

7、接口;

3.地址分配

用户在使用钱包的时候肯定需要有一个属于当前账户对应在区块链上的地址,这个地址如何生成呢?

有一种方法是这样实现的:每次当用户注册时就调用节点的personal.newAccount方法生成一个地址,并将地址存放在节点默认的位置。这种方式可以实现,但从技术上和安全上来讲是不可取的。

1、性能瓶颈之一,调用节点生成地址非常耗时,特别是当节点在处理一些同步或高消耗的工作时。2、性能瓶颈之二,当节点下的私钥越来越多,节点的启动会变得漫长。3、安全问题,节点对外要广播交易,又要保存敏感的私钥信息,安全问题巨大。因此,可在无节点的情况下通过代码直接生成符合私钥规则的、与网络无关的公私钥。

私钥存储在客户端,确保私钥与外网的隔离性,从而确保私钥的安全。

私钥的存放应该进行加密处理。

4.交易

4.1交易确认

并不是我们查询区块链中的交易就说明这笔交易已经成功了,墨客是默认确认12次之后,此交易几乎不会被篡改,那么怎么计算确认次数呢?

8zFbmhn51hiL9dOxqvyvy3DnHOCwTu4HrTjNIxTy.png

此处注意事项:交易有可能会被孤立,在执行此公式时需要验证一下区块中此交易是否还是在那个区块上,是否已经被回滚。

交易的gas费算是常识性的内容,可给用户一些参考值,让用户选择愿意支付的手续费。最笨拙而又有效的方法是定期观察一下区块链上交易成功的交易的 gasPrice 的大概范围,动态的调整一下价格,而 gasLimit 在不影响交易的情况下,尽可能稍微多一些,因为此部分如果未使用还会退换到交易发起账户中。

4.2交易中nonce维护

a、转账地址的合法性检查,此合法性检查可以避免后续很多问题的出现,比如 nonce 值的维护。

b、交易的金额检查,nonce 值检查(nonce 值会遇到的问题前面已经提到过),特别是私钥与节点分离之后自己来维护私钥时 nonce 值会是一个很大的问题,比如前一笔交易失败,nonce 值需要回退,此时后一笔交易已经发出,因为前一笔 nonce 没有被补齐,后一笔迟迟不会被交易。这些都需要业务进行特殊判断和处理。c、查询一个地址 nonce,mc.getTransactionCount。

4.3交易记录

墨客区块链只能通过遍历区块交易的方法来判断是否有对应账户的交易。相关操作步骤主要包括:

a、查询区块高度,比对是否是新生成的区块,mc.blockNumber;b、查看区块内容及详细交易,mc.gethBlock;c、比对交易的 toAddress 是否为本钱包的地址,如果是则记录此笔交易到数据库,并

录交易状态(确认次数等);d、保证入库和记账的幂等性,因为会多次查询到同一笔交易;e、作为钱包开发来说,实际需要解析所有交易,并保存到数据库备查。

5.节点

5.1节点孤立

在发起或检查交易是否成功不仅仅要检查确认次数,还需要检查交易是否被孤立。孤立的情况用下面的图来展示分析一下:

ZsLtEXk1Wobdb95Nz2TAzSZvDdbx3w8trk1HAEwK.png

节点孤立是什么情况?在上面图中,第1、2区块成功打包记入区块链,当到第3块时,有两个节点同时挖出第3块,整个区块链中有一部分认同了上面的链,有一部分认同了下面的链,此时因为都只有3块,没办法确认哪个是主链。但此时区块已经出现了分叉情况。当更多的块被挖出,在某一时间节点,上面的链的长度比下面的长了,此时所有的节点都会认为最长的为正确的链,下面的第3、4块打包的交易将会被回滚,等待重新打包。此时,第3、4块的状况叫做被孤立。

套入签名的业务逻辑,我们的节点处于被孤立的链上时,我们之前扫描到的交易所在区块高度是可变的,在那个区块上已经没有我们的交易了,如果此时对账户进行增减记账,会发生资产的不一致。

那么如何检测孤立区块呢?

1、监控区块的高度变化,并记录在本地数据库,同时,每收到一笔新的交易,都对比一下此交易记录的前一块交易 hash 是否一致,如果不一致说明区别已经被孤立,递归判断找到被孤立的前一块,然后从那块继续扫描,重新整理判断交易情况。2、此处特别注意确保幂等性。3、区块被孤立同时需要更新本地数据中此笔交易状态为被孤立状态。

5.2节点热备

由于每个节点同步到的数据进度差距太大,没办法像中心化的业务一样做负载均衡,只能通过热备的形式来保证当一个节点出现故障时能够快速切换到另外一个节点。因为区块打包本身就比较耗时,因此此处的时效性要求还是可以容忍的。

RxFVkxfWuBMxzK7kkkimWQn24KEUel8IiOWnwvtq.png

5.3节点安全

之前很多朋友因为将节点公网开放而导致资产损失,正是因为没有正确的认识到 json-rpc 不同权限的接口的问题。这里再次声明一下,以下功能在节点启动后慎重对外往开放:

。personal。net。txpool。miner。admin等我们不需要的其实最安全的模式就是节点只对外进行广播交易。

6.钱包的整体框架

钱包可以通过此种架构来达到高可用和安全性兼顾。

69nyjdux4ojiGsck641XdDT2GXkXimggJUxmvkvD.png

声明:登载此文出于传递更多信息之目的,观点仅代表作者本人,绝不代表Hi区块链赞同其观点或证实其描述。

提示:投资有风险,入市须谨慎。本资讯不作为投资理财建议。