交易量排名的加密货币交易所- 加密货币所区块链开发公司谈开发知识第二篇

2026-01-21

  交易所,交易所排名,交易所排行,加密货币是什么,加密货币交易平台,加密货币平台,币安交易所,火币交易所,欧意交易所,Bybit,Coinbase,Bitget,Kraken,全球交易所排名,交易所排行(本文有彭利编写,有需求联系本人请看文章结尾)区块链技术从发展到现在已经到3.0了,区块链3.0可以用的实体行业很多地方,本文介绍一下开发区块链数字货币交易系统需要什么方法,包括一些源码分享和一些开发方式等等,大家有不懂的可以及时问我,数字货币,现指代英文Cryptocurrency,区块链技术最主要几大特性是去中心化、加密解密技术、 匿名性 可追溯 不可复制 不可篡改 区块链技术、共识机制,这些技术相互支撑,通过共识机制成为一个整体,实现了加密货币特有的安全、公开、可追溯的支付和交易。

  写一个自己的区块链,不是让程序员凭空想象,而是使用已经的开源平台,通过学习理念、工具、通过编写简答的函数即可以实现自己的区块链,下面我给大家详细说一下 开始制作我们自己第一个的数字货币了,首先准备好对应的编译环境(C++的建议在Linux)和安装好对应开发环境和工具(每个体系网上都有详细的安装教程文档)。不过系统和开发环境的搭建、程序编译等过程都比较繁琐和有比较多坑(很多跟环境、依赖库和版本有关,请留意),不建议普通用户自己制作,就开发数字货币交易系统来说有主链和侧链,主链和侧链是什么我就不用细说了,我想大家都明白,开发主链和侧链需要的技术是不一样的,目前国内而言能够开发主链的公司很少。

  交易所开发的技术原理 除了充币、提币的功能需要和区块链打交道之外,交易所的绝大多数功能,都是运行在自己服务器上的,交易所产品的主要功能如下:1.用户系统:注册 登录 KYC认证2.安全系统:密码修改 短信绑定 Google二次认证 邮箱认证3.资金系统:充币 提币 余额查询4.交易系统:买入 卖出 撮合功能。等等还有很多我后面的文章再说,这里最复杂的是交易系统,需要考虑多人在线的实时性能,以及撮合的正确性。最繁琐的是充币、提币,如果一个交易所支持多个币种,则需要部署每个币种的节点,并能为每一个注册用户自动创建钱包地址,用以区分不同用户的充值,并通过消息队列实时检查用户充值的节点确认状态。

  如何添加数据呢我们添加的每一份数据都需要按照同样的方式添加到每个人保存的副本中。我们能否具有计算能力呢?为什么需要计算能力?我们从此可以得到一个通用的计算机,也把数据的修改模型更加地简化和通用化。我们如何定义计算能力呢?要回答这个问题,我们首先要想的是这个分布式的计算机的各个部分是如何构成的。谁来构成整个存储空间?每一个具体的地址。每一个地址保存了什么?数据。如何才能对地址计算呢?我们可以把对数据的处理逻辑也放入这个地址。那么一个地址到底需要什么呢?地址信息、财富信息、数据信息、代码。于是,所谓的状态就是指系统中每一个地址和地址对应的状态的集合。我们通过一个一个的交易来进入新的状态。接着, 我们可以把状态转移的过程也记录下来,这个就是记录transaction的block。这些block连接在一起,形成blockchain。

  如何应对同时写入的混乱如何防止很多人一起写造成的混乱呢?大家同时解决一个难题,谁先解出来,谁就能够写入。如何防止有人同时解出来?这个有可能,但是连续多次都是同时有人解出来的概率较低,于是选择链最长的那一个。具备以上基本概念,让我们在这里通过实际的代码进一步实战,实现一个支持Token的BlockChain。参考:Naivecoin: a tutorial for building a cryptocurrency 一般所说的“挖掘一个新区块”其实包括两部分,第一阶段组装出新区块的所有数据成员,包括交易列表txs、叔区块uncles等,并且所有交易都已经执行完毕,各帐号状态更新完毕;第二阶段对该区块进行授勋/封印(Seal),没有成功Seal的区块不能被广播给其他节点。第二阶段所消耗的运算资源,远超第一阶段。

  Seal过程由共识算法(consensus algorithm)族完成,包括Ethash算法和Clique算法两种实现。前者是产品环境下真实采用的,后者是针对测试网络(testnet)使用的。Seal()函数并不会增加或修改区块中任何跟有效数据有关的部分,它的目的是通过一系列复杂的步骤,或计算或公认,选拔出能够出产新区块的个体。

  Ethash算法(PoW)基于运算能力来筛选出挖掘区块的获胜者,运算过程中使用了大量、多次、多种的哈希函数,通过极高的计算资源消耗,来限制某些节点通过超常规的计算能力轻易形成“中心化”倾向。

  Clique算法(PoA)利用数字签名算法完成Seal操作,不过签名所用公钥,同时也是common.Address类型的地址必须是已认证的。所有认证地址基于特殊的投票地址进行动态管理,记名投票由不记名投票和投票方地址随机组合而成,杜绝重复的不记名投票,严格限制外部代码恶意操纵投票数据

  在实践“去中心化”方面,以太坊还在区块结构中增加了叔区块(uncles)成员以加大计算资源的消耗,并通过在交易执行环节对叔区块作者(挖掘者)的奖励,以收益机制来调动网络中各节点运算资源分布更加均匀。

  如何保存数据 区块链的基本概念是:保存持续增长的有序数据的分布式数据库。要实现自己的区块链,需要满足以下功能:

  定义数据块 定义数据块之间的关系 添加数据块的功能 节点之间的通讯 节点之间同步数据 对节点的控制能力

  区块的结构 因为区块链中的数据是相互连接的数据块,因此我们需要创建LinkedList来实现这样的场景。

  如上图所示,我们可以看到以下核心元素:index:区块的递增编号 data:该区块所保存的数据 timestamp:时间戳 hash:通过SHA256算法对该区块进行的签名previousHash:前一个数据块的hash值,从而将区块串联了起来

  在计算机的世界中,一切都是用数学来解释,用数学来证明。对于一个数据块,我们计算出它的摘要。只要保证数据有变化,必然会引发摘要变化即可。在这里我们使用的是SHA256的Hash算法。从这个角度来说,Hash也可以被看成这块数据的DNA。

  具体的Hash的过程如下,const calculateHash = (index: number, previousHash: string, timestamp: number, data: string): string = CryptoJS.SHA256(index + previousHash + timestamp + data).toString();聪明的读者可能会发现,这个简单的方法并不能防范更加复杂的黑客攻击。因此,我们会不断的改进我们的代码,以抵挡这个世界的某些恶意。 但是现在的我们至少能够通过Hash来唯一的验证一个区块链的结构了。为什么?因为我们在做Hash的时候,也把这个区块对应的上一个区块的Hash放了进来,因此如果有人想要篡改整个区块链上的任何一个区块,都会产生蝴蝶效应,后续的区块都会为止失效。如上图所示,如果我们把区块44的数据从TREE改为STREET,那么它自身的Hash结果会改变,接着区块45中的previousHash也会发生改变,于是区块45的Hash也会改变,以此类推。因此,越早的区块发生异常,那么带来的影响就会越大。如何创建第一个区块第一个数据块的难点在哪里?它没有previousHash!因此,我们直接硬编码即可。const genesisBlock: Block = new Block(

  如何创建新的区块 创建区块如同炒菜,需要备好所有的原料。如同以下的代码所示,我们需要找到最后一个有效的区块,推理出下一个区块的index,得到当前的时间戳,再结合上一个区块的hash和当前的数据,也就能知道当前区块的hash,从而创建出新的区块。const generateNextBlock = (blockData: string) = {

  如何验证数据的有效性 在任何一个时刻,如果其他人给了我们一个新的区块,我们如何验证这个区块是正确的呢?这需要符合以下的基本要求:区块之间的索引是+1递增的. 当前区块的previousHash需要和之前区块的Hash相同 .区块自身的Hash需要正确于是,我们实现的代码如下:const isValidNewBlock = (newBlock: Block, previousBlock: Block) = {

  区块链分叉了怎么办在一个分布式的环境中,有可能不同的人在同一个区块后添加了新的不同的区块,那我们要听谁的呢?听大多数人的话(尽管现实中大多数人的话也许……)!那谁才能代表大多数的人民呢?实力更强大,更长的那一条链。因此在遇到多条链的时候,我们可以直接选择更长的一条。具体代码如下,const replaceChain = (newBlocks: Block[]) = {

  节点之间要如何通讯因为在整个网络中有很多节点,大家都有可能去创建区块,这就需要大家通过协商通讯的方式达成共识,这需要以下三个基本能力:当个节点创建了一个区块,需要通知整个网络,当一个节点连接上了一个新的节点,需要主动询问对方最新的区块,当一个节点遇到一个新的区块,它会根据判断的结果向网络请求更多的区块。上图给出了节点通讯的具体流程。需要注意的是,在我们的代码中,所有的连接都被爆存在了 WebSocket[]。我们并没有实现节点发现的功能,因此节点的位置需要手动的添加。如何控制节点们需要一个对外的接口来控制一个节点,从而能够查看节点的区块、添加区块、查看连通的节点、添加节点。于是我们通过以下代码实现了HTTP对外的服务接口。const initHttpServer = ( myHttpPort: number ) = {

  如上图所示,我们每个节点都会向外提供两个服务:让外部用户能够控制这个节点的HTTP server服务,支持节点之间通讯的Websocket HTTP server服务

  小结:综上所述,我们已经构建了能够保存区块的区块链的服务结构,实现了创建区块和控制节点的基本能力。让我们继续添加更多的功能吧。

  如何应对攻击在我们已经实现的版本中,每个人都能在其中添加区块,这样不仅可能造成混乱,而且如果有人拼命的添加区块也会阻塞整个网络。

  如何应对呢?那我们就限制每个人添加区块的能力吧。如何限制呢?记得你在网站每次注册新账号的时候都会出现的验证码吗?我们只要让大家在每次添加区块的时候都要做一道“难题”即可。这就是Proof-of-Work的基本原理,而这个解题过程就被称之为挖矿。

  因此,这个难题的设置会影响到节点添加区块的难度。越难的题会让我们越难添加区块,相对来说安全性会上升,但是延迟很可能增加。

  我们题目的难度的调整需要用到区块中保存的时间戳,但是这个时间戳可以由一个节点写入任何值,我们如何应对这样的攻击呢?这里的难点还在于不同节点上的时间本来就会有一定的差异。但是我们知道如果区块的时间戳和我们自己的时间相差越远则越可能有问题,因此我们把这个差异限制上一个区块的创建时间到当前时间范围的1分钟以内。

  我们在上一节讨论过当遇到分叉的时候,选择更长的一个。但是一个恶意节点可以产生一个很长的但是每个区块的难度都是最简单的分叉。这样怎么办?那就把选择标准从最长调整为最难的。也就是说,我们会选择累计解题难度最大的分叉,因为这背后所代表的人民的力量更加强大。如何计算累计的难度呢?因为每加一个0,我们的计算难度的期望会乘以2,所以我们计算每个区块的2^difficulty来求得累计的难度,以此做为选择标准。

  如上图所示,再A和B两个链条中,虽然B更短,但是因为B的难度更大,所以我们会选择B。

  有一个需要注意的是,这里的关键是难度,而并非Hash的前置的0,因为我们有可能碰巧得到一个更多的0的情况。这个思路被称之为“中本聪共识”,是中本聪发明Bitcoin时的一个重要贡献。因为每个节点只有相对较小的Hash计算能力,因此他们会倾向于选择累计难度更长的链条来贡献自己的力量,从而让自己的贡献得到认可。

  我们在前两节实现的区块链只是对数据的基本保存,如何能够在这个基础上构建金融体系?但是一个金融体系的基本需求是什么呢?所有权:一个人能够安全的拥有token,交易权:一个人能够把自己的token和他人交易,但是我们的区块链是一个没有“信任”的分布式的网络,如何才能构建出“确定性”呢?这需要我们找到一个不可抵赖的证明体系。

  其实证明自己往往是最难的,这需要我们落地到一个我们可以相信的事情。想一想古代碎玉为半,之后团圆相认的场景。在计算机的世界也是一样,我们把一块美玉的一半告诉全世界,然后把另一半藏在自己身上,这样之后你自己能够拼接处这块美玉。

  但这背后的难点在于,别人有了你公布出来的一半的玉,是可以伪造另一半的。但是在计算机的世界里,公钥加密体系却没有这个缺陷。你有两个钥匙:公钥和私钥。公钥是由私钥推演出来的,并且会公布给所有人。对于你自己发出去的信息,你都可以用你的私钥签名。其他人会收到你的信息和你的签名,然后他会用你的公钥来验证这个信息是否是通过你的私钥进行的签名。如下图所示

  具体来说,我们会选择椭圆曲线加密算法(ECDSA)。到目前为止,我们引入了密码学中的两个核心工具:SHA256来支撑区块数据一致性验证ECDSA来支撑用户账号的验证

  公钥是由私钥演绎得到的,我们可以直接把它做为区块链中一个用户的账号地址。

  我们已经能够让用户证明自己是谁了,现在就要记录他们之间的交易了。我们需要三个信息从哪里来:发送者地址. 到哪里去:接收者地址.交易多少:数量. 即便如此,我们依然有个疑问?发送者如何证明自己有这个token呢?那么他就需要提供之前他获得这个token的证据。于是我们还需要第四个信息:指向自己的证据的指针。一个例子如下图所示。

  设计去实现一款区块链产品。当然,具体到产品,架构设计有很多种,不同的人、不同的产品,架构设计也不尽相同,我们这里仅仅提供一种参考,让读者能够直观的感受区块链的技术实现,并顺便梳理与之相关的知识体系,我先说一下结构分为三个层次,协议层、扩展层和应用层。其中,协议层又可以分为存储层和网络层,它们相互独立但又不可分割。区块链技术的鼻祖,(协议层)就是用C++语言开发的,客户端钱包用的Qt,第三方钱包有Python语言开发的,所以首先需要这些语言,如果是Python语言爱好者建议研究研究(Ethereum)的Python实现,Ethereum给出了Go、 是纯Java实现,它作为可以嵌入任何Java/Scala项目的库提供。客户端方面,还有Rust、Ruby、Java等语言的实现,其他编程语言这里就不再一一列举,但是协议层所使用的技术并没有太大的变化。其中,网络编程是重点和难点,多数没有现成的框架可用,都是使用编程语言自身提供的库来设计开发,所以比较底层,非常考验开发者的编码功底。

  知识图谱:循着上面的分析,我们已经可以了解区块链是什么,并知道怎么实现了,顺便梳理一下其中的编程技术知识,自然也就清晰多了。

  下面再讲一下如何实现钱包,接着上文讲大家自行查看以前的文章:我们已经有了token,如何让用户更容易的管理自己的token并进行交易呢?我们需要支持什么样的核心功能?创建一个新钱包. 查看钱包的余额 .在钱包之间进行交易. 在Bitcoin中你可以通过钱包管理自己的coin,在Ethereum中你也可以用钱包管理自己的各类token。

  如何创建钱包钱包的基础是什么?公钥和私钥。因此我们需要首先创建用户的这两把钥匙。首先是私钥,并且要保存在本地:node/wallet/private_key。

  需要注意的是把私钥保存在本地是一件很不安全的事情。虽然我们这里只是一个简化的版本,但是也有很多更保险的方法。因此,请善待你的私钥吧。

  所谓的余额,不过是一些未花费的交易的接收者的记录。那么要如何定位这些记录呢?用户的公钥。因此当你定位到之后只需要对记录求和即可。

  如何能够屏蔽底层的发起者和接收者等复杂概念来简单的使用呢?而且我们的底层支持的是把发起者包括的所有token都给予接收者。如果发起者有50个token,但是指向转移10个呢?这时候需要我们把剩余的40个token还给发起者。具体场景如下图所示:

  这个过程甚至能够更加负责,例如:用户C开始只有0个token之后的三个交易让C分别获得了10、20、30个tokenC想要给D转发55个token

  这个场景如上图所示,我们要如何做呢?具体来说我们需要把这三次交易的总token拆成两份,其中的55个给D,另外的5个还给C。

  如何实现这个代码呢?我们首先在C所有未花费的交易中不断的累积token,直到总和达到或者超过目标值。

  然后我们可以把对应的token分别给予D和C,也就是一个是我们的接受者,一个是还给发起者。当然,如果token恰好不多不少,我们就不需要归还了。

  我们实现了支持交易的钱包。虽然在使用中最多包括两个接收者,但实际上我们底层的接口支持更多复杂的场景。例如,把50个token分给三个不同的人。

  但是现在你只能通过自己挖矿来添加新的区块,我们要如何才能更方便的使用呢?这是下一节的内容。

  如果每次添加交易都需要用户自己挖矿,那么效率会极为低下。我们如何才能利用他人来帮忙呢?这需要我们把未确认的交易提交到这个网络中,并且期待有人能够帮助我们把这次交易写入区块链中。

  我们需要构建一个新的结构“交易池”来保存未确认的交易(Bitcoin中称之为mempool)。 我们可以通过数据来实现:

  如何使用这个新的提交交易的功能呢?我们可以在创建一个对外的接口POST /sendTransaction。这个方法会在我们本地的节点的交易池中添加我们的新的交易,这也会成为我们默认的提交交易的方法。

  当我们添加一个未确认的交易后,我们需要把这个交易告诉整个网络,并且期待有人会把这个交易放入区块链中。我们要如何广播呢?

  当一个节点接收到一个新的未确认的交易时,他会广播自己的交易池给所有的节点

  为了实现整个广播的逻辑,我们需要添加处理MessageType.RESPONSE_TRANSACTION_POOL消息的业务逻辑。每当我们收到了未确认的交易,我们首先把它加入到自己的消息池中。然后我们会把我们的整个交易池广播给所有我身边的节点。

  我们把先区块链技术基础架构和如何创建钱包描述了一下,需要再次强调的是这仅仅是一种实现方式,绝非所有的区块链产品都是如此,我们也期待更多创新出现,也相信一定会出现。文章编程实现部分罗列了几种编程语言与其实现的典型产品,因为协议层技术较为底层,并没有太多现成的框架需要介绍或讨论,同时,具体的技术细节,也绝非几行字能够罗列清楚。

  开发区块链数字货币交易所的加密和验证,PoW(Proof of Work):工作量证明机制基本原理,还有接着前文中的章节如何防止重放攻击如何把未确认交易放入区块如何更新交易池如何实现用户界面如何实现查询接口我们如何实现前端界面如何查看区块链的信息如何查看钱包的信息

  那么我接着说去中心化的基础就是节点众多大家都是平等的,那么如何吸引用户加入网络成为节点,有那些激励机制?同时,开发的重点是让多个节点维护一个数据库,那么如何决定哪个节点写入?何时写入?一旦写入,又怎么保证不被其他的节点更改(不可逆)?回答这些问题的答案,就是共识机制。

  共识机制,可编程的利益转移规则。这个题目写出来,就有点激动,编程开发这么多年,我们尝试过很多方法,试图通过某种激励手段提高用户粘性,把用户留住。比如常见的积分机制、用户等级等,但是,没有任何一种方式,能与加密货币的共识机制相提并论。每一个区块链产品,本身就是一个小小的社会,一个由网络节点组成的自适应组织,这个组织的运行,要由共识机制来规范。

  对于PoS机制的加密货币,每个节点都可以创建区块,并按照个人的持股比例获得“利息”。DPoS是由被社区选举的可信帐户(受托人,得票数排行前101位)来创建区块。为了成为正式受托人,用户要去社区拉票,获得足够多用户的信任。用户是可以用自己持有的加密货币数量占总量的百分比来投票。DPoS机制类似于股份制公司,普通股民进不了董事会,要投票选举代表(受托人)代他们做决策。

  这101个受托人可以理解为101个矿池,而这101个矿池彼此的权利是完全相等的。那些手上有加密货币就有投票权随时通过投票更换这些代表(矿池),只要他们提供的算力不稳定,计算机宕机、或者试图利用手中的权力作恶,他们将会立刻被愤怒的选民门踢出整个系统,而后备代表可以随时顶上去。

  一是,能耗更低。DPoS机制将节点数量进一步减少到101个,在保证网络安全的前提下,整个网络的能耗进一步降低,网络运行成本最低。

  二是,更加去中心化。目前,对于比特币而言,个人挖矿已经不现实了,比特币的算力都集中在几个大的矿池手里,每个矿池都是中心化的,就像DPoS的一个受托人,所以DPoS机制的货币更加的去中心化。

  三是,更快的确认速度。比如,亿书使用DPoS机制,每个块的时间为10秒,一笔交易(在得到6-10个确认后)大概1分钟,一个完整的101个块的周期大概仅仅需要16分钟。而比特币(PoW机制)产生一个区块需要10分钟,一笔交易完成(6个区块确认后)需要1个小时。点点币(PoS机制)确认一笔交易大概也需要1小时。

  增加反对投票功能,对于破坏节点的反对投票率达到一定数量,就会促发“熔断机制”,强制个别受托人节点降级,减少对网络的破坏可能性。

  亿书,鼓励知识分享,节点和用户之间会有频繁交互,用户对节点用户的反馈与好评,将是该节点信用积累的一部分。亿书将充分利用这些信用信息,帮助社区用户遴选优良节点。

  101个受托人,仅仅是相对合理的经验数字。亿书,会进一步优化算法,提高网络遴选的性能,采取租赁、出售等方式,鼓励去中心化应用的开发者、出版商等第三方用户自建节点,从而更好的服务用户。

  匿名与安全是相对平衡的过程。亿书倡导提供公开、透明的服务,鼓励节点受托人实名认证,公开有关信息,接受大家监督,从而获得社区的广泛认可。对于长期表现良好的节点,亿书将给出名单列表,显示在用户帐号里。

  下面我再讲一下加密和认证:加密解密技术的作用不言而喻。但技术本身并不是什么新鲜事,提到加解密技术,业界的通则是,使用现成的组件,严格按照文档去做,别自作聪明,这也是使用加密解密技术的最安全方式。请看下面的图

  下面我讲一下加密和验证解密技术,涉及面很广,这里通过图表的形式来帮助记忆和筛选,方便日后使用。内容主要包括两个方面,一个是场景与算法,一个是Node.js的相关模块或组件。共三张脑图,具体请看:

  这张图,可以说在上一张图的基础上,更加具体,特别是对于场景的描述,让码农可以更加方便的作出正确的选择,值得拥有。其中,标注序号的,是有优先级的。

  加密技术涉及的概念晦涩,讲个小故事,就一下清楚了。大学一哥们追女朋友有贼心没贼胆,一直不敢当面说“I love you”,就想了一招,顺手写下J mpwf zpv交给了另一位女生,让她帮忙传信。然后,等女朋友好奇打来电话时,他就告诉她依次向前顺延1个字母,组合起来就是他想说的话。

  暂且不论成功与否,先看概念:这里的“I love you”就是明文,J mpwf zpv就是密文,向后顺延1个字母是加密过程,向前是解密过程,而这个规则就是算法。这种简单的加解密过程,就叫“对称加密”。缺点很显然,必须得打电话告诉女朋友怎么解密,岂不知隔墙有耳。

  当然,更安全的方式是不要打电话也能处理。自然就是这里的私钥和公钥,它们都是长长的字符串值,私钥好比银行卡密码,公钥好比银行卡账户,账户谁都可以知道,但只有掌握私钥密码的人才能操作。不过,私钥和公钥更为贴心与先进,用私钥签名的信息,公钥可以认证确认,相反也可以。这就为网络传输和加密提供了便利。这就是“非对称加密”。

  拿加密货币的鼻祖,比特币而言,一个比特币地址就是一个公钥,在交易中,比特币地址通常以收款人出现。如果把比特币交易必作一张支票,比特币地址就是收款人,也就是我们要写上收款人一栏的内容。

  而私钥就是一个随机选出的数字而已,在比特币交易中,私钥用于生成支付比特币所必需的签名以证明资金的所有权,即地址中的所有资金的控制取决于相应私钥的所有权和控制权。

  私钥必须始终保持机密,因为一旦被泄露给第三方,相当于该私钥保护之下的比特币也拱手相让了。私钥还必须进行备份,以防意外丢失,因为私钥一旦丢失就难以复原,其所保护的比特币也将永远丢失。

  Ebookcoin也是如此,只不过更加直接的把生成的公钥地址作为用户的ID,用作网络中的身份证明。更加强调用户应该仔细保存最初设定的长长的密码串,代替单纯的私钥保存,更加灵活。

  Node.js的Crypto模块,提供了一种封装安全凭证的方式,用于HTTPS网络或HTTP连接,也对OpenSSL的Hash,HMAC,加密,解密、签名和验证方法进行了封装。

  在币圈里,谈到加密技术时,经常听到Hash算法。很多小盆友时常与数组(array)和散列(hash)等数据格式混淆,以为Hash算法获得的结果都像json格式的键值对似的。

  其实,这是语言上的差异,Hash还有n. 混杂,拼凑; vt. 搞糟,把…弄乱的意思。所以,所谓的hash算法,解释为混杂算法或弄乱算法,更加直观些。

  Ebookcoin使用的是sha256Hash算法(除此之外,还有MD5,sha1,sha512等),这是经过很多人验证的有效安全的算法之一(请看参考)。通过Crypto模块,简单加密生成一个哈希值:

  加密技术的作用,重在传输和验证。Ebookcoin使用了Ed25519第三方组件。

  该组件是一个数字签名算法。签名过程不依赖随机数生成器,没有时间通道攻击的问题,签名和公钥都很小。签名和验证的性能都极高,一个4核2.4GHz 的 Westmere cpu,每秒可以验证 71000 个签名,安全性极高,等价于RSA约3000bit。一行代码足矣:

  在Ebookcoin世界里,Ebookcoin把用户设定的密码生成私钥和公钥,再将公钥经过16进制字符串转换产生帐号ID(类似于比特币地址)。付款的时候,只要输入这个帐号ID(或用户别名)就是了。该ID,长度通常是160特(20字节),加上末尾的L后缀,也就是21字节长度。

  因此,在使用的过程中会发现,软件(钱包程序)仅仅要求输入密码(通常很长),而不像传统的网站,还要用户名之类的信息。这通常就是加密货币的好处,即保证了安全,也实现了匿名。

  Ebookcoin要求用户保存好最初设定的长长的明文密码串,它是找回帐号(保存个人账户的加密货币财富)的真正钥匙。这比直接保管私钥方便得多,当然,风险也会存在,特别是那些喜欢用短密码的人。为此,Ebookcoin提供了二次签名(类似于支付密码)、多重签名等措施,弥补这些问题。

  说明:上面628行,是产生公钥的方法,通常需要用户提供一个密码secret。447行,可以看到,将用户账号信息进行加密处理,然后直接生成了密钥对,接着将公钥继续处理。486行调用了方法generateAddressByPublicKey,455行,该方法对公钥再一次加密,然后做16进制处理,得到所要地址。

  过程中,对于私钥没有任何处理,直接无视了。这是因为,这里的使用方法ed25519,基于某个明文密码的处理结果不是随机的,用户只要保护好自己的明文密码字符串,就可以再次生成对应私钥和公钥。

地址:广东省广州市天河区88号 客服热线:400-123-4567 传真:+86-123-4567 QQ:1234567890

Copyright © 2012-2025 交易量排名的加密货币交易所- 加密货币交易所 版权所有 非商用版本