1
+ // Copyright 2015-2017 Parity Technologies (UK) Ltd.
2
+ // This file is part of Parity.
3
+
4
+ // Parity is free software: you can redistribute it and/or modify
5
+ // it under the terms of the GNU General Public License as published by
6
+ // the Free Software Foundation, either version 3 of the License, or
7
+ // (at your option) any later version.
8
+
9
+ // Parity is distributed in the hope that it will be useful,
10
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ // GNU General Public License for more details.
13
+
14
+ // You should have received a copy of the GNU General Public License
15
+ // along with Parity. If not, see <http://www.gnu.org/licenses/>.
16
+
17
+ use std:: sync:: Arc ;
18
+ use hash:: keccak;
19
+ use io:: { IoHandler , IoChannel } ;
20
+ use ethcore:: client:: { BlockChainClient , BlockId , ClientIoMessage } ;
21
+ use ethcore:: spec:: Spec ;
22
+ use ethcore:: miner:: MinerService ;
23
+ use ethcore:: CreateContractAddress ;
24
+ use transaction:: { Transaction , Action } ;
25
+ use ethcore:: executive:: { contract_address} ;
26
+ use ethcore:: test_helpers:: { push_block_with_transactions} ;
27
+ use ethcore_private_tx:: { Provider , ProviderConfig , NoopEncryptor } ;
28
+ use ethcore:: account_provider:: AccountProvider ;
29
+ use ethkey:: { KeyPair } ;
30
+ use tests:: helpers:: { TestNet , TestIoHandler } ;
31
+ use rustc_hex:: FromHex ;
32
+ use SyncConfig ;
33
+
34
+ fn seal_spec ( ) -> Spec {
35
+ let spec_data = include_str ! ( "../res/private_spec.json" ) ;
36
+ Spec :: load ( & :: std:: env:: temp_dir ( ) , spec_data. as_bytes ( ) ) . unwrap ( )
37
+ }
38
+
39
+ #[ test]
40
+ fn send_private_transaction ( ) {
41
+ // Setup two clients
42
+ let s0 = KeyPair :: from_secret_slice ( & keccak ( "1" ) ) . unwrap ( ) ;
43
+ let s1 = KeyPair :: from_secret_slice ( & keccak ( "0" ) ) . unwrap ( ) ;
44
+ let ap = Arc :: new ( AccountProvider :: transient_provider ( ) ) ;
45
+ ap. insert_account ( s0. secret ( ) . clone ( ) , "" ) . unwrap ( ) ;
46
+ ap. insert_account ( s1. secret ( ) . clone ( ) , "" ) . unwrap ( ) ;
47
+
48
+ let mut net = TestNet :: with_spec_and_accounts ( 2 , SyncConfig :: default ( ) , seal_spec, Some ( ap. clone ( ) ) ) ;
49
+ let client0 = net. peer ( 0 ) . chain . clone ( ) ;
50
+ let client1 = net. peer ( 1 ) . chain . clone ( ) ;
51
+ let io_handler0: Arc < IoHandler < ClientIoMessage > > = Arc :: new ( TestIoHandler :: new ( net. peer ( 0 ) . chain . clone ( ) ) ) ;
52
+ let io_handler1: Arc < IoHandler < ClientIoMessage > > = Arc :: new ( TestIoHandler :: new ( net. peer ( 1 ) . chain . clone ( ) ) ) ;
53
+
54
+ net. peer ( 0 ) . miner . set_author ( s0. address ( ) , Some ( "" . into ( ) ) ) . unwrap ( ) ;
55
+ net. peer ( 1 ) . miner . set_author ( s1. address ( ) , Some ( "" . to_owned ( ) ) ) . unwrap ( ) ;
56
+ net. peer ( 0 ) . chain . engine ( ) . register_client ( Arc :: downgrade ( & net. peer ( 0 ) . chain ) as _ ) ;
57
+ net. peer ( 1 ) . chain . engine ( ) . register_client ( Arc :: downgrade ( & net. peer ( 1 ) . chain ) as _ ) ;
58
+ net. peer ( 0 ) . chain . set_io_channel ( IoChannel :: to_handler ( Arc :: downgrade ( & io_handler0) ) ) ;
59
+ net. peer ( 1 ) . chain . set_io_channel ( IoChannel :: to_handler ( Arc :: downgrade ( & io_handler1) ) ) ;
60
+
61
+ let ( address, _) = contract_address ( CreateContractAddress :: FromSenderAndNonce , & s0. address ( ) , & 0 . into ( ) , & [ ] ) ;
62
+ let chain_id = client0. signing_chain_id ( ) ;
63
+
64
+ // Exhange statuses
65
+ net. sync ( ) ;
66
+
67
+ // Setup private providers
68
+ let validator_config = ProviderConfig {
69
+ validator_accounts : vec ! [ s1. address( ) ] ,
70
+ signer_account : None ,
71
+ passwords : vec ! [ "" . into( ) ] ,
72
+ } ;
73
+
74
+ let signer_config = ProviderConfig {
75
+ validator_accounts : Vec :: new ( ) ,
76
+ signer_account : Some ( s0. address ( ) ) ,
77
+ passwords : vec ! [ "" . into( ) ] ,
78
+ } ;
79
+
80
+ let pm0 = Arc :: new ( Provider :: new (
81
+ client0. clone ( ) ,
82
+ net. peer ( 0 ) . miner . clone ( ) ,
83
+ ap. clone ( ) ,
84
+ Box :: new ( NoopEncryptor :: default ( ) ) ,
85
+ signer_config,
86
+ IoChannel :: to_handler ( Arc :: downgrade ( & io_handler0) ) ,
87
+ ) . unwrap ( ) ) ;
88
+ pm0. add_notify ( net. peers [ 0 ] . clone ( ) ) ;
89
+
90
+ let pm1 = Arc :: new ( Provider :: new (
91
+ client1. clone ( ) ,
92
+ net. peer ( 1 ) . miner . clone ( ) ,
93
+ ap. clone ( ) ,
94
+ Box :: new ( NoopEncryptor :: default ( ) ) ,
95
+ validator_config,
96
+ IoChannel :: to_handler ( Arc :: downgrade ( & io_handler1) ) ,
97
+ ) . unwrap ( ) ) ;
98
+ pm1. add_notify ( net. peers [ 1 ] . clone ( ) ) ;
99
+
100
+ // Create and deploy contract
101
+ let private_contract_test = "6060604052341561000f57600080fd5b60d88061001d6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630c55699c146046578063bc64b76d14607457600080fd5b3415605057600080fd5b60566098565b60405180826000191660001916815260200191505060405180910390f35b3415607e57600080fd5b6096600480803560001916906020019091905050609e565b005b60005481565b8060008160001916905550505600a165627a7a723058206acbdf4b15ca4c2d43e1b1879b830451a34f1e9d02ff1f2f394d8d857e79d2080029" . from_hex ( ) . unwrap ( ) ;
102
+ let mut private_create_tx = Transaction :: default ( ) ;
103
+ private_create_tx. action = Action :: Create ;
104
+ private_create_tx. data = private_contract_test;
105
+ private_create_tx. gas = 200000 . into ( ) ;
106
+ let private_create_tx_signed = private_create_tx. sign ( & s0. secret ( ) , None ) ;
107
+ let validators = vec ! [ s1. address( ) ] ;
108
+ let ( public_tx, _) = pm0. public_creation_transaction ( BlockId :: Latest , & private_create_tx_signed, & validators, 0 . into ( ) ) . unwrap ( ) ;
109
+ let public_tx = public_tx. sign ( & s0. secret ( ) , chain_id) ;
110
+
111
+ let public_tx_copy = public_tx. clone ( ) ;
112
+ push_block_with_transactions ( & client0, & [ public_tx] ) ;
113
+ push_block_with_transactions ( & client1, & [ public_tx_copy] ) ;
114
+
115
+ net. sync ( ) ;
116
+
117
+ //Create private transaction for modifying state
118
+ let mut private_tx = Transaction :: default ( ) ;
119
+ private_tx. action = Action :: Call ( address. clone ( ) ) ;
120
+ private_tx. data = "bc64b76d2a00000000000000000000000000000000000000000000000000000000000000" . from_hex ( ) . unwrap ( ) ; //setX(42)
121
+ private_tx. gas = 120000 . into ( ) ;
122
+ private_tx. nonce = 1 . into ( ) ;
123
+ let private_tx = private_tx. sign ( & s0. secret ( ) , None ) ;
124
+ assert ! ( pm0. create_private_transaction( private_tx) . is_ok( ) ) ;
125
+
126
+ //send private transaction message to validator
127
+ net. sync ( ) ;
128
+
129
+ let validator_handler = net. peer ( 1 ) . private_tx_handler . clone ( ) ;
130
+ let received_private_transactions = validator_handler. txs . lock ( ) . clone ( ) ;
131
+ assert_eq ! ( received_private_transactions. len( ) , 1 ) ;
132
+
133
+ //process received private transaction message
134
+ let private_transaction = received_private_transactions[ 0 ] . clone ( ) ;
135
+ assert ! ( pm1. import_private_transaction( & private_transaction) . is_ok( ) ) ;
136
+ assert ! ( pm1. on_private_transaction_queued( ) . is_ok( ) ) ;
137
+
138
+ //send signed response
139
+ net. sync ( ) ;
140
+
141
+ let sender_handler = net. peer ( 0 ) . private_tx_handler . clone ( ) ;
142
+ let received_signed_private_transactions = sender_handler. signed_txs . lock ( ) . clone ( ) ;
143
+ assert_eq ! ( received_signed_private_transactions. len( ) , 1 ) ;
144
+
145
+ //process signed response
146
+ let signed_private_transaction = received_signed_private_transactions[ 0 ] . clone ( ) ;
147
+ assert ! ( pm0. import_signed_private_transaction( & signed_private_transaction) . is_ok( ) ) ;
148
+ let local_transactions = net. peer ( 0 ) . miner . local_transactions ( ) ;
149
+ assert_eq ! ( local_transactions. len( ) , 1 ) ;
150
+ }
0 commit comments