eosコード読書ノート07-トランザクション署名プロセス

4705 ワード

アカウントを作成するときに一歩sign_Transaction、アカウントの作成方法については、アカウントの作成を参照してください
REQUEST: 
--------------------- 
POST /v1/wallet/sign_transaction HTTP/1.0 
Host: localhost 
content-length: 688 
Accept: */*  
Connection: close  
  
[{"expiration":"2018-06-29T08:02:46","ref_block_num":46,"ref_block_prefix":2928461137,"max_net_usage_words":0,"max_cpu_usage_ms":0,"delay_sec":0,"context_free_actions":[],"actions":[{"account":"eosio","name":"newaccount","authorization":[{"actor":"eosio","permission":"active"}],"data":"0000000000ea305500000000000040c801000000010002f17657f3303512f7b0ea2f2a682aa8b1b693817d98d959800fdcf480881aef0a0100000001000000010002f17657f3303512f7b0ea2f2a682aa8b1b693817d98d959800fdcf480881aef0a01000000"}],"transaction_extensions":[],"signatures":[],"context_free_data":[]},["EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV"],"cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f"]  
---------------------  
RESPONSE:  
---------------------  
{  
  "expiration": "2018-06-29T08:02:46",  
  "ref_block_num": 46,  
  "ref_block_prefix": 2928461137,  
  "max_net_usage_words": 0,  
  "max_cpu_usage_ms": 0,  
  "delay_sec": 0,  
  "context_free_actions": [],  
  "actions": [{  
      "account": "eosio",  
      "name": "newaccount",  
      "authorization": [{  
          "actor": "eosio",  
          "permission": "active"  
        }  
      ],  
      "data": "0000000000ea305500000000000040c801000000010002f17657f3303512f7b0ea2f2a682aa8b1b693817d98d959800fdcf480881aef0a0100000001000000010002f17657f3303512f7b0ea2f2a682aa8b1b693817d98d959800fdcf480881aef0a01000000"  
    }  
  ],  
  "transaction_extensions": [],  
  "signatures": [  
    "SIG_K1_KenQx2BuGv5tYU31Q97oQLgowyw9woDhRdxuUcRYrk34qyoBnEMjUcECL14juchJATCzM5rj14LP5ATViy5mDyZVpyGh8N"  
  ],  
  "context_free_data": []  
}  

署名メソッドを定義し、pkは公開鍵である
wallet_manager.cpp
chain::signed_transaction
wallet_manager::sign_transaction(const chain::signed_transaction& txn, const flat_set& keys, const chain::chain_id_type& id) {
   check_timeout();
   chain::signed_transaction stxn(txn);

   for (const auto& pk : keys) {
      bool found = false;
      for (const auto& i : wallets) {
         if (!i.second->is_locked()) {
            optional sig = i.second->try_sign_digest(stxn.sig_digest(id, stxn.context_free_data), pk);
            if (sig) {
               stxn.signatures.push_back(*sig);
               found = true;
               break; // inner for
            }
         }
      }
      if (!found) {
         EOS_THROW(chain::wallet_missing_pub_key_exception, "Public key not found in unlocked wallets ${k}", ("k", pk));
      }
   }

   return stxn;
}

sig_digest、この関数から見ると、署名にはsigned_が含まれています.transaction
digest_type transaction::sig_digest( const chain_id_type& chain_id, const vector& cfd )const {
   digest_type::encoder enc;
   fc::raw::pack( enc, chain_id ); ID
   fc::raw::pack( enc, *this ); 
   if( cfd.size() ) {
      fc::raw::pack( enc, digest_type::hash(cfd) );
   } else {
      fc::raw::pack( enc, digest_type() );
   }
   return enc.result();
}

公開鍵で秘密鍵を見つけ、データに署名します.
wallet.cpp
  optional try_sign_digest( const digest_type digest, const public_key_type public_key ) {
      auto it = _keys.find(public_key);
      if( it == _keys.end() )
         return optional{};
      return it->second.sign(digest);
   }
秘密鍵定義
class private_key
   {
      public:
         using storage_type = static_variant<:private_key_shim r1::private_key_shim="">;

         private_key() = default;
         private_key( private_key&& ) = default;
         private_key( const private_key& ) = default;
         private_key& operator= (const private_key& ) = default;

         public_key     get_public_key() const;
         signature      sign( const sha256& digest, bool require_canonical = true ) const;