1.  

在做一个EOS 的action接口时,定义如下:

  1. void setbplist(const account_name bp_name, const uint64_t bp_time, const std::string hash_bplist, const std::vector< uosio::producer_key >& bplist);

   其中有一个结构uosio::producer_key,它在合约的结构中是如下定义:

  1. struct /* */producer_key {
  2. account_name producer_name;
  3. public_key block_signing_key;
  4.  
  5. friend bool operator < ( const producer_key& a, const producer_key& b ) {
  6. return a.producer_name < b.producer_name;
  7. }
  8.  
  9. UOSLIB_SERIALIZE( producer_key, (producer_name)(block_signing_key))
  10. };

  其中 public_key 定义如下:

  1. struct public_key {
  2. unsigned_int type;
  3. std::array<char,33> data;
  4.  
  5. friend bool operator == ( const public_key& a, const public_key& b ) {
  6. return std::tie(a.type,a.data) == std::tie(b.type,b.data);
  7. }
  8. friend bool operator != ( const public_key& a, const public_key& b ) {
  9. return std::tie(a.type,a.data) != std::tie(b.type,b.data);
  10. }
  11. UOSLIB_SERIALIZE( public_key, (type)(data) )
  12. };

  这里的 public_key 是一个压缩成33个字节的数据,但其实我传的是 一组公匙,我想在智能合约里还原成公匙的形态。EOS公匙是基于base58编码,这个与比特币的一致,这里不再详述了。

  下面下面是我的代码:

  1. std::string system_contract::get_public_key_from_array(const char* pub, const int len) {
  2. std::string result;
  3.  
  4. checksum160 ck;
  5. ripemd160(pub, len, &ck);
  6.  
  7. std::vector<unsigned char> vec;
  8.  
  9. for(int i = 0; i < len; ++i) {
  10. vec.push_back(pub[i]);
  11. }
  12.  
  13. for(int i = 0; i < 4; ++i ) {
  14. vec.push_back(ck.hash[i]);
  15. }
  16.  
  17. result = "UOS" + EncodeBase58(vec);
  18.  
  19. print("result: ", result, "\n");
  20.  
  21. return result;
  22. }
  23.  
  24. std::string system_contract::EncodeBase58(const std::vector<unsigned char>& vch)
  25. {
  26.   return EncodeBase58(vch.data(), vch.data() + vch.size());
  27. }
  28.  
  29. std::string system_contract::EncodeBase58(const unsigned char* pbegin, const unsigned char* pend)
  30. {
  31.   // Skip & count leading zeroes.
  32.   int zeroes = 0;
  33.   int length = 0;
  34.   while (pbegin != pend && *pbegin == 0) {    
  35.     pbegin++;
  36.     zeroes++;
  37.   }
  38.   // Allocate enough space in big-endian base58 representation.
  39.   int size = (pend - pbegin) * 138 / 100 + 1; // log(256) / log(58), rounded up.
  40.   std::vector<unsigned char> b58(size);
  41.   // Process the bytes.
  42.   while (pbegin != pend) {
  43.     int carry = *pbegin;
  44.     int i = 0;
  45.     // Apply "b58 = b58 * 256 + ch".
  46.     for (std::vector<unsigned char>::reverse_iterator it = b58.rbegin(); (carry != 0 || i < length) && (it != b58.rend()); it++, i++) {
  47.       carry += 256 * (*it);
  48.       *it = carry % 58;
  49.       carry /= 58;
  50.     }
  51.  
  52.     assert(carry == 0);
  53.     length = i;
  54.     pbegin++;
  55.   }
  56.  
  57.   // Skip leading zeroes in base58 result.
  58.   std::vector<unsigned char>::iterator it = b58.begin() + (size - length);
  59.   while (it != b58.end() && *it == 0)
  60.     it++;
  61.  
  62.   // Translate the result into a string.
  63.   std::string str;
  64.   str.reserve(zeroes + (b58.end() - it));
  65.   str.assign(zeroes, '1');
  66.  
  67.   while (it != b58.end())
  68.     str += pszBase58[*(it++)];
  69.  
  70.   return str;
  71. }

  

我的合约里调用此接口的部分代码:

接口的调用:

  1. cluos -u http://10.186.11.112:8000 push action uosio setbplist '{"bp_name":"marsaccount3","bp_time":"1553685636", "hash_bplist":"9d3329c56e7e6f6068f7dbd905f4b99ffa86ba53897c2a399f5d3637ade41c9a", "bplist":[{"producer_name":"marsaccount3", "block_signing_key":"UOS6aWfdf6tHWCepZpP6MzdynuNMAkNKr6nbNMguTuCatq88LyG4G"},{"producer_name":"dragonexsafe", "block_signing_key":"UOS7DVNg9bsq1zUZtUbWwA1UyhaqFBmNrCRVnPFeGYgsx7kzfAtiC"},{"producer_name":"uosvegasjack", "block_signing_key":"UOS5aTdkbRaPH5WKYPJaxX8HfqGtX8hKx8p6FDPAzpkyJiYnuBu5c"}]}' -x 2000 -p marsaccount3@active

 

可以看到我的三个公匙是:

  1. UOS6aWfdf6tHWCepZpP6MzdynuNMAkNKr6nbNMguTuCatq88LyG4G
  1. UOS7DVNg9bsq1zUZtUbWwA1UyhaqFBmNrCRVnPFeGYgsx7kzfAtiC
  1. UOS5aTdkbRaPH5WKYPJaxX8HfqGtX8hKx8p6FDPAzpkyJiYnuBu5c

但实际到了EOS合约里面,已经被处理过了,像第一个公匙 UOS6aWfdf6tHWCepZpP6MzdynuNMAkNKr6nbNMguTuCatq88LyG4G 在传到合约里对应的就是33个字节的数据,以十六进制打印出来就是  02de9288d61afea6084227b2db9449fd58986652bcda91a4efeeac3ef0ee4ad80c

通过以上的接口就还原公匙的原型了。

参考来源:https://www.liaoxuefeng.com/article/001523444489789210f7acb0355485d91cfb1a44788ac9b000

EOS 智能合约 plublic key 转换的更多相关文章

  1. 【精解】EOS智能合约演练

    EOS,智能合约,abi,wasm,cleos,eosiocpp,开发调试,钱包,账户,签名权限 热身 本文旨在针对EOS智能合约进行一个完整的实操演练,过程中深入熟悉掌握整个EOS智能合约的流程,过 ...

  2. EOS智能合约开发(三):EOS创建和管理账号

    没有看前面文章的小伙伴可以看一下 EOS智能合约开发(一):EOS环境搭建和启动节点 EOS智能合约开发(二):EOS创建和管理钱包 创建好钱包.密钥之后,接下来你就可以创建账号了,账号是什么?账号保 ...

  3. EOS智能合约开发(二):EOS创建和管理钱包

    上节介绍了EOS智能合约开发之EOS环境搭建及启动节点 那么,节点启动后我们要做的第一件事儿是什么呢?就是我们首先要有账号,但是有账号的前提是什么呢?倒不是先创建账号,而是先要有自己的一组私钥,有了私 ...

  4. eos 智能合约开发体验

    eos编译安装 eos 特性 数据存储 eos投票智能合约开发 eos投票智能合约部署测试 注意避坑 eos编译安装 ERROR: Could not find a package configura ...

  5. EOS智能合约存储实例讲解

    EOS智能合约存储实例 智能合约中的基础功能之一是token在某种规则下转移.以EOS提供的token.cpp为例,定义了eos token的数据结构:typedef eos::token<ui ...

  6. EOS智能合约授权限制和数据存储

    EOS智能合约授权限制和数据存储 在EOS合约中,调用合约需要来自账户的授权,同时还要指定需要调用的动作.当然,有的合约并不是所有账户都可以调用的,这就需要用到授权限制.接下来我们就来看看如何限制合约 ...

  7. EOS智能合约开发(四):智能合约部署及调试(附编程示例)

    EOS智能合约开发(一):EOS环境搭建和创建节点 EOS智能合约开发(二):EOS创建和管理钱包 EOS智能合约开发(三):EOS创建和管理账号 部署智能合约的示例代码如下: $ cleos set ...

  8. EOS 智能合约编写(一)

    本文编写了一个简单的EOS智能合约,实现用户管理和资产管理,包括存钱,取钱,转帐的功能,旨在学习如何编写自己的EOS合约功能. 系统:Ubuntu      EOS版本:v1.1.1 一.智能合约代码 ...

  9. eos智能合约与主进程交互

    eos智能合约与主进程交互 1.启动wasm 参考eos智能合约执行流程.md 2.智能合约调用主进程api 如何实现wasm代码与eos宿主交互还需要摸索! 大致:在wasm_interface.c ...

随机推荐

  1. LibEvent代码阅读--多缓冲区和零拷贝技术

    http://blog.chinaunix.net/uid-20937170-id-4827550.html

  2. jqurey datatable tableTools 自定义button元素 以及按钮定义事件

    版本 1.10.4 "dom": 'T<"clear">lfrtip', "tableTools": { //"sSw ...

  3. CSS中盒子垂直居中的常用方法

    在前端开发过程中,盒子居中是常常用到的.其中 ,居中又可以分为水平居中和垂直居中.水平居中是比较容易的,直接设置元素的margin: 0 auto就可以实现.但是垂直居中相对来说是比较复杂一些的.下面 ...

  4. Spring Cloud Zuul 1(API 网关服务)

    API网关是一个更为智能的应用服务器,它的存在就像是整个微服架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤. 它实现的功能包括:请求路由.负载均衡.校验过滤等功能. Spring ...

  5. Leetcode:Longest Palindromic Substring分析和实现

    问题大意是在给定字符串中查找最长的回文子串,所谓的回文就是依据中间位置对称的字符串,比如abba,aba都是回文. 这个问题初一看,非常简单,但是会很快发现那些简单的思路都会带来O(n^3)级别的时间 ...

  6. 10-python中的requests应用

    使用request方便: #_*_ coding: utf-8 _*_ ''' Created on 2018年7月14日 @author: sss ''' import requests impor ...

  7. Ubuntu下配置Apache的Worker模式

    其实Apache本身的并发能力是足够强大的,但是Ubuntu默认安装的是Prefork模式下的Apache.所以导致很多人后面盲目的去 安装lighttpd或者nginx一类替代软件.但是这类软件有一 ...

  8. Log4J 配置 详解

    Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境 ...

  9. 498B Name That Tune

    传送门 题目大意 n首音乐,第i首被听出来的概率为pi,刚开始听第一首,1s后如果听出来了则放第下一首,否则接着听这一首,第i首在连续听了ti s之后一定会被听出来,问Ts后听出来的歌的期望数量. 分 ...

  10. osm2pgsql导入duplicate key error in slim mode

    This is a well known issue and one that is likely not going to be addressed any time soon. While the ...