From 7b574e3db294c02e10fd3d019cd1d4e4ab85ebfb Mon Sep 17 00:00:00 2001 From: Vlad Dobromyslov Date: Tue, 30 Aug 2022 08:18:05 +0300 Subject: [PATCH] #420 - calculate hash for raw transaction as single funtion --- .../ethereum/transaction.cpp | 25 +++++++++++-------- .../ethereum/transaction.hpp | 3 +++ 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/libraries/plugins/peerplays_sidechain/ethereum/transaction.cpp b/libraries/plugins/peerplays_sidechain/ethereum/transaction.cpp index 668e9639..9f160445 100644 --- a/libraries/plugins/peerplays_sidechain/ethereum/transaction.cpp +++ b/libraries/plugins/peerplays_sidechain/ethereum/transaction.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include @@ -12,7 +13,6 @@ #include #include -#include #include namespace graphene { namespace peerplays_sidechain { namespace ethereum { @@ -54,6 +54,15 @@ void transaction::deserialize(const std::string &raw_tx) { //! raw_transaction +bytes raw_transaction::hash() const { + bytes hash; + hash.resize(32); + const auto transaction_string = boost::algorithm::unhex(remove_0x(serialize())); + keccak_256((const unsigned char *)transaction_string.data(), transaction_string.size(), (unsigned char *)hash.data()); + + return hash; +} + signed_transaction raw_transaction::sign(const std::string &private_key) const { //! Prepare signed transaction signed_transaction tr; @@ -64,30 +73,26 @@ signed_transaction raw_transaction::sign(const std::string &private_key) const { tr.value = value; tr.data = data; - //! Calculate keccak hash of transaction - bytes hash; - hash.resize(32); - const auto transaction_string = boost::algorithm::unhex(remove_0x(serialize())); - keccak_256((const unsigned char *)transaction_string.data(), transaction_string.size(), (unsigned char *)hash.data()); - const bytes priv_key = parse_hex(private_key); int recid = 0; secp256k1_ecdsa_recoverable_signature sig; - FC_ASSERT(secp256k1_ecdsa_sign_recoverable(eth_context(), &sig, (const unsigned char *)hash.data(), (const unsigned char *)priv_key.data(), NULL, NULL)); + FC_ASSERT(secp256k1_ecdsa_sign_recoverable(eth_context(), &sig, (const unsigned char *)hash().data(), (const unsigned char *)priv_key.data(), NULL, NULL)); fc::ecc::compact_signature result; FC_ASSERT(secp256k1_ecdsa_recoverable_signature_serialize_compact(eth_context(), (unsigned char *)result.begin() + 1, &recid, &sig)); - bytes v = bytes{char(recid + from_hex(chain_id) * 2 + 35)}; bytes r; for (int i = 1; i < 33; i++) r.emplace_back((char)result.at(i)); + + bytes v = bytes{char(recid + from_hex(chain_id) * 2 + 35)}; + bytes s; for (int i = 33; i < 65; i++) s.emplace_back((char)result.at(i)); - tr.v = fc::to_hex((char *)&v[0], v.size()); tr.r = fc::to_hex((char *)&r[0], r.size()); + tr.v = fc::to_hex((char *)&v[0], v.size()); tr.s = fc::to_hex((char *)&s[0], s.size()); return tr; diff --git a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/ethereum/transaction.hpp b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/ethereum/transaction.hpp index c112206b..b8b1aa13 100644 --- a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/ethereum/transaction.hpp +++ b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/ethereum/transaction.hpp @@ -4,6 +4,8 @@ #include #include +#include + namespace graphene { namespace peerplays_sidechain { namespace ethereum { class base_transaction { @@ -34,6 +36,7 @@ public: std::string data; std::string chain_id; + bytes hash() const; signed_transaction sign(const std::string &private_key) const; virtual std::string serialize() const override;