在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 的帖子,期待您能留言交流!