Asch这个名字是 App Side Chain 的缩写。 是一种基于区块链跨链技术的应用开发平台,目前全部核心代码已经在GitHub上开源。

区块链是比特币的底层技术,但是名气低于比特币,但是个人认为潜力远远大于比特币。是最值得技术人员关注的技术之一。

我一般研究一门新技术,倾向于研究更新更早期的代码。 因为非常成熟有名的代码往往已经过度设计,对于阅读代码入门不一定是好的选择。 而一些出于项目早期的代码,而且更容易阅读理解其核心原理。Asch目前来说是一个非常好的区块链学习入门的开源项目。

『整体架构』

目前整个阿希链主要由以下源码库组成

  • asch阿希链的核心服务端源码,主要由 Node.js 开发。
  • asch-frontend阿希链的网页钱包源码。
  • asch-js&asch-cli阿希链的客户端实现。

目前源码阅读主要基于asch@1.3.0 version

『目录结构』

  • proto/index.proto
  • genesisBlock-mainnet.json
  • config-mainnet.json
  • public/
  • src/core
  • src/base

『proto/index.proto』

Asch 的区块核心数据结构通过protobuf和进行序列化和反序列化。 所以proto/index.proto这个数据结构就是核心区块的数据结构。 依我的理解,index.proto 这个名字应该叫 block.proto 更合适。

『目录 public/』

网页钱包的代码根目录,由asch-frontend打包生成的网页钱包代码。

『源码目录结构 src/』

src/init.js 负责初始化,用 async 来处理各种先后顺利,避免回调地狱,刚开始看的时候会比较绕, 但是看懂了就很清晰了。 
在代码中很多模块都有共同的模块变量,最典型的是var moduels, library,

  • modules 对应的是 src/core/ 下面的模块。
  • library.base 对应的是 src/base/ 下面的模块。

『受托人的轮流锻造(Forging)机制』

Asch 不像比特币那种挖矿机制,而是受托人的轮流锻造机制,主要有以下流程。

  1. onBlockchainReady(core/delegates.js) 当区块链数据库载入完成,开始锻造初始化。
  2. loadMyDelegates: 从配置文件中获取secret(依次读取若干个),用 secret 生成密钥对(公钥和私钥)。
  3. accounts.getAccount: 用公钥从区块链数据库中获取账号,并检查该账号是否是受托人,是受托人才继续进行。
  4. loop: 开始进入轮询,每次轮询间隔100ms 。
  5. slots.getSlotNumber (utils/slots.js) 先获取 epochTime ,epochTime 记录从 2016-5-27T20:00:00 后到某一个特定时间经过了多少秒。然后 getSlotNumber = epochTime / interval, interval = 10 。也就是每过10s出现一个新的slot 。
  6. blocks.getLastBlock: 顾名思义,获取当前最新的区块
  7. getBlockSlotData->generateDelegateList (core/delegates.js) 先获取当前受托人列表,按票数排序,获取票数最高的 101 个受托人的公钥。并且对这些受托人列表进行『随机』排序。这里的随机应该是每个节点一样的随机,不是完全随机。
  8. getBlockSlotData: 获取当前slot的检查受托人列表,如果在配置中该受托人的密钥对的,则进入到『区块的产生流程』。

『区块的产生流程』

  1. loop(core/delegates.js): 对于注册了受托人的节点,会有一个定时触发器,调用 blocks.js 里面的 generateBlock 。
  2. generateBlock(core/blocks.js): 首先从 transactions 里面获取未确认的交易列表。
  3. generateBlock: 从未确认的交易列表中过滤出验证通过的交易列表。
  4. base.block.create: 创建包含这些交易列表的新区块,验证区块是否合法。
  5. hasEnoughVotes: 检查该受托人是否有足够的票数,如果票数不够,则不可生成区块。(这个步骤应该提前吧?)
  6. processBlock: 通过 block.id 查询本地数据库,如果已经还未存在,则继续进行下面行为。
  7. applyBlock: 生效刚才验证通过的交易列表,就是对交易涉及的账号进行一些转账等操作,这部分逻辑在 src/base/transaction.js apply 函数中实现。交易有多种类型,后面再详述。
  8. base.block.dbSave: 存储 block
  9. base.transaction.dbSave: 存储交易列表
  10. accounts.mergeAccountAndGet: 对新区块的创建者进行数据更新,创建者其实就是这个注册了受托人的节点。
  11. setLastBlock: 将这个新的区块设置成当前最新的区块。
  12. bus.message(‘newBlock’) 广播这个新的区块。

『ToDo』

  • Asch链的交易流程
  • Asch链的HTTP接口实现原理
  • DApp原理和开发流程

原文链接: http://yanyiwu.com/work/2017/07/29/read-asch-source-code.html

区块链开源项目Asch源码初探相关推荐

  1. 今年我读了四个开源项目的源码,来分享下心得

    今年来看了 RocketMQ.Kafka.Dubbo .Tomcat 的源码,之前也有读者询问过如何读源码,索性就来分享一下. 其实还看了一点点 Linux.Redis.jdk8,这几个阅读的目的和上 ...

  2. 开源项目实例源码_今年我读了四个开源项目的源码,来分享下心得

    今年来看了 RocketMQ.Kafka.Dubbo .Tomcat 的源码,之前也有读者询问过如何读源码,索性就来分享一下. 其实还看了一点点 Linux.Redis.jdk8,这几个阅读的目的和上 ...

  3. 鸿蒙开源源码,基于鸿蒙系统开源项目OpenHarmony源码静态分析

    #ifndef __scc #define __scc(X) ((long) (X)) // 转为long类型 typedef long syscall_arg_t; #endif #define _ ...

  4. Go实现的5G核心网开源项目free5gc源码分析系列 | Gopher Daily (2021.01.08) ʕ◔ϖ◔ʔ

    每日一谚:"Abstractions should be discovered, not created." Go技术新闻 Go实现的5G核心网开源项目free5gc源码分析系列 ...

  5. 【机器人学】机器人开源项目KDL源码学习:(5)KDL如何求解几何雅克比矩阵

    这篇文章试图说清楚两件事:1. 几何雅克比矩阵的本质:2. KDL如何求解机械臂的几何雅克比矩阵. 一.几何雅克比矩阵的本质 机械臂的关节空间的速度可以映射到执行器末端在操作空间的速度,这种映射可以通 ...

  6. BT开源项目Snark源码分析

    BT开源项目Snark源码分析 Snark是国外一个开源Java的项目,实现了BitTorrent协议,通过分析此项目的源程序,可以更利于我们更加深入的了解当前流行的BT软件的原理,进而可以指导我们的 ...

  7. php区块链以太坊,兄弟连区块链教程以太坊源码分析CMD深入分析(一)

    兄弟连区块链教程以太坊源码分析CMD深入分析. cmd包分析 cmd下面总共有13个子包,除了util包之外,每个子包都有一个主函数,每个主函数的init方法中都定义了该主函数支持的命令,如 geth ...

  8. 开源项目Telegram源码 Telegram for Android Source

    背景介绍 Telegram 是一款跨平台的即时通信软件,它的客户端是自由及开放源代码软件.用户可以相互交换加密与自毁消息,发送照片.影片等所有类型文件.官方提供手机版.桌面版和网页版等多种平台客户端. ...

  9. python和区块链哪个好_10个最流行的Python区块链开源项目

    Python不是主流的区块链底层平台开发语言,但是在DApp 开发.区块链仿真与数据分析.智能合约安全分析等领域,Python 依然是不错的选择.本文介绍了10个最流行的Python区块链项 并提供了 ...

最新文章

  1. oracle创建DBA角色命令,oracle常用DBA命令
  2. java 时间转换去杠
  3. Vivo FunTouch OS 手机系统内置铃声免费下载
  4. JVM - 深入剖析字符串常量池
  5. zcmu1734: 18岁
  6. A summary of the post “How I explained OOD to my wife
  7. 香辣弹簧:不同的自动接线方式
  8. 华为P50 Pro外形首曝:新造型,头次见!
  9. jQuery.ajax()异步方法的漏洞
  10. 打包外星人_《疯狂外星人》中外星人带上金箍就是大圣,放下金箍就是至尊宝!...
  11. nginx反代+varnish缓存+后端LAMP平台集群实现
  12. Python练习题总结摘要
  13. Vagrant安装CentOS7镜像
  14. 《基因大数据智能生产及分析》笔记
  15. 《阴阳师》手游分析报告
  16. java pgp 加密_java – 如何解密签名的pgp加密文件?
  17. Python系列(五):bytes和str的区别与联系
  18. 吴恩达机器学习作业1-线性回归讲解版奔雷手
  19. Docker学习总结(13)——从零开始搭建Jenkins+Docker自动化集成环境
  20. Python渗透测试之ARP毒化和协议应用

热门文章

  1. 利用第三方库实现sftp上传文件
  2. Building with Gulp
  3. 【愚公系列】2023年06月 网络安全(交通银行杯)-APFS
  4. Strom简介及处理过程
  5. 计算机基础题型综合应用题,2017年全国计算机等级考试试题操作题
  6. java mysql的一次报错,Public Key Retrieval is not allowed
  7. 读书笔记——《educated 》和《atomic habits》
  8. mac的快捷键(日常使用)
  9. 如何在 Excel 中复制单元格格式、添加水印?
  10. 老师使用计算机给小孩子上课,课堂上,“放电脑”给学生看,老师就彻底“下岗”了?...