}
type DposMsg struct {
- Type vm.Op
- Data []byte
+ Type vm.Op `json:"type"`
+ Data []byte `json:"data"`
}
// DELEGATE_IDS PUBKEY SIG(block.time)
+++ /dev/null
-# Vapor 侧链部署说明
-
-## 启动 vapor
-
-```
-./vapor init --chain_id solonet -r "side_chain"
-./vapor node -r "side_chain"
-```
-
-## 获取公私钥
-
-```
-curl -s -X POST -d '{}' http://127.0.0.1:8888/create-key-pair > key_pair
-```
-
-## 停止vapor并删除数据目录
-
-```
-rm -rf side_chain
-```
-
-
-
-## 启动 bytomd、vapor
-
-- bytomd
-```
-./bytomd init --chain_id solonet -r "main_chain"
-./bytomd node -r "main_chain"
-```
-
-- vapor
- fedpeg_xpubs、sign_block_xpubs、signer为上面获取的公私钥
-```
-xprv=$(cat key_pair | jq ".data.xprv" | sed "s/\"//g")
-xpub=$(cat key_pair | jq ".data.xpub" | sed "s/\"//g")
-
-./vapor init --chain_id solonet -r "side_chain"
-
-./vapor node -r "side_chain" --auth.disable --side.fedpeg_xpubs $xpub --side.sign_block_xpubs $xpub --signer $xprv --validate_pegin true --side.parent_genesis_block_hash "a97a7a59e0e313f9300a2d7296336303889930bfdf5a80d8a9b05db343c03380"
-```
-
-## 启动侧链工具
-
-拷贝key_pair到目录tools/side_chain_tool/
-
-* [参考侧链工具README](../tools/side_chain_tool/README.md)
-
-## Bytom----->Vapor
-- 工具页面输入侧链账户ID,获取mainchain_address(主链锁定地址)、claim_script(赎回脚本)
-
- ![pegin-address](pegin-address.png)
-
-- 在主链的dashboard,发送btm到mainchain_address 或者启动monitor_tx自动处理claim tx
-
-- 工具页面赎回交易填入参数,发送交易
-
- ![tosidechain](tosidechain.png)
-
-## Vapor----->Bytom
-- 在主链的dashboard,新建一个主链地址,并备份
-
-- 在侧链的dashboard,导入主链的备份,找到与主链新建地址相同的ctrlProgram的地址,并发送交易到这个地址
-
-- 在侧链的dashboard上retire上面地址的资产
-
-- 工具网页的侧链发送回主链的页面填入参数,发送交易
-
- ![tomain](tomain.png)
--- /dev/null
+# 侧链充值流程
+
+ vapor侧链中验证人、收集人、联邦三个角色:
+
+ 验证人:侧链的出块人,任何人都可以成为验证人。
+
+ 收集人:监控主链锁定在联邦合约地址的交易,收集交易并生成claim交易,发送到节点验证人进行验证入交易池。
+
+ 联邦 : 侧链充值是指资产从主链转移到侧链的过程,转移过程,是需要资产先锁定到联邦合约地址。
+
+ ![main2side](main2side.png)
+
+
+
+ 联邦合约地址生成:
+
+ 1、联邦合约地址需要7个联邦成员公钥生成,系统开始启动由初始出块人担任。
+
+ 2、运行一段时间后vapor侧链上用户可以注册为联邦成员候选人,由vapor侧链用户投票,从注册候选人中选出联邦成员,每次联邦成员变动不能超 过联盟成员的1/3
+
+ 3、选出联邦成员后,由新的联邦成员生成新的合约地址,以前的联邦合约地址转账到新的联邦合约地址。
+
+ 4、转账完成后,主链锁定资产到新的联邦地址,以后可以再竞选联邦成员。
+
+
+
+ 收集人:
+
+ 1、系统启动之时,由初始出块人担任。
+
+ 2、运行一段时间后,vapor侧链上用户可以注册成为候选人收集人,由vapor侧链用户投票,从注册的候选人中选出收集人(dpos出块一轮筛选一次)
+
+ 3、下发新的监控主链的联邦合约地址的收集人,收集交易,并附带收集人列表、收集人签名、原始交易、收集人公钥的claim交易到节点
+
+
+
+ 注:成为验证人、收集人、联邦在侧链都需要质押一定数量的btm
+
+# 侧链提现流程
+
+ 1、vapor侧链用户发起提现请求,销毁vapor侧链的资产
+
+ 2、联邦合约地址针对请求向vapor侧链用户的主链地址发送对应对应数量的资产(前提交易已经在侧链上达到不会回滚的确认数)
+
+ 3、联邦在侧链上生成一笔完成提现的操作的交易
+
--- /dev/null
+# dpos共识
+
+ 在共识协议上,vapor采用了委托权益证明(DPOS)的机制。DPoS 是基于 POW 及 POS 的基础上,出现的一种新型的保障数字货币网络安全的共识算法。它既能解决 POW 在挖矿过程中产生的大量能源过耗的问题,也能避免 POS 权益分配下可能产生的“信任天平”偏颇的问题。
+
+## DPoS 共识机制
+
+ 其原理是让每一个持币者进行投票,选出一定数量的持币者代表,或理解为一定数量的代表节点,并由这些代表节点来完成交易验证和区块生产的工作。持币者可以随时通过投票更换这些代表,以维系链上系统的“长久纯洁性”,保证该协议有充分的去中心化程度。
+
+ 在目前区块链的实现中DPoS共识只用于账户模型, UTXO模型与DPos的结合也会有许多额外的优势,UTXO 模型是存放记录的一种方式,用于交易存储、组织及验证;DPoS 是一种共识算法,用于保证在分布式网络中参与者也可以对交易数据取得一致认识。
+
+## 时间戳
+
+ UTXO 和 DPoS 结合的一大难点在于时间戳,DPoS 共识基于时间,会严格检查区块时间。全节点系统时间必须设置为和标准时间一样,否则共识一致性会出现问题。而 UTXO 本身也记录了时间戳的功能,但时间戳并不基于标准时间。在 LBTC 里将时间戳统一成标准时间协议,以保证区块的正常运行。当存在作恶节点或者时间不同步的区块时,出块被作为异常块处理,出块节点被作为异常节点处理
+
+## 数据快照
+
+ 在 UTXO 模型中,并不支持查询地址余额的功能,是通过全局遍历 UTXO 数据,实时计算地址余额。实时计算的工作量相当巨大,现实中不具备可行性。为了 DPoS 算法的需要,vapor中新增地址余额计算、节点注册、节点投票新功能。考虑到共识算法的高性能要求、注册节点数目的有限性,把地址余额、节点注册及投票信息保存在内存中,并把数据回写到db。通过数据库和地址余额、投票信息来链接 UTXO 记账信息和 DPoS 共识机制:
+
+- 注册、投票的信息由vapor底层协议负责传输。
+- 把注册、投票信息保存在内存以及db中。
+- DPoS 共识模块查看注册、投票信息,完成共识。
\ No newline at end of file
Vapor Blockchain Protocol,是公有链的侧链平台,主要的功能是主链上的资产转移到侧链上,在侧链上实现其应用价值,扩展主链的功能,提高主链的交易速度,提供交易的隐私性。另外也能在侧链上进行不同主链资产之间的交易,提高不同资产之间的流通。
-## 特性
+# 特性
- 主链与侧链之间通过插件模式互通
- 侧链使用dpos共识
-- 侧链支持图灵完备的合约
+- 侧链合约图灵完备
+
+# 文档说明
+
+ 本文档用于指导开发者能够更快的了解侧链技术并能够上手开发使用。 本文档将从侧链的部署,主链与侧链之间转移的原理,侧链的实现方面介绍侧面的技术细节和开发方法。
--- /dev/null
+# Vapor 侧链solonet部署说明
+
+## 启动 vapor
+
+consensus.json内容如下:
+
+```json
+ {
+ "consensus":{
+ "consensus_type": "dpos" ,
+ "period": 3,
+ "max_signers_count": 7,
+ "min_boter_balance": 1000000000,
+ "genesis_timestamp": 1524549600,
+ "coinbase": "vsm1qkm743xmgnvh84pmjchq2s4tnfpgu9ae2f9slep",
+ "xprv": "a8e281b615809046698fb0b0f2804a36d824d48fa443350f10f1b80649d39e5f1e85cf9855548915e36137345910606cbc8e7dd8497c831dce899ee6ac112445",
+ "signers": [
+ "vsm1qkm743xmgnvh84pmjchq2s4tnfpgu9ae2f9slep"
+ ]
+ }
+ }
+```
+
+```shell
+./vapor init --chain_id solonet -r "side_chain"
+./vapor node -r "side_chain" --consensus_config_file consensus.json
+```
+
+## 获取公私钥
+
+```shell
+curl -s -X POST -d '{}' http://127.0.0.1:8888/create-key-pair > key_pair
+
+注: 公私钥用来生成主链上锁定资产以及解锁资产的合约地址
+```
+
+## 停止vapor并删除数据目录
+
+```shell
+rm -rf side_chain
+```
+
+
+
+## 启动 bytomd、vapor
+
+- bytomd
+```shell
+./bytomd init --chain_id solonet -r "main_chain"
+./bytomd node -r "main_chain"
+```
+
+- vapor
+ fedpeg_xpubs、sign_block_xpubs、signer为上面获取的公私钥
+```shell
+xprv=$(cat key_pair | jq ".data.xprv" | sed "s/\"//g")
+xpub=$(cat key_pair | jq ".data.xpub" | sed "s/\"//g")
+
+./vapor init --chain_id solonet -r "side_chain"
+
+./vapor node -r "side_chain" --auth.disable --side.fedpeg_xpubs $xpub --consensus_config_file consensus.json --validate_pegin true --side.parent_genesis_block_hash "a97a7a59e0e313f9300a2d7296336303889930bfdf5a80d8a9b05db343c03380"
+```
+
+## 启动侧链工具
+
+体验的主链与侧链交互的工具的使用如下:
+
+拷贝上面生成key_pair文件到目录tools/side_chain_tool/
+
+* [参考侧链工具README](../../tools/side_chain_tool/README.md)
+
+## Bytom----->Vapor
+- 工具页面输入侧链账户ID,获取mainchain_address(主链锁定地址)、claim_script(赎回脚本)
+
+ ![pegin-address](pegin-address.png)
+
+- 在主链的dashboard,发送btm到mainchain_address 或者启动monitor_tx自动处理claim tx
+
+- 工具页面赎回交易填入参数,发送交易
+
+ ![tosidechain](tosidechain.png)
+
+Vapor----->Bytom
+
+- 在主链的dashboard,新建一个主链地址,并备份
+
+- 在侧链的dashboard,导入主链的备份,找到与主链新建地址相同的ctrlProgram的地址,并发送交易到这个地址
+
+- 在侧链的dashboard上retire上面地址的资产
+
+- 工具网页的侧链发送回主链的页面填入参数,发送交易
+
+ ![tomain](tomain.png)
+
+
+
+## 注册出块候选人
+
+```shell
+`curl -s -X POST -d '{"base_transaction":null,"actions":[{"address":"vsm1qndq3w79kwtk9acnuswxlwxjqweglwhg8yrzp2c","amount":100000000, "asset_id":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","name":"test-node1","dpos_type":1,"type":"dpos"}],"ttl":0,"time_range":43432}' http://127.0.0.1:8888/build-transaction`
+```
+
+
+
+## 用户投票给候选人
+
+```shell
+`curl -s -X POST -d '{"base_transaction":null,"actions":[{"address":"vsm1qkm743xmgnvh84pmjchq2s4tnfpgu9ae2f9slep","amount":100000000, "asset_id":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","forgers":["vsm1qndq3w79kwtk9acnuswxlwxjqweglwhg8yrzp2c", "vsm1q93jcjhwe62n5mdtym6m7utle95erd6s3jsn4tn","vsm1qtu926tcsky876hflm93getsv27w7pccv4jg2fs"],"dpos_type":2,"type":"dpos"}],"ttl":0,"time_range":43432}' http://127.0.0.1:8888/build-transaction`
+```
+
+
+
+## 用户取消投票
+
+```shell
+`curl -s -X POST -d '{"base_transaction":null,"actions":[{"address":"vsm1qkm743xmgnvh84pmjchq2s4tnfpgu9ae2f9slep","amount":100000000, "asset_id":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","forgers":["vsm1qndq3w79kwtk9acnuswxlwxjqweglwhg8yrzp2c", "vsm1q93jcjhwe62n5mdtym6m7utle95erd6s3jsn4tn","vsm1qtu926tcsky876hflm93getsv27w7pccv4jg2fs"],"dpos_type":3,"type":"dpos"}],"ttl":0,"time_range":43432}' http://127.0.0.1:8888/build-transaction`
+```
+
return nil, err
}
- byteData, err := txData.MarshalText()
- if err != nil {
- return nil, err
- }
- txData.SerializedSize = uint64(len(byteData))
delegates := dpos.DelegateInfoList{}
if delegateInfo != nil {
tmp := delegateInfo.(*dpos.DelegateInfo)
}
txData.ReferenceData = data
+ byteData, err := txData.MarshalText()
+ if err != nil {
+ return nil, err
+ }
+ txData.SerializedSize = uint64(len(byteData))
+
tx = &types.Tx{
TxData: *txData,
Tx: types.MapTx(txData),