网赚论坛

标题: 《Nodejs开发加密货币》之十六:地址 [打印本页]

作者: tvh92403kmj    时间: 2017-11-28 16:35
标题: 《Nodejs开发加密货币》之十六:地址
前言

上篇我们介绍共识机制,是入门部分的补充,这篇开始介绍包括共识机制在内的加密货币的核心技术实现。另外,DPOS共识机制,首先需要通过用户注册为受托人,然后才会有一系列其他的操作,因此要从用户帐号开始。而对于亿书这款加密货币而言,用户帐号本质就是加密货币的地址。本篇,我们就来好好研究它。


源码

account.js https://github.com/Ebookcoin/ebo ... er/logic/account.js

accounts.js https://github.com/Ebookcoin/ebo ... modules/accounts.js

contacts.js https://github.com/Ebookcoin/ebo ... modules/contacts.js

类图

地址主要通过`modules/accounts.js`模块处理,类图如下:




流程图

这里的逻辑并不复杂,其本质就是一种`交易`,所以,我们将在《交易》那篇提供详细的流程图。

解读

计算机软件是人类活动的模拟和程序化,也就是大家所谓的“虚拟化”。在设计的时候,都会设想一个角色(Role)代替人类,负责完成要开发的各类操作。这个角色,通常在开发中被定义为用户(User),用户看到并可操作的就是用户帐号,在此基础上,才能进行权限认证,记录和管理与用户有关的各类操作。

比特币里的用户角色仅仅就是一个比特币地址,该地址是通过Hash算法进行加密处理的字符串,因此我们叫它`Hash地址`。同时,基于真实网络的复杂性,对于IP地址的追踪也不容易,所以比特币的匿名性很好(因为压根就没有给你暴露名字的机会)。

亿书作为一款加密货币产品,自然也提供了类似的`Hash地址`。并基于该地址,扩展提供了其他功能,比如“别名地址”。原因有三个:

1. 本质需要。版权保护应用,必然要明确版权所有人,实名信息是基本要求,如果再进行完全的匿名操作,显然有点不合适,属于跟自己过不去。当然,普通阅读用户不需要实名,亿书允许保持足够的匿名性。
2. 用户需要。复杂的字符串地址不适合人类脑记,很多人在最初接触比特币的时候,非常不习惯,经常弄混、忘记自己的比特币地址就是很好的证明。
3. 产品需要。说到交互功能,比特币除了交易之外,是没有什么交互的。而作为面向普通用户的亿书,要提供基本写作、团队协作、自出版等极具个性化的功能,交互功能被摆在突出位置,充满个性化的用户名是必须的。

具体操作时,可以实现下面的需求,详见 [亿书白皮书][] :

1. 用户可以注册一个用户名,它相当于是用户帐户的一个别名;
2. 用户名都是唯一的;
3. 注册后无法更改或删除;
4. 用户名可作为支付地址,所以称为`别名地址`,类似于人们常用的支付宝帐号,其它用户可以直接向该用户的用户名付款,用户不再需要记下一长串的加密货币地址;
5. 用户可以维护一个联系人列表。

这些操作和信息,都可以在客户端里完成。


1.公共Api

看 `modules/accounts.js` 368行的代码, 如下:
复制代码
前面,我们分析过,这里的router是`helpers/router.js`的一个实例。上述代码,最终会在439行的调用中,映射为公共Api,并分别对应`shared`中的方法,如:
复制代码
这里的`delegates`(受托人)api,以及后面的debug环境下的api,暂且不提。通盘浏览这些公开接口信息,我们知道,可以直接浏览的信息主要包括余额(balance)、公钥(publicKey)、用户名(username)及修改用户名需要花费的费用(fee),以及受托人及其费用等,可以产生公钥和添加用户名。但是,没有删除和修改用户名的功能,所以一旦注册了用户名,想要修改,只能重新注册一个。


2.Hash地址

比特币地址是使用前缀来区分的,比如:1开头的地址就是我们实际使用的地址,3开头的地址是测试地址。而亿书,使用后缀来区分,通常以L结尾。代码在modules/accounts.js文件里:
复制代码
另一个类似的地址,就是区块链的以c结尾的块地址,用来标注`generatorId`,代码与上面的基本一致:
复制代码
3.别名地址

用户名相当于地址别名,就像支付宝帐号,所以白皮书说“别名地址”。我们知道,只有在转移支付的时候,才会用到地址(接受地址和发送地址),所以体现把用户名当作地址的逻辑代码,自然要在处理“资金转移”的交易代码里,看看`modules/transactions.js`文件,具体如下:
复制代码
上述代码,实现的就是资金转账的功能(后台编码的交易类型`TransactionTypes.SEND`,见764行),毫无疑问,必须提供三个参数"secret", "amount", "recipientId"(见685行)。从702行可知,其中`recipientId` 可以是字符串地址,也可以是用户名。从764行以后的代码还可以了解到,交易时的`recipientId`和`recipientUsername`字段都保存在数据库里了。

4.注册用户名

亿书默认不提供别名地址,需要用户注册。从上面的Api,很容易找到“注册用户名”的源码方法`shared.addUsername`,如下:
复制代码
分析代码949行和984行,可以了解到,所谓的`注册用户名`,实质上就是提交了一个`TransactionTypes.USERNAME`类型的交易。890行代码,说明该Api必须两个参数,用户要提供明文密码(secret)和用户名(username)。


5.联系人列表

亿书具备社交功能,维护了一个联系人列表。与传统中心化软件不同的是,加密货币系统里,处处是交易,用户关注其他用户的行为,也是一项交易(内部的交易类型为`TransactionTypes.FOLLOW`)。

这项功能的源码在文件`modules/contacts.js`里,类图如下:




与其他模块文件一样,我们可以非常清晰的看到该文件提供的公共Api,如下:
复制代码
这些Api很简单,我们重点关注其中两个Api:
复制代码
对应方法的源码:
复制代码
431行,添加关注需要两个参数"secret"和"following",这里"following"其实就是用户的帐号地址或用户名(见448行)。然后,经过一系列验证之后,写入数据库的`contactAddress`字段(见511行),一个关注的操作过程就完成了。

然后,用户通过客户端浏览自己的联系人列表,需要用到另一个Api,对应的方法是`shared.getContacts`,如下:
复制代码
这段代码最重要的部分,就是362行`modules.accounts.getAccount`方法的调用,获得对应地址的用户帐号(`account`)实例,联系人都保存在该实例的`account.contacts`里。


总结

读完代码,可以发现,代码逻辑非常简单,仅仅相当于两个基本功能,一个是生成加密货币的Hash地址,另一个是通过`交易`模块扩展和关联其他功能。其中,Hash地址是基础,在整个亿书的开发设计中,无处不在,签名、验证和交易,以及区块链等需要它。接下来我们介绍签名和验证,请看下一篇:**签名和多重签名**。

链接


本系列文章即时更新,若要掌握最新内容,请关注下面的链接

本源文地址: https://github.com/imfly/bitcoin-on-nodejs

电子书阅读: [http://bitcoin-on-nodejs.ebookchain.org](http://bitcoin-on-nodejs.ebookchain.org/3-源码解读/5-地址.html)

参考

[亿书白皮书 http://ebookchain.org/ebookchain.pdf](http://ebookchain.org/ebookchain.pdf)

[亿书白皮书]: http://ebookchain.org/ebookchain.pdf





补充内容 (2016-6-26 12:54):
发完就编辑,也没来得及,如果感兴趣就从电子书地址阅读吧。

补充内容 (2016-6-26 12:56):
【nodejs开发加密货币】开栏的话
http://8btc.com/thread-27448-1-1.html




欢迎光临 网赚论坛 (http://www.caifuba.net/) Powered by Discuz! X3.1