EOS 跨链转账(一)不可撤销块的确认

EOS 跨链转账(一)不可撤销块的确认_第1张图片

1.0 什么是跨链转账?

随着区块链技术的火热,出现了大量的区块链企业,也出现了大量不同的链。随之而来的是一个新技术的诞生——跨链技术。
跨链,顾名思义,就是通过一个技术,能让价值跨过链和链之间的障碍,进行直接的流通。那么怎样理解跨链呢?
区块链是分布式总账的一种。一条区块链就是一个独立的账本,两条不同的链,就是两个不同的独立的账本,两个账本没有关联。本质上价值没有办法在账本间转移,但是对于具体的某个用户而言他有需求,一条区块链上存储的价值直接转移到另一条链上,而跨链技术带来的直接好处就是实现价值的流通、分摊转账流量的压力、多链生态的构建。
跨链转账技术是一个比较复杂的技术,目前主流的跨链技术有公证人转账、侧链\中继、哈希锁定、分布式私钥控制,接下来就模拟下以EOS为主链,同时侧链方式实现跨链转账。

1.1 开发环境:

阅读本文前,确定您已经能够启动单节点EOSIO node,如果还不能正确操作,请参考官方WIKI:https://developers.eos.io/eosio-nodeos/docs/autobuild-script
并且对C++宏已掌握,且能够简单修改EOS源码

操作系统:MACOS,EOSIO版本号:V1.1.3

2.1 开发环境搭建:

2.1.1 主链环境搭建:

  • 1)启动主网节点 (单节点)($num是你需要输入的参数 )
    $1表示

cd ~/cactus/cactus_eos/MainChain/build/programs/nodeos
./nodeos --delete-all-blocks --plugin eosio::sidechain_plugin --plugin eosio::client_plugin
--http-server-address 127.0.0.1:8888 --p2p-listen-endpoint 127.0.0.1:8900 --p2p-peer-address 127.0.0.1:9876
--config-dir $4 --data-dir $4 --client-private-key 5K8MzDTmBKfGWE5wDpTcpmMimHH2SzFADjmSkvJe47RWHv3nbke
--enable-send-propose --read-mode=irreversible --side-chain-address http://192.168.31.144:8888 --side-chain-account $1

  • 2)创建账号

echo "跳转到项目目录下,此处需要根据node的实际情况做调整"cd ~/cactus/cactus_eos/MainChain/build/programs/cleos
./cleos wallet unlock -n newb --password ***
echo "创建代币创建账号eosio.token"
./cleos create account eosio eosio.token EOS8GhCnJCnHFDUQhTmfAVun9AfKWp6Puye45uMJZNjYFeDCkc6N1 EOS8GhCnJCnHFDUQhTmfAVun9AfKWp6Puye45uMJZNjYFeDCkc6N1

echo "创建合约发布账号cactus"
./cleos create account eosio cactus EOS8GhCnJCnHFDUQhTmfAVun9AfKWp6Puye45uMJZNjYFeDCkc6N1 EOS8GhCnJCnHFDUQhTmfAVun9AfKWp6Puye45uMJZNjYFeDCkc6N1

echo "创建转账账户"
./cleos create account eosio zhd EOS8GhCnJCnHFDUQhTmfAVun9AfKWp6Puye45uMJZNjYFeDCkc6N1 EOS8GhCnJCnHFDUQhTmfAVun9AfKWp6Puye45uMJZNjYFeDCkc6N1
./cleos create account eosio yc EOS7Kgumj1E1bYeHR73KrNWs8NPrNisy27yvXcmnDC555cXh67E9x EOS7Kgumj1E1bYeHR73KrNWs8NPrNisy27yvXcmnDC555cXh67E9x
./cleos create account eosio sf EOS7Kgumj1E1bYeHR73KrNWs8NPrNisy27yvXcmnDC555cXh67E9x EOS7Kgumj1E1bYeHR73KrNWs8NPrNisy27yvXcmnDC555cXh67E9x

  • 3)部署合约

echo "发布cactus.token 合约"
./cleos set contract cactus ~/cactus/cactus_eos/MainChain/contracts/cactus.msig -p cactus
echo "发布eosio.token 合约"
./cleos set contract eosio.token ~/cactus/cactus_eos/MainChain/build/contracts/eosio.token -p eosio.token

2.1.2 侧链环境搭建:

  • 1)启动侧网节点 (多节点)

./nodeos --delete-all-blocks -e -p eosio --plugin eosio::chain_api_plugin --plugin eosio::net_api_plugin --plugin eosio::sync_plugin --plugin eosio::client_plugin --plugin eosio::history_api_plugin --http-server-address 192.168.31.144:8888 --p2p-listen-endpoint 127.0.0.1:9876 --p2p-peer-address 127.0.0.1:9877 --config-dir ~/Library/Application\ Support/eosio/nodeos/config --data-dir ~/Library/Application\ Support/eosio/nodeos/data --private-key ["EOS6jVXMxEjCtEGsqBNrZgrN49ReCGsUPGxmGP7Wj4cFVYfphrWdL","5K8MzDTmBKfGWE5wDpTcpmMimHH2SzFADjmSkvJe47RWHv3nbke"] --client-private-key 5JWMfhENjLHQcoLb4EKd6SqnyLVk9ajZPYC4iHA28WjxPvWLAZj --enable-send-propose --peer-chain-address http://192.168.31.167:8889 --peer-chain-account yc

备注:192.168.31.144为侧链IP 192.168.31.167为主链IP

./nodeos --delete-all-blocks --plugin eosio::chain_api_plugin --plugin eosio::net_api_plugin --plugin eosio::sync_plugin --plugin eosio::client_plugin --plugin eosio::history_api_plugin --http-server-address 192.168.31.144:8889 --p2p-listen-endpoint 127.0.0.1:9877 --p2p-peer-address 127.0.0.1:9876 --config-dir ~/Library/Application\ Support/eosio/nodeos2/config --data-dir ~/Library/Application\ Support/eosio/nodeos2/data --private-key ["EOS6jVXMxEjCtEGsqBNrZgrN49ReCGsUPGxmGP7Wj4cFVYfphrWdL","5K8MzDTmBKfGWE5wDpTcpmMimHH2SzFADjmSkvJe47RWHv3nbke"] --client-private-key 5JWMfhENjLHQcoLb4EKd6SqnyLVk9ajZPYC4iHA28WjxPvWLAZj --enable-send-propose --peer-chain-address http://192.168.31.167:8890 --peer-chain-account sf

  • 2)创建账号

#解锁钱包
./cleos wallet unlock -n walletsf2 --password PW5HxmbMCPukVX1qWFPD5nowgL5XPgzeFWk9RdNua1oWfue4vfzRq
#创建cactus 账户
./cleos -u http://192.168.31.144:8888 create account eosio cactus EOS6jVXMxEjCtEGsqBNrZgrN49ReCGsUPGxmGP7Wj4cFVYfphrWdL EOS6jVXMxEjCtEGsqBNrZgrN49ReCGsUPGxmGP7Wj4cFVYfphrWdL
#由cactus账户部署合约
./cleos -u http://192.168.31.144:8888 set contract cactus ~/cactus_eos/MainChain/contracts/cactus.msig -p cactus
./cleos -u http://192.168.31.144:8888 set account permission cactus active '{"threshold":1,"keys":[],"accounts":[{"permission":{"actor":"cactus","permission":"eosio.code"},"weight":1}],"waits":[]}' owner -p cactus@owner
#创建转账账户longge
./cleos -u http://192.168.31.144:8888 create account eosio longge EOS6jVXMxEjCtEGsqBNrZgrN49ReCGsUPGxmGP7Wj4cFVYfphrWdL EOS6jVXMxEjCtEGsqBNrZgrN49ReCGsUPGxmGP7Wj4cFVYfphrWdL
#创建sf 账户
./cleos -u http://192.168.31.144:8888 create account eosio sf EOS6jVXMxEjCtEGsqBNrZgrN49ReCGsUPGxmGP7Wj4cFVYfphrWdL EOS6jVXMxEjCtEGsqBNrZgrN49ReCGsUPGxmGP7Wj4cFVYfphrWdL
#创建eosio.token 账户
./cleos -u http://192.168.31.144:8888 create account eosio eosio.token EOS6jVXMxEjCtEGsqBNrZgrN49ReCGsUPGxmGP7Wj4cFVYfphrWdL EOS6jVXMxEjCtEGsqBNrZgrN49ReCGsUPGxmGP7Wj4cFVYfphrWdL
#创建yc 账户
./cleos -u http://192.168.31.144:8888 create account eosio yc EOS6jVXMxEjCtEGsqBNrZgrN49ReCGsUPGxmGP7Wj4cFVYfphrWdL EOS6jVXMxEjCtEGsqBNrZgrN49ReCGsUPGxmGP7Wj4cFVYfphrWdL

3.1 不可撤销块的确认详解:

3.1.1 创建新的plugin:

  • 1)在plugins目录下创建sync_plugin


  • 2)在CMakeLists中注册sync_plugin


3.1.2 设置信号

  • 1)在sync_plugin_impl中注册信号
    分别注册sync_block_transaction_connection和irreversible_block_connection两个信号


    EOS 跨链转账(一)不可撤销块的确认_第2张图片
  • 2)在chain--controller中触发信号
    分别在controller中的sync_block_transaction中触发sync_block_transaction_connection信号、在controller中的irreversible_block中触发irreversible_block_connection信号


3.1.3 构建所需表结构

构建transaction_reversible_multi_index和transaction_executed_multi_index两张表结构
(构建中涉及到宏的知识点)


3.1.4 设置不可撤销块逻辑代码:


核心代码解析:在侧链同步侧链数据时候,每过来一笔trx,都会校验这笔trx是否是向主网构建的合约中的固定账号转账,若是则说明该笔trx是一笔有主网发向侧网的转账,将这笔交易放入transaction_reversible_multi_index中。

你可能感兴趣的:(EOS 跨链转账(一)不可撤销块的确认)