Skip to content

Commit

Permalink
dev
Browse files Browse the repository at this point in the history
  • Loading branch information
xiejianhuai committed Jul 29, 2018
1 parent 6f7a7e2 commit 9e6dc66
Show file tree
Hide file tree
Showing 7 changed files with 1,113 additions and 0 deletions.
18 changes: 18 additions & 0 deletions content/wheels-11/DPoS快速理解和代码简单实现.md
Original file line number Diff line number Diff line change
Expand Up @@ -220,3 +220,21 @@ PoS,股权证明机制,每个节点都可以创建区块,并按照个人

总结:这里没有严格按照DPoS的方式来写代码。一方面是没有在一个周期后将委托人节点进行乱序,另外一方面是没有让所有委托人节点都有出块的权力,当然也没有按照委托人的排序来进行出块进行最长链的选择机制。

代码地址:[https://github.com/jianhuaixie/blockchain-buildwheels/tree/master/content/wheels-12](https://github.com/jianhuaixie/blockchain-buildwheels/tree/master/content/wheels-12)

这个项目运行很简单:

go build main.go
./main.exe 3000

//新开一个终端
cp blockchain_3000.db blockchain_3001.db
./main 3001

//新开一个终端
cp blockchain_3000.db blockchain_3002.db
./main 3002

//新开一个终端
cp blockchain_3000.db blockchain_3003.db
./main 3003
71 changes: 71 additions & 0 deletions content/wheels-11/blockOS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# blockOS

### 前台界面

基于minerOS进行定制,外包

### 数据存储

直接矿机节点向数据库上报数据

### 数据打通

矿机根据mac地址上报数据,在用户拿到矿机之后,注册用户名,自己绑定随矿机附送的随机码来绑定用户名,随机码和mac地址是绑定的。这样就将用户账号和矿机数据打通。

### 上报数据

- CPU数据
- Mem数据
- Disk数据
- GPU数据
- CPU温度
- 硬盘温度
- 算力

### 矿工设置

- 机房管理
- 添加,编辑修改,删除 **名称和描述**
- 分组管理
- 添加,编辑修改,删除 **机房,分组名称和分组描述**
- 主机列表管理
- 查找 根据机房分组查找,根据主机状态查找,根据ip地址查找,根据mac地址查找
- 主机管理
- 主机信息查找显示 **ID,GPU类型,主机状态,IP,MAC,系统版本,服务类型,模板名称,主机名称,机房/分组**
- 编辑修改 **主机名称,机房/分组,矿工ID**
- 主机操作管理
- 配置,选择挖矿模板
- 重启挖矿
- 暂停
- 下架
- 超频
- 重启矿机
- 挖矿模板列表管理
- 查找显示 **名称,类型,算法,超频,操作**
- 挖矿模板管理
- 添加 **模板名称,币种,服务程序,超频开关,矿工号,矿池,钱包地址,配置参数**
- 生效
- 删除
- 操作信息管理
- 增加 **类型,创建时间,结束时间,状态** 就是前面主机操作,比如配置,暂停,下架等,还有就是挖矿模板配置等操作
- 查找 **主机ID,矿主,标题,描述,告警码,告警级别,告警时间,恢复时间** 对告警信息进行查找,针对主机ID,告警码,告警级别进行查找
- 个人中心管理
- 账号绑定 **微信名字**
- 告警设置 **告警开关,邮箱,微信** 告警通知方式 邮件和微信
- 密码修改 **旧密码,新密码**
- 系统升级管理
- 自动升级开关 **开和关**
- 升级版本选择 **稳定版和开发版**


### 数据库表设计

- 机房表 名称,描述,用户名,创建时间,修改时间
- 分组表 机房,分组名称,分组描述,用户名,创建时间,修改时间
- 主机表 ID,GPU类型,主机状态,IP,MAC,系统版本,服务类型,模板名称,主机名称,机房/分组,用户名,创建时间,修改时间
- 挖矿模板表 名称,类型,算法,超频,操作,用户名,创建时间,修改时间
- 操作表 类型,创建时间,结束时间,状态,用户名
- 个人中心表 用户名,密码,绑定微信,邮箱,告警设置,告警方式,创建时间,修改时间
- 系统设置表 用户名,升级开关,版本升级选择,创建时间,修改时间
- 系统监控表 CPU数据,Mem数据,Disk数据,GPU数据,CPU温度,硬盘温度,算力,添加时间

84 changes: 84 additions & 0 deletions content/wheels-11/侧链.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# 侧链

侧链(Sidechain)协议允许资产在主链和其他区块链之间互转。

一开始,侧链诞生之前,众多“山寨币”的出现正在碎片化整个数字货币市场,再加上以太坊等项目的竞争,一些比特币开发者希望能借助侧链的形式扩展比特币的底层协议。

简单来讲,以比特币区块链作为主链(Parent chain),其他区块链作为侧链,二者通过双向挂钩(Two-way peg),可实现比特币从主链转移到侧链进行流通。

这里的关键技术点是如何进行特殊锁定主链上的币,然后是如何实现双向挂钩。

### 侧链出现的背景

侧链(sidechain)的正式定义是缠绕链,负责缠绕对接应用链和结算链。另外两个又是什么鬼,不要紧,先知道这样设计是实现功能分层,松耦合,各自为政,又各自透明,可以对接协同工作。

结算链是负责不可逆记账,去中心化安全共识。比如比特币就是典型的结算链。这种链要求节点多,充分离散化分布,协议可迭代而不会造成兼容问题,高安全壁垒。结算链作为区块链架构里面的底层基准代表,目前已经锁定了一系列的事实上的标准,我相信近期不会有变动的需要,长期也可以做到稳定不变,灵活性、扩展性、功能性将会由侧链(缠绕链)、应用链来实现。

在技术创新领域,分层次,松耦合的协议标准开发更能够激发生态活力,有利于技术分工和协作,这也是市场自然选择的结果,结算链的底层事实标准很快会被锁定,以不变应万变,留下的所有的缺陷也好不足也好,统统让位给侧链、应用链去处理。

侧链从技术上讲,就是缠绕结算链和应用链,使应用链数据和结算链数据无缝对接,承上启下。
侧链的主要功能有:

- 结算链离链交易
- 应用链的基础用户数据(用户账号,权限,代币账本)
- 应用链的运行承载(智能合约虚拟机,运行平台)

### 侧链是什么?

侧链可以是一个独立的区块链,有自己按需定制的账本,共识机制,交易类型,脚本和合约的支持等。侧链不能发行比特币,但可以通过支持与比特币区块链挂钩来引入和流通一定数量的比特币。当比特币在侧链流通时,主链上对应的比特币会被锁定,直到比特币从侧链回到主链。总之,侧链机制可以将一些定制化或高频的交易放到比特币主链之外进行,实现了比特币区块链的扩展。侧链的核心原理在于能够冻结一条链上的资产,然后在另一条链上产生,可以通过多种方式来实现。当然最容易想到的就是SPV证明的方法。

### SPV证明

在比特币系统中验证交易时,涉及到交易合法性检查、双重花费检查、脚本检查等。由于验证过程需要完整的 UTXO 记录,通常要由运行着完整功能节点的矿工来完成。

而很多时候,用户只关心与自己相关的那些交易,比如当用户收到其他人号称发来的比特币时,只希望能够知道交易是否合法、是否已在区块链中存在了足够的时间(即获得足够的确认),而不需要自己成为完整节点做出完整验证。

中本聪设计的简单支付验证(Simplified Payment Verification,SPV)可以实现这一点。SPV 能够以较小的代价判断某个支付交易是否已经被验证过(存在于区块链中),以及得到了多少算力保护(定位包含该交易的区块在区块链中的位置)。SPV 客户端只需要下载所有区块的区块头(Block Header),并进行简单的定位和计算工作就可以给出验证结论。

侧链协议中,用SPV来证明一个交易确实已经在区块链中发生过,称为SPV证明(SPV Proof)。一个SPV证明包括两部分内容:一组区块头的列表,表示工作量证明;一个特定输出(output)确实存在于某个区块中的密码学证明(特殊锁定)。

### 双向挂钩

侧链协议的涉及难点在于如何让资产在主链和侧链之间安全流转。简而言之,接收资产的链必须确保发送资产的链上的币被可靠锁定。

![](https://yeasy.gitbooks.io/blockchain_guide/content/bitcoin/_images/sidechain_workflow.png)

上图演示了侧链和主链双向挂钩的过程

侧链技术协议采用主侧链双向挂钩机制实现比特币从主链向侧链转移和返回。主链和侧链需要对对方的特定交易做SPV验证。完整过程如下:

- 当用户要向侧链转移比特币时,首先在主链创建交易,待转移的比特币被发往一个特殊的输出。这些比特币在主链上被锁定。
- 等待一段确认期,使得上述交易获得足够的工作量缺人。
- 用户在侧链创建交易提取比特币,需要在这笔交易的输入指明上述主链被锁定的输出,并提供足够的SPV证明。
- 等待一段竞争期,防止双重花费攻击。
- 比特币在侧链上自由流通。
- 当用户想让比特币返回主链时,采取类似的反向操作。
- 首先在侧链创建交易,待返回的比特币被发往一个特殊的输出。
- 等待一段确认期。
- 在主链用足够的对侧链输出的SPV证明来解锁最早被锁定的输出。
- 竞争期过后,主链比特币恢复流通。

### 联合楔入(Federated pegs)

在比特币区块链上锁币,然后在侧链上进行体现是可行的,但是由于比特币协议的局限性,体现的过程无法达到完全的去中心化。侧链的运作是双向的,二级资产的体现仍然无法转换到比特币网络中。因此,双向楔入的另一个部分去中心化(semi-decentralized)选择就产生了:联合楔入。

联合楔入将体现功能委托个一个有信用保证的团体,在二级区块链交易中,比特币网络不负责资金的冻结或者解冻。要进行侧链内外的资产转移,用户可以将这些资产转移到一个由federation控制的多重签名(multisig)地址中。

一旦这个地址接收到了一定数量的比特币,这个二级区块链将以完全去中心化的模式发放这部分资金,整个过程无需federation的审核。

如果用户想要把币从侧链转移到比特币区块链,他只要把这部分比特币转移到侧链中一个特定的地址中,并且在侧链中附上比特币区块链中的输出值信息。

接着,联合楔入会为输出创建交易。这笔交易必须由大多数密钥持有者进行签名,这样计算联合楔入的某位成员心怀不轨也不至于危及整个系统的安全。

### 侧链引发的再思考

比特币出现后,其提供了充足的分布式节点和算力壁垒,但其拥堵和高延迟导致其无法实现商用落地,而以太坊有了智能合约的功能,但也有太拥堵的问题。根本原因都是在区块链设计之初没有从分层的角度去思考整个问题集。

- 第一,应用数据和结算数据是否都应该在一个区块链上并存?
- 第二,多种应用数据是否应该在一个区块链上混合并存?所有智能合约都跑在主链的一个虚拟机上,是获得了同等的安全保障,但带来的耗费是不合理的。
- 第三,应用规模是否足以保障区块链数据安全?就是从零开发公链,面临分布式节点太少,根本谈不上去中心化的安全,很多功能还不如直接用微信小程序来实现。
- 第四,任何应用运算都需交等额的手续费?这个问题是第二个问题的延伸,如果只是一条主链,那么其对于所有的智能合约中的操作的价格估算是同质的,其价格是缺少分层规划的。
- 第五,是否所有的交易操作都需要等额的挖矿耗费?不同的交易具有不同的价值,这是事实,如果采用侧链技术,将绝大部分的交易存储放在侧链上,而挖矿采用主链联合挖矿的方式,也即是运用主链的强大共识机制,侧链搭顺风车,比如主链上有1万个节点达成了强大的共识,而侧链只有10个节点负责存储侧链数据,但10个节点存储的数据量是整个网络的99%,反正验证交易等行为在挖矿节点上进行都是很快的,只是出块的时候,将侧链数据推送到侧链上进行保存,而侧链10个节点不需要进行挖矿,这10个节点完全听主链上1万个节点就OK了。
- 第六,主链上统一的计算虚拟机是否是不必要的?对于不同的智能合约,其重要性的差别是不言自明的,其需要保存的数据的重要性也是同样道理,如果采用一条主链垂直实现,就会出现像以太坊类似的严重的性能扩展问题,数据量同步负担过重也会造成安全问题。而侧链能负责这两部分,计算虚拟机拆分解决主链性能不足问题,数据存储拆分解决数据治理的扩展性问题。


Loading

0 comments on commit 9e6dc66

Please sign in to comment.