diff --git a/CHANGELOG.md b/CHANGELOG.md index d5680044a13..ebf2333bd42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ - Changed: [#5806](https://github.com/ethereum/aleth/pull/5806) Optimize selfdestruct opcode in aleth-interpreter by reducing state accesses in certain out-of-gas scenarios. - Removed: [#5760](https://github.com/ethereum/aleth/pull/5760) Official support for Visual Studio 2015 has been dropped. Compilation with this compiler is expected to stop working after migration to C++14. - Fixed: [#5792](https://github.com/ethereum/aleth/pull/5792) Faster and cheaper execution of RPC functions which query blockchain state (e.g. getBalance). +- Fixed: [#5811](https://github.com/ethereum/aleth/pull/5811) RPC methods querying transactions (`eth_getTransactionByHash`, `eth_getBlockByNumber`) return correct `v` value. ## [1.7.0] - Unreleased diff --git a/libethcore/TransactionBase.cpp b/libethcore/TransactionBase.cpp index d13dfc869a1..bfaaf475136 100644 --- a/libethcore/TransactionBase.cpp +++ b/libethcore/TransactionBase.cpp @@ -134,6 +134,16 @@ SignatureStruct const& TransactionBase::signature() const return *m_vrs; } +u256 TransactionBase::rawV() const +{ + if (!m_vrs) + BOOST_THROW_EXCEPTION(TransactionIsUnsigned()); + + int const vOffset = m_chainId.has_value() ? *m_chainId * 2 + 35 : 27; + return m_vrs->v + vOffset; +} + + void TransactionBase::sign(Secret const& _priv) { auto sig = dev::sign(_priv, sha3(WithoutSignature)); @@ -163,10 +173,8 @@ void TransactionBase::streamRLP(RLPStream& _s, IncludeSignature _sig, bool _forE if (hasZeroSignature()) _s << *m_chainId; else - { - int const vOffset = m_chainId.has_value() ? *m_chainId * 2 + 35 : 27; - _s << (m_vrs->v + vOffset); - } + _s << rawV(); + _s << (u256)m_vrs->r << (u256)m_vrs->s; } else if (_forEip155hash) diff --git a/libethcore/TransactionBase.h b/libethcore/TransactionBase.h index 422939cce19..53e220fb490 100644 --- a/libethcore/TransactionBase.h +++ b/libethcore/TransactionBase.h @@ -137,6 +137,10 @@ class TransactionBase /// @throws TransactionIsUnsigned if signature was not initialized SignatureStruct const& signature() const; + /// @returns v value of the transaction (has chainID and recoveryID encoded in it) + /// @throws TransactionIsUnsigned if signature was not initialized + u256 rawV() const; + void sign(Secret const& _priv); ///< Sign the transaction. /// @returns amount of gas required for the basic payment. diff --git a/libweb3jsonrpc/JsonHelper.cpp b/libweb3jsonrpc/JsonHelper.cpp index 92ba88b2b88..18681a57ada 100644 --- a/libweb3jsonrpc/JsonHelper.cpp +++ b/libweb3jsonrpc/JsonHelper.cpp @@ -112,7 +112,7 @@ Json::Value toJson(dev::eth::Transaction const& _t, std::pair<h256, unsigned> _l res["blockHash"] = toJS(_location.first); res["transactionIndex"] = toJS(_location.second); res["blockNumber"] = toJS(_blockNumber); - res["v"] = toJS(_t.signature().v); + res["v"] = toJS(_t.rawV()); res["r"] = toJS(_t.signature().r); res["s"] = toJS(_t.signature().s); } @@ -213,7 +213,7 @@ Json::Value toJson(dev::eth::Transaction const& _t) res["sighash"] = toJS(_t.sha3(WithoutSignature)); res["r"] = toJS(_t.signature().r); res["s"] = toJS(_t.signature().s); - res["v"] = toJS(_t.signature().v); + res["v"] = toJS(_t.rawV()); return res; } @@ -243,7 +243,7 @@ Json::Value toJson(dev::eth::LocalisedTransaction const& _t) res["blockNumber"] = toJS(_t.blockNumber()); res["r"] = toJS(_t.signature().r); res["s"] = toJS(_t.signature().s); - res["v"] = toJS(_t.signature().v); + res["v"] = toJS(_t.rawV()); } return res; }