17
17
use std:: { marker:: PhantomData , sync:: Arc } ;
18
18
use std:: collections:: BTreeMap ;
19
19
use ethereum:: { Block as EthereumBlock , Transaction as EthereumTransaction } ;
20
- use ethereum_types:: { H160 , H256 , H64 , U256 , U64 } ;
20
+ use ethereum_types:: { H160 , H256 , H64 , U256 , U64 , H512 } ;
21
21
use jsonrpc_core:: { BoxFuture , Result , ErrorCode , Error , futures:: future:: { self , Future } } ;
22
22
use futures:: future:: TryFutureExt ;
23
23
use sp_runtime:: traits:: { Block as BlockT , Header as _, UniqueSaturatedInto , Zero , One , Saturating } ;
@@ -138,6 +138,20 @@ fn transaction_build(
138
138
block : EthereumBlock ,
139
139
status : TransactionStatus
140
140
) -> Transaction {
141
+ let mut sig = [ 0u8 ; 65 ] ;
142
+ let mut msg = [ 0u8 ; 32 ] ;
143
+ sig[ 0 ..32 ] . copy_from_slice ( & transaction. signature . r ( ) [ ..] ) ;
144
+ sig[ 32 ..64 ] . copy_from_slice ( & transaction. signature . s ( ) [ ..] ) ;
145
+ sig[ 64 ] = transaction. signature . standard_v ( ) ;
146
+ msg. copy_from_slice ( & transaction. message_hash (
147
+ transaction. signature . chain_id ( ) . map ( u64:: from)
148
+ ) [ ..] ) ;
149
+
150
+ let pubkey = match sp_io:: crypto:: secp256k1_ecdsa_recover ( & sig, & msg) {
151
+ Ok ( p) => Some ( H512 :: from ( p) ) ,
152
+ Err ( _e) => None ,
153
+ } ;
154
+
141
155
Transaction {
142
156
hash : H256 :: from_slice (
143
157
Keccak256 :: digest ( & rlp:: encode ( & transaction) ) . as_slice ( )
@@ -160,7 +174,7 @@ fn transaction_build(
160
174
input : Bytes ( transaction. clone ( ) . input ) ,
161
175
creates : status. contract_address ,
162
176
raw : Bytes ( rlp:: encode ( & transaction) ) ,
163
- public_key : None , // TODO
177
+ public_key : pubkey ,
164
178
chain_id : transaction. signature . chain_id ( ) . map ( U64 :: from) ,
165
179
standard_v : U256 :: from ( transaction. signature . standard_v ( ) ) ,
166
180
v : U256 :: from ( transaction. signature . v ( ) ) ,
0 commit comments