主页 > imtoken下载链接 > 以太坊钱包开发的基本思路和安全性

以太坊钱包开发的基本思路和安全性

imtoken下载链接 2023-01-17 05:13:43

前几章带你一步步完成以太坊的基本操作和代币的发行。本文是本系列课程的最后一篇,也是重头戏。带大家聊聊中心化存储钱包的设计以及研发过程中的Pit和业务处理。

以太坊钱包的分类

以太坊钱包的分类在第01课中已经介绍过,并举例说明。我们知道无论是 Geth 节点还是以太坊钱包都可以称为钱包,因为它们都可以存储以太币、发送交易指令等。但这里所说的钱包分类是另一个维度,基于Geth节点上层开发的手机APP钱包。根据私钥存放的位置,可以分为两类:

去中心化钱包

去中心化钱包不是本节的重点,这里只是简单介绍。无论是中心化钱包还是去中心化钱包,在App层面都是非常轻量级的。应用程序中没有内置 Geth 节点。事务的查询或发送是通过服务器执行的。不同的是,交易签名的私钥由谁保存并负责。

去中心化钱包有个关键词:助记词。助记符的作用可以用以下表达方式来描述:

私钥 = 助记词 = keystore+密码

从上面的公式可以看出助记词的重要作用,这也是去中心化钱包功能的一大亮点。在此类钱包中创建账户时,钱包会根据生成的私钥文件生成一组助记词,可以是英文也可以是中文,通过助记词逆向计算keystore+密码。助记词由用户手写并存储在安全的地方。进行交易时,输入助记词对交易进行签名并发送交易。当助记词丢失时,说明私钥丢失,钱包一般不保存用户的私钥信息,资产将永久丢失。

去中心化钱包的优点是不用担心平台挡路,也不用担心平台被黑造成资产损失,但需要个人拥有一定的私钥保管能力。

比特币外网交易多久到账

中央钱包

所谓中心化钱包就是将所有的私钥文件存放在钱包服务商的服务器中,服务商会保存这些私钥文件,也就是资产是属于你的,但是私钥不在你的监护权。这样做的好处是用户根本不需要记住私钥,只需要记住在平台上开设的账户、登录密码和支付密码即可。即使忘记密码,仍可通过平台提供的忘记密码找回。当然,这不具备去中心化钱包的优势。

让我们来看看开发这样一个去中心化钱包的幕后技术工作和想法。后面提到的钱包,如无特别说明,均指中心化钱包。

钱包的核心功能

钱包对外界可能有不同的功能,比如充值、提现、转账等比特币外网交易多久到账,但本质上只有一个功能,那就是转账。区块链本质上是一个记录交易的账本,钱包当然离不开这个本质。

这个过程也对应着钱包账户资金的增减。

如何分配用户地址

用户在使用钱包时必须在区块链上有一个属于当前账户的地址。如何生成这个地址?在技​​术交流群里,很多开发者是这样实现的:每次用户注册,都会调用Geth节点的personal_newAccount方法生成地址,地址保存在Geth节点的默认位置。这种方法是可以实现的,但从技术和安全角度来看,这是不可取的。

优化后的方法是提前批量生成地址。用户注册时,只需给用户分配地址即可。这样做的好处是:

比特币外网交易多久到账

这种生成Web3j的方法提供了对应的创建方法,可以直接通过代码生成符合私钥规则的公私钥,不需要Geth节点。当然,如果你有开发能力,也可以通过 Geth 源码中的私钥生成方法,提取独立于网络的单独生产私钥程序。

充值交易

在比特币钱包中,有子账户的概念。只需在一个普通账户下创建N个子账户,用户充值该子账户的比特币。硬币也会显示在钱包上,同时提供查询一个地址所有交易的方法。可惜以太坊没有提供这样的接口,只能通过遍历区块交易来判断对应账户是否有充值交易。

相关操作:

确认次数

这并不意味着我们在区块链中查询交易就表明交易已经成功。比特币是默认的确认 12 之后,这个交易就很难被篡改了。以太坊默认为6次,那么如何计算确认次数?

确认次数 = 当前区块高度 - 交易所在区块高度 + 1

请注意:交易可能是孤立的。执行这个公式时,需要验证区块中的事务是否还在那个区块中,是否已经回滚。同样,必须保证幂等性。

提现交易

比特币外网交易多久到账

提现交易也涉及到上面提到的知识点,但也有额外需要注意的事项。

提现和转账

提现和转账都是发起交易。以太坊的json-rpc中已经提到可以直接通过eth_sendTransaction和personal_sendTransaction转账。这是节点支持的Geth。转账前,您可以使用unlock方法解锁账号,前面章节已经讲过。

但对于私钥单独存储的情况,上述方法不适用。可以采用先签名后广播的方式:

在这种模式下,节点与外界打交道,唯一的功能就是广播交易,之前的所有操作都可以通过内网进行,极大的保证了私钥和交易的安全。

转会费

转账费是常识性内容,可以给用户一些参考价值,让用户可以选择自己愿意支付的费用,或者通过节点提供的eth_estimateGas来估算。

最笨拙有效的方法是定期观察区块链上成功交易的gasPrice大概范围,动态调整价格,而gasLimit不影响交易(过大账户余额检查)。在时间不够的情况下)尽可能多,因为这部分如果不使用会退回到交易发起账户。

孤儿节点

比特币外网交易多久到账

发起或检查以太坊交易是否成功,不仅是检查确认计数比特币外网交易多久到账,还要检查交易是否孤儿。孤立情况如下图所示:

enter image description here

节点隔离是什么情况?上图中,第二个区块1、成功打包并记录在区块链中。当到达第三个区块时,两个节点同时挖出第三个区块,整个区块链的一部分与上述一致。链的一部分与下面的链一致。此时,因为只有3个区块,所以无法确认哪个是主链。但此时,区块已经分叉。当挖出更多块时,在某个时间节点,上链的长度比下链的长度长。此时,所有节点都会认为最长的链是正确的链。块打包的事务将被回滚,等待重新打包。此时块3、4的条件称为孤儿。

嵌入了签名的业务逻辑。当我们的节点在一个孤立的链上时,我们之前扫描的交易所的区块高度是可变的,并且那个区块上没有我们的区块高度。交易完成后,如果此时加减账户,就会出现资产不一致的情况。

那么如何检测孤立块呢?

测试环境模拟孤立节点热备份

因为各个节点之间的数据进度差距太大,没有办法像中心化业务那样做负载均衡。以备份的形式保证当一个节点出现故障时,可以快速切换到另一个节点。因为分块打包本身比较耗时,所以这里的时效性要求还是可以容忍的。

enter image description here

节点安全

比特币外网交易多久到账

很多朋友因为将Geth节点开放到公网而丢失了资产,正是因为他们没有正确理解不同权限的json-rpc接口的问题。在前面的章节中我们已经介绍了不同节点的权限。这里再次小心地对外开放以下节点:

其实最安全的模式是geth节点只向外界广播交易。

私钥管理

上面已经穿插了这个块的内容,私钥单独存放,甚至加密两次。

钱包的整体架构

钱包可以通过这种架构同时实现高可用性和安全性。

enter image description here

总结

感谢大家的支持,这一系列课程结束了,正是因为你们的支持,我才有动力在工作之余创作这套课程,对我来说也是一个巨大的收获。如果时间允许,我稍后会为您开设更多课程。希望能帮到你,再次感谢!

原文出处