您正在查看: EOS-新手教程 分类下的文章

EOS 整个链停止,重新强制引导启动

BP节点全部停止,各节点重新启动后,无法正常出块

最近因为非技术原因,导致测试链所有BP节点都停止了。
由于producer_plugin中的安全检查,导致BP节点启动后,一直处于start_block_result::waiting
导致整个链网络瘫痪。

强制引导启动

先准备一台非目前BP节点所在的机器做强制引导节点。然后把目前出块账户的 2/3 +1 个BP账号都配置到此节点。
并把目前其他的BP节点都关闭pkill nodeos

修改强制引导节点的链程序,绕过安全检查

https://github.com/EOSIO/eos/blob/3c553db73864ea19458512b4669cf9942dc59f57/plugins/producer_plugin/producer_plugin.cpp#L1350
将下面代码注释掉,并重新编译链程序

if (_pending_block_mode == pending_block_mode::speculating) {
      auto head_block_age = now - chain.head_block_time();
      if (head_block_age > fc::seconds(5))
         return start_block_result::waiting;
   }

修改BP节点的配置为同步节点的配置

先将其余BP节点的config,改为同步节点的配置,也就是把强制引导节点的p2p-peer-address加到各BP节点的config,并把各BP节点的producer-namesignature-provider都注释掉。

强制启动引导节点

添加-e,强制启动出块

nodeos -e

此时强制出块节点应该已出块。

启动各BP节点

将其余BP节点分别启动,此时开始同步区块,等到追上强制出块节点高度。

迁移BP账号

关闭强制出块节点,把BP账号从config里面每注释掉一部分,就把对应的BP节点停止,并修改config,把对应的BP账号放开。此时重新启动强制出块节点和新迁移BP的节点,现在强制出块节点除去注释掉的部分出块账号。其余BP账号出块正常,且能从新迁移BP节点同步对应的出块BP账号的出块。新迁移的BP节点,出块也正常。
依次类推,迁移其余BP节点账号,等其余BP节点都出块正常后,及此次强制引导启动链网络结束。

备注

能出现全部节点停止的情况,基本都是特殊公链-“私链”,所以具有大部分BP的掌控权,我们先只针对此情景提出修复方案。

EOS 同步Mongo,各表数据解释

使用场景

由于需要对链上数据进行大量自定义得查询,一般来说还是通过部署同步节点,然后使用mongo插件将链上数据同步到Mongo进行使用更直接和方便。(虽然有其他得替代方案比如(Hyperion-History-API)(history-tools),测试下来,mongo更直接些,如果以后有其他方案更新,我们在做文章跟进,此处我们只讨论同步mongo得方案)

mongo 插件配置

必须开启以下配置,才能获取以下讨论中谈及得数据

  • mongodb-store-block-states = true
  • mongodb-store-blocks = true
  • mongodb-store-transactions = true
  • mongodb-store-transaction-traces = true
  • mongodb-store-action-traces = true

Mongo 数据表介绍

使用官方得mongo插件同步后,库数据表如下

  • account_controls
  • accounts
  • action_traces
  • block_states
  • blocks
  • pub_keys
  • transaction_traces
  • transactions

// 稍后补充

附加

action_traces表默认没有"trx_id"得索引,如果想根据"trx_id"查询得话,可以自行添加索引,不然会很慢。

db.action_traces.getIndexes()
db.action_traces.createIndex({"trx_id":1, "background":true})

EOSIO SDK for Rust

用于Rust的EOSIO SDK –用于在Rust中的EOSIO区块链上构建智能合约的API
项目地址:
https://github.com/sagan-software/eosio-rust
开发文档:
https://sagan-software.github.io/eosio-rust/quick-start.html

EOS合约内unpack data

void myaction() {

   struct token_transfer {
      name from;
      name to;
      asset quantity;
      string memo;
   };

   // transaction is inside "prop" object (that we get from a eosio.msig table)
   eosio::multisig::proposals proptable( "eosio.msig"_n, proposer.value );
   auto& prop = proptable.get( proposal_name.value, "proposal not found" );

   // get the first action in the transaction, remember transactions can have multiple actions
   eosio::action my_action = eosio::unpack<eosio::transaction>( prop.packed_transaction ).actions.front();

   // get the data out of the action
   token_transfer my_action_data = my_action.data_as<token_transfer>();

   const name from      = my_action_data.from;
   const name to        = my_action_data.to;
   const asset quantity = my_action_data.quantity;
   const string memo    = my_action_data.memo;
}

参考

https://eosio.stackexchange.com/questions/4142/how-to-get-data-from-a-packed-transaction

关于传统项目转区块链项目

关于传统项目转区块链项目

引入区块链的优势

对于项目方

  1. 想把目前传统项目蹭区块链的热度,传统项目“转型”
  2. 想以此发token,
  3. 增加用户粘性

对于用户

  1. 传统的“数据库积分”可以通过区块链的资金体系流通,并“绕过限制”到交易所变现
  2. 解决信任,计算token的逻辑以及相关源数据去中心化

项目转型的实现

分为资产去中心化以及数据去中心化

资产去中心化

其实主要是怎么实现Token产出,可以先从传统互联网中心化应用的玩法设计,类似于需要数据才能计算出来奖励。

对于区块链去中心化设计,可以分成三个等级

  1. 完全去中心化,服务方与用户分别提供相关数据上链,通过链上智能合约,根据双方提供的源数据,计算奖励。
  2. 相对去中心化,服务方提供相关可以公开的数据上链,通过链上智能合约,根据提供的源数据,计算奖励。
  3. 资产去中心化,服务方根据相关数据,中心化计算相关的奖励,然后将奖励数据推到链上智能合约。

相关计算结果以及相关日志推送上链,用户可从区块浏览器等查看相关日志,根据相关数据验证资产产生的准备性。

数据去中心化

对于数据,分为可公开以及隐私数据

可公开的数据

如果数据量较小的话,可以直接写到智能合约内。对于数据量较大时,可以中心化提供源数据展示,并将数据校验指纹上链,并提供数据校验的工具给用户方,用户可随时进行比对校验。

隐私数据

如果数据量小的话,可以将数据本地加密推送上链,并通过共享加密策略指定相关用户可以解密查看。对于数据量较大的数据,数据验证指纹上链,通过中心化授权系统,指定相关用户可授权访问中心化源数据。

项目策略选定

对于目前传统稍大型项目,一些相关数据较多,且不易公开,并且用户关心点并不是必须完全去中心化。可以优先选定策略为“相对去中心化”,如果只关心资产交易的话,可以选择“资产去中心化”。对于数据的去中心化可以选择大数据量方案,可灵活控制访问授权。

项目实现所需准备

根据具体产品逻辑再定。