@@ -70,23 +70,29 @@ TransactionBase::TransactionBase(bytesConstRef _rlpData, CheckTransaction _check
7070 h256 r = rlp[field = 7 ].toInt <u256>();
7171 h256 s = rlp[field = 8 ].toInt <u256>();
7272
73- if (v > 36 )
74- m_chainId = (v - 35 ) / 2 ;
75- else if (v == 27 || v == 28 )
76- m_chainId = - 4 ;
73+ m_vrs = SignatureStruct{ r, s, v };
74+
75+ if (hasZeroSignature () )
76+ m_chainId = m_vrs. v ;
7777 else
78- BOOST_THROW_EXCEPTION (InvalidSignature ());
78+ {
79+ if (v > 36 )
80+ m_chainId = (v - 35 ) / 2 ;
81+ else if (v == 27 || v == 28 )
82+ m_chainId = -4 ;
83+ else
84+ BOOST_THROW_EXCEPTION (InvalidSignature ());
85+ m_vrs.v = v - (m_chainId * 2 + 35 );
86+
87+ if (_checkSig >= CheckTransaction::Cheap && !m_vrs.isValid ())
88+ BOOST_THROW_EXCEPTION (InvalidSignature ());
89+ }
7990
80- v = v - (m_chainId * 2 + 35 );
91+ if (_checkSig == CheckTransaction::Everything)
92+ m_sender = sender ();
8193
8294 if (rlp.itemCount () > 9 )
8395 BOOST_THROW_EXCEPTION (InvalidTransactionFormat () << errinfo_comment (" to many fields in the transaction RLP" ));
84-
85- m_vrs = SignatureStruct{ r, s, v };
86- if (_checkSig >= CheckTransaction::Cheap && !m_vrs.isValid ())
87- BOOST_THROW_EXCEPTION (InvalidSignature ());
88- if (_checkSig == CheckTransaction::Everything)
89- m_sender = sender ();
9096 }
9197 catch (Exception& _e)
9298 {
@@ -111,10 +117,15 @@ Address const& TransactionBase::sender() const
111117{
112118 if (!m_sender)
113119 {
114- auto p = recover (m_vrs, sha3 (WithoutSignature));
115- if (!p)
116- BOOST_THROW_EXCEPTION (InvalidSignature ());
117- m_sender = right160 (dev::sha3 (bytesConstRef (p.data (), sizeof (p))));
120+ if (hasZeroSignature ())
121+ m_sender = MaxAddress;
122+ else
123+ {
124+ auto p = recover (m_vrs, sha3 (WithoutSignature));
125+ if (!p)
126+ BOOST_THROW_EXCEPTION (InvalidSignature ());
127+ m_sender = right160 (dev::sha3 (bytesConstRef (p.data (), sizeof (p))));
128+ }
118129 }
119130 return m_sender;
120131}
0 commit comments