16
16
17
17
# in the yellow paper it is specified that s should be smaller than secpk1n (eq.205)
18
18
secpk1n = 115792089237316195423570985008687907852837564279074904382605163141518161494337
19
+ null_address = b'\xff ' * 20
19
20
20
21
21
22
class Transaction (rlp .Serializable ):
@@ -59,6 +60,7 @@ def __init__(self, nonce, gasprice, startgas, to, value, data, v=0, r=0, s=0):
59
60
assert len (to ) == 20 or len (to ) == 0
60
61
super (Transaction , self ).__init__ (nonce , gasprice , startgas , to , value , data , v , r , s )
61
62
self .logs = []
63
+ self .network_id = None
62
64
63
65
if self .gasprice >= TT256 or self .startgas >= TT256 or \
64
66
self .value >= TT256 or self .nonce >= TT256 :
@@ -73,30 +75,28 @@ def sender(self):
73
75
74
76
if not self ._sender :
75
77
# Determine sender
76
- if self .v :
77
- if self .r >= N or self .s >= N or self .v not in (27 , 28 , 37 , 38 , 41 , 42 ) \
78
- or self .r == 0 or self .s == 0 :
79
- raise InvalidTransaction ("Invalid signature values!" )
80
- log .debug ('reco< 27 or self.v > 28 \v ering sender' )
78
+ if self .r == 0 and self .s == 0 :
79
+ self .network_id = self .v
80
+ self ._sender = null_address
81
+ else :
81
82
if self .v in (27 , 28 ):
82
- rlpdata = rlp .encode (self , UnsignedTransaction )
83
- rawhash = utils .sha3 (rlpdata )
84
- v = self .v
85
- elif self .v in (37 , 38 ):
86
- rlpdata = rlp .encode (rlp .infer_sedes (self ).serialize (self )[:- 3 ] + ['\x01 ' , '' , '' ])
87
- rawhash = utils .sha3 (rlpdata )
88
- v = self .v - 10
89
- elif self .v in (41 , 42 ):
90
- rlpdata = rlp .encode (rlp .infer_sedes (self ).serialize (self )[:- 3 ] + ['\x03 ' , '' , '' ])
91
- rawhash = utils .sha3 (rlpdata )
92
- v = self .v - 14
93
- pub = ecrecover_to_pub (rawhash , v , self .r , self .s )
83
+ self .network_id = None
84
+ vee = self .v
85
+ sighash = utils .sha3 (rlp .encode (self , UnsignedTransaction ))
86
+ elif self .v >= 37 :
87
+ self .network_id = ((self .v - 1 ) // 2 ) - 17
88
+ vee = self .v - self .network_id * 2 - 8
89
+ assert vee in (27 , 28 )
90
+ rlpdata = rlp .encode (rlp .infer_sedes (self ).serialize (self )[:- 3 ] + [self .network_id , '' , '' ])
91
+ sighash = utils .sha3 (rlpdata )
92
+ else :
93
+ raise InvalidTransaction ("Invalid V value" )
94
+ if self .r >= N or self .s >= N or self .r == 0 or self .s == 0 :
95
+ raise InvalidTransaction ("Invalid signature values!" )
96
+ pub = ecrecover_to_pub (sighash , vee , self .r , self .s )
94
97
if pub == b"\x00 " * 64 :
95
98
raise InvalidTransaction ("Invalid signature (zero privkey cannot sign)" )
96
99
self ._sender = utils .sha3 (pub )[- 20 :]
97
- assert self .sender == self ._sender
98
- else :
99
- self ._sender = 0
100
100
return self ._sender
101
101
102
102
@sender .setter
0 commit comments