主页 > 官网最新版imtoken钱包 > 做一个区块链钱包并不难(2)

做一个区块链钱包并不难(2)

官网最新版imtoken钱包 2023-07-03 05:21:02

两年前,比特币蓄势待发,逐渐飙升至 20,000 美元以上。一时间,区块链、比特币、以太坊成为大家饭后的话题。几个月后,很多人入市被断,现在整个币圈不温不火。在这波来来去去的浪潮中,我加入了一家和区块链有些关系的公司,学习了一些关于区块链的技术,做了一个里面有区块链钱包的app。在这个虚幻、大起大落的环境中度过了一年多,关于区块链有一些特殊的内容是可以解决的,比如如何通过ICO发币,如何做钱包,想在这个市场上平平。阶段,做个总结。

比特币背后的区块链其实有很多有趣的算法和计算机网络相关的内容。区块链钱包无非是软件工程的实现。架构的设计和功能的实现只是一般的分布式软件开发,但需要更多的区块链和平台知识。

本文主要从功能需求、应用场景、架构、安全四个方面介绍什么是区块链钱包,为什么要做区块链钱包,以及如何做区块链钱包。

注意:做一个区块链钱包并不难(1)会讲如何在以太坊上发行自己的货币,其实就是一个ICO,但是因为过程不是技术性的,所以多半是比较麻烦,等有时间再写吧……

什么是区块链钱包?

说是区块链钱包,其实范围有点大。应该说是以太坊钱包。以太坊是最大的公共区块链平台。个人或公司可以在上面发布自己的货币。这是钱包。它的作用是在以太坊上存储各种币。

从应用的角度来看,以太坊钱包大致可以分为两类:

在以太坊上存储和管理无数代币。一个典型的代表就是imToken。任何币种都可以转入这个钱包,交易所存在被黑的风险。将货币从交易所转移到这些个人钱包会更安全。在 App 中管理单一货币的钱包。例如,简书2018年发布的简书贝(FTN),通过系统奖励用户发帖、阅读、点赞、评论等。简书贝可以在软件中兑换人民币,也可以在软件中兑换。可以兑换简书中的其他奖励。

本文主要讲第二种,App内嵌的以太坊钱包。钱包主要用于存储在以太坊上发行的硬币。为了简单起见,我们称之为ZBB(ZBB)。以太坊上的主流货币以太坊(ETH)也将在稍后涉及。每次发币都会有一个地址,我们称之为庄币地址,所有与庄币相关的交易都会记录到这个地址。

大致了解什么是区块链钱包后,接下来的问题是为什么要做区块链钱包?

为什么要制作区块链钱包?

这个问题可以从两个角度来考虑。

首先,对于发币的企业来说,除了币在交易所的流通之外,还应该有实际的落地场景,如果要实现币并与其他应用相结合,就必须有钱包来管理。

第二,对于已有应用的公司,在原有应用中加入区块链组件,起到了一些其他的作用,比如简书,在应用中加入简书贝,激发用户活跃度,增加用户留存的手段,在这种情况下,这样的钱包也是很有必要的。

如何制作与App集成的区块链钱包?

如何制作区块链钱包?功能需求

区块链钱包和传统软件中管理虚拟货币的钱包有什么区别?比如Q币钱包,Q币是QQ里的货币,我们只能充值,在QQ里消费,或者兑换成现金,除了QQ,没有办法把Q币转移到别的地方。但是以太坊的币就不同了。它们已经存在于以太坊上,可以放在任何“钱包”中,转移到我们开发的应用程序的钱包中,或者转移到其他以太坊钱包中,所以以太坊钱包需要的两个功能是转入和转出。除此之外,最基本的就是能够查询钱包的余额。根据这些需求,一些基本功能可以对应如下。

账户管理:用户可以管理他们的钱包并查看他们的余额。转出:用户将硬币从应用程序中的钱包转移到以太坊中的另一个钱包。内部转账:用户想在应用中向其他用户转账。由于硬币不会离开应用程序,因此称为内部转移。转入:用户可以将以太币转入App的以太坊钱包。功能实现

我们逐步实现这些要求。

账户管理

在传统软件中,我们通过用户名或电子邮件地址来识别用户,传输也是使用用户名。在以太坊的世界中,还需要类似于用户名的东西:公钥或公钥地址。这个公钥是随机生成的,每个公钥对应一个私钥。要将钱转给他人,您必须拥有私钥。钥匙,好像要打开这个被锁住的钱包,必须有对应的钥匙。因此,以太坊钱包最基本的东西就是存储每个用户随机生成的公钥和私钥,以及用户的余额。

内部转账

内部传输与传统软件传输相同。传统软件可以通过用户名转账,只需调整数据库中两个用户的余额即可。在我们的以太坊钱包中,我们不仅可以通过用户名转账,还可以通过公钥转账,收款人就是对方的公钥地址。如果这个公钥地址在我们的数据库中,就是内部用户,可以调整数据库。如果不是内部用户,说明地址在以太坊上,需要转入以太坊。

转出

转账需要根据他人的公钥将硬币转移到以太坊中的另一个“钱包”。

要向以太坊发送交易,需要以以太 (ETH) 支付一定的交易费用(gas)。谁应该支付交易费用?如果是用户支付,用户需要先将以太币转入本应用的钱包,但这需要钱包也管理以太币。如果由公司支付,则可以省略此功能和操作,但需要公司承担这部分的费用。如何选择取决于公司的业务决策。以下是影响技术决策并导致完全不同设计的典型业务决策示例。

这里我们假设公司支付这个比率。每个用户的帐户中都没有以太币。要支付这笔费用,最简单的方法是建立一个独立的账户,我们称之为热钱包。以太币转入热钱包,所有交易费用将从该账户中收取。扣除。

通常,热钱包也需要有我们的壮币。比如在简书这样的应用中,简书贝是主动奖励给用户的。一个用户有多少余额其实只是数据库里的数据,并不是说简书贝在他的以太坊钱包里真的有那些简书贝。这种情况下,转出需要从公司统一账户热钱包中转出。

综上所述,转出其实就是将币从Hot Wallet转移到另一个账户。

整个传输过程大致是这样的:

将此交易发送到以太坊。以太坊会判断交易能否成功。例如,如果交易费用不足,交易就会失败。交易成功,等待多次确认。因为区块链的特性,显示交易成功,仅仅意味着有“矿工”验证了你的交易没有问题。其他人可能会认为你的交易有问题,所以你需要等待更多的认证。通常有一个5、6个认证基本没问题。每笔交易都在以太坊的一个区块中,每个区块都有一个数字,该数字是递增的。以太坊中的每个新区块都是一个额外的身份验证。转入

用户只需要知道他们在应用程序中的公钥就可以在以太坊上操作并将硬币转移到应用程序。交易费用由用户支付,大部分运营钱包无需处理。

但我们的钱包需要不断地检查以太坊,看看是否有任何交易发送给我们的用户,如果有,则向用户添加余额。

热钱包管理

Hot Wallet 是公司统一的以太坊账户,里面包含以太币和庄币。转出时,以太币和庄币会减少。如果都用完了,就没有办法调出来了。所以,快用完的时候,需要有人来管理充值。

相应地,转账后的币在每个用户各自的账户里,这是一个比较麻烦管理的地方,因为都是从热钱包转过来的,那么这些币就存放在每个用户的公钥里,是闲置的,我们必须想办法将其转移到热钱包。

架构

有了具体的功能,每个功能是如何实现的,就要考虑如何更好的组织它。

随着用户越来越多,需要考虑高并发。假设转账费用由公司承担,通常公司会对业务进行一些限制,比如一个月只能转账多少比例。由于用户需要承担转入的成本,一个用户不能连续转小额,而是一次转大额,所以整体转出和流入的流量不会很大。并发要求不高。

还要考虑系统的高可用性。用户转入或转出后,他们会想在最短的时间内查看操作是否成功。不能转一笔钱,需要一个小时告诉用户转帐是否成功。所以对高可用的要求比较高。

整体设计注重高可用,所以我们使用分布式微服务来做这个架构:

[站外上传图片...(image-bfc968-1567643028384)]

作曲

主要分为三种服务:

钱包服务钱包服务以太坊服务以太坊服务以太坊监听器服务以太坊监听器

各种服务是如何连接实现功能的,我稍后再详述,在此之前,还有一点需要考虑:如何与以太坊同步,如何向以太坊发送交易,如何知道以太坊广场最新交易信息?

有两种解决方案:

在AWS上部署一个以太坊节点,AWS有区块链相关的部署支持,然后打通HTTP和Web Socket连接。对于第三方服务,例如提供 HTTP 和 Web Socket 连接的 Infura,我们将以太坊视为一个黑匣子并直接使用它。

这两种选择各有利弊。自行部署成本高,维护成本也高。使用第三方服务的担心是不够稳定。据说 Infura 不时挂起,这间接影响了我们的可用性。 Infura 发布了一个新的 Infura+,据说可以实现高可用性。对于早期开发和测试,选择 Infura 是免费的,可以节省时间和麻烦。您可以等到真正需要自己部署。

功能实现

Wallet Service 为核心,存储用户的公钥、私钥、账户余额、交易等数据。所有功能都从这里触发,账户管理和内部转账都可以在这个服务中完成。

Out 将交易发送到以太坊。从 Wallet Service 触发后,由 Ethereum Service 通过 gRPC 发送到 Ethereum。 Ethereum Service 会返回发送到 Ethereum 的交易的 Transaction Hash,Wallet Service 需要存储它。此时,交易仍在系统中等待处理。以太坊监听器监控最新的交易并将它们发送到钱包服务进行处理。这笔交易能否在以太坊中成功尚不得而知。例如,如果交易费用不够,交易最终会失败。使用以太坊监听器监听庄币地址上的交易,如果发现最新的,则通过消息队列发送到钱包服务。 Wallet Service 会检查该交易的 Transaction Hash 是否是我们之前发送的,如果是,则根据交易的状态,是成功还是失败,来改变交易的状态,是成功还是失败。等待 5 次身份验证以确认交易。假设交易成功,以太坊Listerner也会持续监控最新的区块,并通过Message Queue发送到Wallet Service。 Wallet Service 每次收到一个区块,都会将最新的区块编号与之前发送时的编号进行比较。如果差值为 5,则表示有 5 个认证,并且向外交易的状态更改为已确认区块链怎么查询账户余额,确认交易完成。转账用户从以太坊向App中的公钥地址发起庄币转账。 (不在系统中操作)与第二步转账类似,但Wallet Service在收到Message Queue的交易信息后,会检查目标地址是否是我们App中的公钥,如果是,则存储该交易。和第三步转出一模一样,等待5次认证。热钱包管理

热钱包的管理主要由两部分组成:Balance Watcher和Consolidator

我们需要监控热钱包中的以太币和壮币的数量。当值低于某个值时,会发送通知提醒管理员充值。这个功能叫做Balance Watcher,每隔几分钟/几小时调度一次,用来检查以太坊上的以太坊和庄币的余额。

另外,如前所述,必须有一种方式将每个用户转入各自账户的壮币转入各自的账户,并放在一个统一管理的地方,可以是Hot Wallet,也可以是其他地址,命名为Consolidator 这个函数会比较复杂。转出币需要支付手续费,并且需要先将手续费从热钱包转入用户账户。因为交易手续费是以太币,而转账以太币已经需要交易手续费了,所以需要花费一笔交易手续费将交易手续费转入账户。整个过程需要两次交易费用,相当昂贵。所以就看怎么转账了,比如忽略低价值的账户,只转账高价值的账户。

高可用性

这些服务可以部署在Kubernetes中,启动几个节点,一个死掉后有一个备份,补充一个可以自动重启。

钱包服务是核心服务。它可以启动三个节点。需要注意的是,在接收Message Queue中的信息时,需要设置Consumer的负载均衡。

以太坊服务主要影响壮币的转移。它是无状态的并且接受同步消息。挂断后重启就够了。

如果以太坊监听器挂了,就无法转入,也无法进行任何鉴权。重启后,这段时间内挂掉的区块和交易不会被处理,所以挂掉后需要有重启逻辑。可以这样处理。 Etheruem Listener通过grpc告诉Wallet Service最新的区块,Wallet Service在数据库中查询最新的区块,将丢失的区块数据批量(数据量可能很大)发送给Ethereum Listener,Ethereum听众去寻找它。这些缺失块中的数据。

其他

在区块链网络中,一个需要特别注意的问题是双花。比如用户只有10元,因为区块链交易不是立即完成的,用户可以同时使用这10元。两次交易的钱。比特币和以太坊都有地址来防止这种情况发生,但是在系统和以太坊之间进行通信时,在转出/转入时,需要考虑何时扣除/增加用户余额。

安全

每隔一段时间就会有消息说xxx交易所偷了足够多的钱让我们成为废物,而安全也是区块链相关项目的重中之重。

防盗

在刚才的设计中,Hot Wallet 的安全性是最重要的,层层加密并不过分。此外,还可以使用多个热钱包,以降低被困在一个锅里的风险。

另一个地方,和传统软件一样,是数据库的加密。否则,入侵者将窃取私钥,所有用户都可能成为 ATM。

反播放

除了防止技术黑客外,还要防止用户利用漏洞,或蓄意破坏。

比如上面提到的,要限制转账,每月交易多少,每笔交易的最低金额。

简书也做了批量转账操作区块链怎么查询账户余额,不是直接到账户,而是下个月内每周的一部分账户。

前景

区块链钱包是一个分布式系统,但除了一些分布式知识外,你还需要了解区块链和以太坊。当然,这些只是基本功能的实现,更复杂的功能也是可以的,比如OTC交易所给里面加币,可以在app里直接和其他用户买卖币,比如在币的地方进行交易可以派上用场在商场,可以用金币购买相应的东西等。

听到宽大的名词很多事情都很难,但分解它们并不难。