bitshares研究系列【问题集三】

in #bitshares6 years ago

在bitshares学习过程中,有一些零散问题整理在一块,互相之间并不一定存在关联性,可能也会穿插一些非bitshares的内容,计划每几个问题做一集发表。

1、pip install bitshares报错

错误如下:

  src/scrypt.c:28:20: fatal error: Python.h: No such file or directory
  compilation terminated.
  error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
  
  ----------------------------------------
  Failed building wheel for scrypt
  Running setup.py clean for scrypt
Failed to build scrypt

解决:

sudo apt-get install python-dev

2、import_key可以引入memo key等吗?

import_key的逻辑是取到用户帐号的所有pubkeys,然后根据wifkey生成pubkey,如果pubkey在pubkeys里则成功。

所以只要属于帐号的任何一个wifkey都可以import_key成功。

3、节点数据出错怎么办?

节点启动时可以指定参数--resync-blockchain,这样会清除本地节点数据,从其它节点同步数据块。

void database::wipe(const fc::path& data_dir, bool include_blocks)
{
   ilog("Wiping database", ("include_blocks", include_blocks));
   if (_opened) {
     close();
   }
   object_database::wipe(data_dir);
   if( include_blocks )
      fc::remove_all( data_dir / "database" );
}

同时还有一个参数--replay-blockchain,这个只是调用wipe函数时指定include_blocks为false,就是不清除块数据。

以下函数是清除数据记录:

void object_database::wipe(const fc::path& data_dir)
{
   close();  
   ilog("Wiping object database...");
   fc::remove_all(data_dir / "object_database");
   fc::remove_all(data_dir / "loan_database");
   ilog("Done wiping object databse.");
}

4、get_potential_signatures返回错误公钥?

get_potential_signatures 取得交易可能的签名,然后再调用 get_required_signatures 时只需传入有效公钥(available_keys)的一个子集

https://github.com/bitshares/bitshares-core/issues/200

get_potential_signatures出错有可能operationid没有匹配,这点steem就好多了,operation用的是字符串,而bitshares还是c/c++的写法,用的是数字id,客户端和链服务一旦没匹配经常会引起问题。

5、私有链无法同步?

38006ms th_a       main.cpp:291                  main                 ] Started BitShares node on a chain with 0 blocks.
38006ms th_a       main.cpp:292                  main                 ] Chain ID is 57c18afa0438e2360007fb6f7dca454ee331f723ff7d898080da720062a02394

启动时一直保持这种状态,不能同步链数据,这样很多操作时可能由于block时间问题无法正常执行。

这种情况很可能是链ID不一致,可以用cli_wallet连接其它同步节点看一下,链ID是不是一样。

当然还有一种情况就是只跑自己一个节点,而没有配置见证人打包。

6、链id为什么与签名有关系?

在链id改变而客户端链id没有匹配时,签名无法通过。

transaction.cpp

flat_set<public_key_type> signed_transaction::get_signature_keys( const chain_id_type& chain_id )const
{ try {
   auto d = sig_digest( chain_id );
   flat_set<public_key_type> result;
   for( const auto&  sig : signatures )
   {
      GRAPHENE_ASSERT(
         result.insert( fc::ecc::public_key(sig,d) ).second,
         tx_duplicate_sig,
         "Duplicate Signature detected" );
   }
   return result;
} FC_CAPTURE_AND_RETHROW() }

交易处理时实际上把链id和数据已经pack到一块了,如下:

digest_type transaction::sig_digest( const chain_id_type& chain_id )const
{
   digest_type::encoder enc;
   fc::raw::pack( enc, chain_id );
   fc::raw::pack( enc, *this );
   return enc.result();
}

7、missing required active authority: Missing Active Authority 1.2.17

可能出现这个错误的几种情况:

  • 没有帐号对应的私钥
  • 链ID不匹配
  • operation数据结构不匹配
  • operation id不匹配

简单说就是要不就是数据不对,要不就是签名不对!

8、get_proposed_transaction 后面的id是啥

   idx.inspect_all_objects([&](const object &obj) {
       const proposal_object &p = static_cast<const proposal_object &>(obj);
           if(id == account_id_type(0))
                result.push_back(p);
           else if (p.required_active_approvals.find(id) != p.required_active_approvals.end())
               result.push_back(p);
           else if (p.required_owner_approvals.find(id) != p.required_owner_approvals.end())
               result.push_back(p);
           else if (p.available_active_approvals.find(id) != p.available_active_approvals.end())
               result.push_back(p);

从这段代码可以看出"1.2.0"能取所有提议,也可以用提议数据结构中required_active_approvals、required_owner_approvals、available_active_approvals的值来取提议。


感谢您阅读 @chaimyu 的帖子,期待您能留言交流!

Sort:  

你好吗?新人吗?《steemit指南》拿一份吧,以免迷路; 另外一定要去 @team-cn 的新手村看看,超级热闹的大家庭。假如我的留言打扰到你,请回复“取消”。

Coin Marketplace

STEEM 0.25
TRX 0.11
JST 0.033
BTC 63157.91
ETH 3096.77
USDT 1.00
SBD 3.91