#420 - calculate hash for raw transaction as single funtion
This commit is contained in:
parent
1f3beba32a
commit
7b574e3db2
2 changed files with 18 additions and 10 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
#include <graphene/peerplays_sidechain/ethereum/transaction.hpp>
|
#include <graphene/peerplays_sidechain/ethereum/transaction.hpp>
|
||||||
|
|
||||||
#include <boost/algorithm/hex.hpp>
|
#include <boost/algorithm/hex.hpp>
|
||||||
|
#include <boost/algorithm/string.hpp>
|
||||||
#include <boost/property_tree/json_parser.hpp>
|
#include <boost/property_tree/json_parser.hpp>
|
||||||
#include <boost/property_tree/ptree.hpp>
|
#include <boost/property_tree/ptree.hpp>
|
||||||
|
|
||||||
|
|
@ -12,7 +13,6 @@
|
||||||
|
|
||||||
#include <graphene/peerplays_sidechain/ethereum/decoders.hpp>
|
#include <graphene/peerplays_sidechain/ethereum/decoders.hpp>
|
||||||
#include <graphene/peerplays_sidechain/ethereum/encoders.hpp>
|
#include <graphene/peerplays_sidechain/ethereum/encoders.hpp>
|
||||||
#include <graphene/peerplays_sidechain/ethereum/types.hpp>
|
|
||||||
#include <graphene/peerplays_sidechain/ethereum/utils.hpp>
|
#include <graphene/peerplays_sidechain/ethereum/utils.hpp>
|
||||||
|
|
||||||
namespace graphene { namespace peerplays_sidechain { namespace ethereum {
|
namespace graphene { namespace peerplays_sidechain { namespace ethereum {
|
||||||
|
|
@ -54,6 +54,15 @@ void transaction::deserialize(const std::string &raw_tx) {
|
||||||
|
|
||||||
//! raw_transaction
|
//! 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 {
|
signed_transaction raw_transaction::sign(const std::string &private_key) const {
|
||||||
//! Prepare signed transaction
|
//! Prepare signed transaction
|
||||||
signed_transaction tr;
|
signed_transaction tr;
|
||||||
|
|
@ -64,30 +73,26 @@ signed_transaction raw_transaction::sign(const std::string &private_key) const {
|
||||||
tr.value = value;
|
tr.value = value;
|
||||||
tr.data = data;
|
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);
|
const bytes priv_key = parse_hex(private_key);
|
||||||
|
|
||||||
int recid = 0;
|
int recid = 0;
|
||||||
secp256k1_ecdsa_recoverable_signature sig;
|
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::ecc::compact_signature result;
|
||||||
FC_ASSERT(secp256k1_ecdsa_recoverable_signature_serialize_compact(eth_context(), (unsigned char *)result.begin() + 1, &recid, &sig));
|
FC_ASSERT(secp256k1_ecdsa_recoverable_signature_serialize_compact(eth_context(), (unsigned char *)result.begin() + 1, &recid, &sig));
|
||||||
|
|
||||||
bytes v = bytes{char(recid + from_hex<int>(chain_id) * 2 + 35)};
|
|
||||||
bytes r;
|
bytes r;
|
||||||
for (int i = 1; i < 33; i++)
|
for (int i = 1; i < 33; i++)
|
||||||
r.emplace_back((char)result.at(i));
|
r.emplace_back((char)result.at(i));
|
||||||
|
|
||||||
|
bytes v = bytes{char(recid + from_hex<int>(chain_id) * 2 + 35)};
|
||||||
|
|
||||||
bytes s;
|
bytes s;
|
||||||
for (int i = 33; i < 65; i++)
|
for (int i = 33; i < 65; i++)
|
||||||
s.emplace_back((char)result.at(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.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());
|
tr.s = fc::to_hex((char *)&s[0], s.size());
|
||||||
|
|
||||||
return tr;
|
return tr;
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include <graphene/peerplays_sidechain/ethereum/types.hpp>
|
||||||
|
|
||||||
namespace graphene { namespace peerplays_sidechain { namespace ethereum {
|
namespace graphene { namespace peerplays_sidechain { namespace ethereum {
|
||||||
|
|
||||||
class base_transaction {
|
class base_transaction {
|
||||||
|
|
@ -34,6 +36,7 @@ public:
|
||||||
std::string data;
|
std::string data;
|
||||||
std::string chain_id;
|
std::string chain_id;
|
||||||
|
|
||||||
|
bytes hash() const;
|
||||||
signed_transaction sign(const std::string &private_key) const;
|
signed_transaction sign(const std::string &private_key) const;
|
||||||
|
|
||||||
virtual std::string serialize() const override;
|
virtual std::string serialize() const override;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue