找回密码
 立即注册
搜索

NULS社区空中课堂(第九期)—区块链中的账户系统

小印 2019-2-28 17:15:23 显示全部楼层 阅读模式
自我介绍
Hello,NULS社区的成员大家晚上好。很高兴,也很荣幸在这里与大家分享我对区块链账户系统的一点认识。
正式分享开始前,我先自我介绍一下。我是NULS CCC成员,中文名陈学,英文名叫Edward。现在在一家科技公司担任架构师,主要的工作是公司业务系统的微服务化架构设计、实施以及研发团队的管理。从2008年研究生时期开始到现在,我已经有11年的编程经历,尽管我现在主要从事的是架构设计与研发团队管理工作,但是编程这项工作从未停止,以后也不会停止。生命不息、编程不止,这句话很适合我。
我正式接触区块链的时间,大概是2017年5月,当时电脑勒索病毒横行无忌,但是它勒索的是比特币,而不是人民币,不管是有意还是无意,这给比特币提供了一个暴涨的契机。通过这件事,也结束了我多年来对比特币只是投机品的偏见,开始正式研究比特币的技术原理,场景实现,以及所带来的金融价值,也开始朝这个圈子发展。
我再介绍一下我与NULS的缘份,我所在的城市重庆互联网环境并不是很好,但是在区块链领域,重庆的NULS项目却算是一家龙头项目,我反而有点地域优越感,我于2018年11月19日加入NULS CCC,在加入之前大概有一两个月其实我已经承接了一些NULS2.0系统的开发任务。从加入到现在,我的主要工作是从事NULS2.0的账户系统功能开发、设计、联调等。这块功能目前处于联调中,从整个开发周期来看,已经处于开发联调的尾声,我最近在开始看NULS其它模块的代码,要达到的一个目标是对Nuls2.0整个系统架构、代码实现都有一个清晰的认识,如果对NULS没有达到这样认知,对我来讲是没有安全感的。^_^
我今天分享的主题是区块链中的账户系统,这个主题本身有些偏技术,为避免对于社区其他非技术成员不太友好,我将主要分享账户系统的业务边界,即账户系统是干什么的。如果有技术的爱好者,也欢迎来到NULS社区进行交流。
提到账户系统,大家应该都比较熟悉,因为账户我们都在接触,最直观的感觉是我的微信账户还有多少钱,我的支付宝账户还有银行卡还有多少钱。对于币圈投资者,也会讲到我的某账户还有多少Token,这些都没错,都是账户系统的实际体现。结合我的从业经历,我今天分享四个方面的账户系统。
第一是中心化的系统,例如微信、支付宝,它的账户系统大概是什么样子;
第二是比特币的账户系统;
第三是以太坊的账户系统;
第四个是NULS2.0的账户系统.
三方支付账户系统
我有八年时间,都在一家三方支付公司从事编码、项目管理、架构设计工作。当的账户系统设计主要借鉴支付宝在网上的一些开放资料而进行构建。
首先介绍账户系统是干什么的:
在我们的系统里面,它主要是管账的,即每个账户下有多少资产。它不管会员信息,也就是你是谁,你叫什么名字,你的身份证号是多少,但是它会与会员信息通过一个字符串或者ID关联起来,例如用身份证号关联。
既然是管理资产,又该怎么管理呢?
第一是对用户(可个人用户或者企业用户)建立一个或者多个账号,这个账号可以分类,例如现金账户,托管账户等,账户上有相应的余额;第二对商户建立一个或者多个账号,账号上也有余额;第三是给平台建立了很多账户,例如平台收益账户、平台保证金账户等。这三块一起形成了三方支付平台的账户体系,对外通过接口提供服务,例如充值、提现、司法冻结等。这些业务流程在使用中就会调用账户系统的接口完成相应的金额增加、减少、冻结。
值得注意的是,为了尽量保证账户系统的正确性以及账户出现问题时能及早发现,通常会采用会计上的复式借记法设计账户和记录交易明细,其核心思想是有借必有贷,借贷必相等。因为其中涉及到一些专业知识,在这里就不赘述该设计。
比特币“账户系统”
说到比特币的账户系统,可能比较熟悉比特币账户的人会质疑,比特币的代码里没有账户系统,我们如何完成转账、又如何定义比特币“账户系统”。
比特币系统中没有单独的账户系统,而是采用了“UTXO”(Unspent Transaction Output),即未花费的交易输出。当我们在比特币转账时,所使用的资金来源是以前该地址接收到的并且没有花费过的交易记录,而不是余额。一笔比特币交易信息包括了一条或者多条转出地址,一条或者多条转入地址、金额,同时还包括了以前转账给转入地址且没有被花费的一条或者多条交易记录的hash值,比特币系统在验证交易合法性时会验证这些Hash值对应的原始交易记录是否有被花费掉,如果未被花费掉则金额之和是否大于本次交易资金转出总额。
比特币系统有一个UTXO池,所有未被花费的交易记录都会记录到这池中,花费掉以后则会从这个池中移出,因此在验证记录是否被花费掉只需要通过hash值到池中查询即可,如果查询到则说明未被花费掉,如果查不到则说明已经花费掉了。
以太坊账户系统
与比特币一样,以太坊的区块上也不存储账户余额,存储的是一笔一笔的交易记录,当然区块上存储的数据可能还有其它数据,比如说编译以后的智能合约,在这里不做赘述。
比特币的资金来源是未花费的交易记录,以太坊与比特币不同,以太坊的节点在接收到网络中的区块时,会对区块进行验证和处理,这个时候以太坊节点中有一个基于LevelDB数据库的模块或者功能来保存某个账户下的的余额,这个余额是根据区块中的交易记录来累计计算的,举个例子:
节点接收到两条交易记录:
交易记录A的内容是:张某挖矿得到了10个以太坊,交易记录B的内容是:张某转给李某5个以太坊,然后排出其它的信息,单看这两条信息,在接收到第一条记录的时候,以太坊节点的账户系统或者保存账户余额的数据库会在张某的账户上加10个以太币,如果张某之前没有以太坊,那么此时张某以太坊账户余额为10,接收到第2条记录的时候会在张某的账户上减掉5个以太坊,再在李某的账户中加上5个以太坊。当然这其中有手续费,手续费处理的过程也是类似的,从转出方的账户上减掉,加到矿工的账户上。
因此以太坊相对于比特币,一个重要的变化点是:加入了账户和账户余额的概念,在验证交易的资金来源是否充足的时候,是直接取的账户余额,而不是交易记录。部分人或许会质疑,如果将本地节点上的账户余额修改为无穷大岂不是可以随意转账?
区块链的特性在于,修改本地验证通过是可以实现的,但是发到以太坊网络里面进行验证的时候就无法通过,因为其它节点验证的时候发现这个账户余额没有这么多,那么这笔交易自然不能通过。
NULS账户系统
NULS2.0是基于微服务架构的,实现上有多个独立的模块,模块与模块间可以相互交互通讯,他们组合在一起共同完成具体的业务流程。这和汽车差不多,引擎提供动力输出,变速箱可以将动力转换为力矩,轮胎将力矩转换为与地面的摩擦力实现了汽车的前进。在这些模块里有两个重要的模块:账户模块、账本模块,当然这并不是说其它模块不重要,而是我接触这两个模块多一点。
前文中提到在三方账户里面也有账户模块,这个模块是用来管账的。NULS中的账户模块与它有些不一致,它是用来管理当前节点上用户的账户信息的,比如:在当前这个节点上导入了该私钥,那么在当前节点的账户下就有该账户的信息了,包括该地址对应设置的密码等信息,这里面存的是用户信息,但是不存账户余额。除了账户模块外,刚才提到还有一个账本模块,当区块链中的交易被确认后,会调用账本模块提交交易接口,这时账本模块会根据交易逐笔累计计算账户余额,这个余额就是我们提到的账户余额,有了账户余额,在交易时就可以据此验证用户转账时余额是否充足等。
OK,到这里,我今天的分享就结束了,比特币和以太坊的源码我只看过一部份,所以这里的知识主要来自于网络学习,但是三方支付、NULS2.0的账户系统我都有过开发经历,如果大家有更多关于账户系统的想法,非常乐意与大家一起交流。
您需要登录后才可以回帖 登录 | 立即注册

  • 0 关注
  • 2 粉丝
  • 67 帖子