1
- use bitcoin:: blockdata:: transaction:: { TxIn , TxOut } ;
2
- use bitcoin_hashes:: sha256d:: Hash as Sha256dHash ;
1
+ use bitcoin:: blockdata:: transaction:: TxOut ;
3
2
4
3
use std:: cmp:: Ordering ;
5
4
6
- pub fn sort_outputs < T > ( outputs : & mut Vec < ( TxOut , T ) > ) {
5
+ pub fn sort_outputs < T , C : Fn ( & T , & T ) -> Ordering > ( outputs : & mut Vec < ( TxOut , T ) > , tie_breaker : C ) {
7
6
outputs. sort_unstable_by ( |a, b| {
8
- a. 0 . value . cmp ( & b. 0 . value ) . then (
9
- a. 0 . script_pubkey [ ..] . cmp ( & b. 0 . script_pubkey [ ..] )
10
- )
11
- } ) ;
12
- }
13
-
14
- fn cmp ( a : & Sha256dHash , b : & Sha256dHash ) -> Ordering {
15
- use bitcoin_hashes:: Hash ;
16
-
17
- let av = a. into_inner ( ) ;
18
- let bv = b. into_inner ( ) ;
19
- for i in ( 0 ..32 ) . rev ( ) {
20
- let cmp = av[ i] . cmp ( & bv[ i] ) ;
21
- if cmp != Ordering :: Equal {
22
- return cmp;
23
- }
24
- }
25
- Ordering :: Equal
26
- }
27
-
28
- pub fn sort_inputs < T > ( inputs : & mut Vec < ( TxIn , T ) > ) {
29
- inputs. sort_unstable_by ( |a, b| {
30
- cmp ( & a. 0 . previous_output . txid , & b. 0 . previous_output . txid ) . then (
31
- a. 0 . previous_output . vout . cmp ( & b. 0 . previous_output . vout ) )
7
+ a. 0 . value . cmp ( & b. 0 . value ) . then_with ( || {
8
+ a. 0 . script_pubkey [ ..] . cmp ( & b. 0 . script_pubkey [ ..] ) . then_with ( || {
9
+ tie_breaker ( & a. 1 , & b. 1 )
10
+ } )
11
+ } )
32
12
} ) ;
33
13
}
34
14
@@ -37,9 +17,7 @@ mod tests {
37
17
use super :: * ;
38
18
39
19
use bitcoin:: blockdata:: script:: { Script , Builder } ;
40
- use bitcoin:: blockdata:: transaction:: { TxOut , OutPoint } ;
41
- use bitcoin_hashes:: sha256d:: Hash as Sha256dHash ;
42
- use bitcoin_hashes:: hex:: FromHex ;
20
+ use bitcoin:: blockdata:: transaction:: TxOut ;
43
21
44
22
use hex:: decode;
45
23
@@ -58,7 +36,7 @@ mod tests {
58
36
let txout2_ = txout2. clone ( ) ;
59
37
60
38
let mut outputs = vec ! [ ( txout1, "ignore" ) , ( txout2, "ignore" ) ] ;
61
- sort_outputs ( & mut outputs) ;
39
+ sort_outputs ( & mut outputs, |_ , _| { unreachable ! ( ) ; } ) ;
62
40
63
41
assert_eq ! (
64
42
& outputs,
@@ -81,7 +59,7 @@ mod tests {
81
59
let txout2_ = txout2. clone ( ) ;
82
60
83
61
let mut outputs = vec ! [ ( txout1, "ignore" ) , ( txout2, "ignore" ) ] ;
84
- sort_outputs ( & mut outputs) ;
62
+ sort_outputs ( & mut outputs, |_ , _| { unreachable ! ( ) ; } ) ;
85
63
86
64
assert_eq ! (
87
65
& outputs,
@@ -105,7 +83,7 @@ mod tests {
105
83
let txout2_ = txout2. clone ( ) ;
106
84
107
85
let mut outputs = vec ! [ ( txout1, "ignore" ) , ( txout2, "ignore" ) ] ;
108
- sort_outputs ( & mut outputs) ;
86
+ sort_outputs ( & mut outputs, |_ , _| { unreachable ! ( ) ; } ) ;
109
87
110
88
assert_eq ! ( & outputs, & vec![ ( txout1_, "ignore" ) , ( txout2_, "ignore" ) ] ) ;
111
89
}
@@ -131,7 +109,7 @@ mod tests {
131
109
outputs. reverse( ) ; // prep it
132
110
133
111
// actually do the work!
134
- sort_outputs( & mut outputs) ;
112
+ sort_outputs( & mut outputs, |_ , _| { unreachable! ( ) ; } ) ;
135
113
136
114
assert_eq!( outputs, expected) ;
137
115
}
@@ -151,63 +129,4 @@ mod tests {
151
129
bip69_txout_test_1: TXOUT1 . to_vec( ) ,
152
130
bip69_txout_test_2: TXOUT2 . to_vec( ) ,
153
131
}
154
-
155
- macro_rules! bip_txin_tests {
156
- ( $( $name: ident: $value: expr, ) * ) => {
157
- $(
158
- #[ test]
159
- fn $name( ) {
160
- let expected_raw: Vec <( & str , u32 ) > = $value;
161
- let expected: Vec <( TxIn , & str ) > = expected_raw. iter( ) . map(
162
- |txin_raw| TxIn {
163
- previous_output: OutPoint {
164
- txid: Sha256dHash :: from_hex( txin_raw. 0 ) . unwrap( ) ,
165
- vout: txin_raw. 1 ,
166
- } ,
167
- script_sig: Script :: new( ) ,
168
- sequence: 0 ,
169
- witness: vec![ ]
170
- }
171
- ) . map( |txin| ( txin, "ignore" ) ) . collect( ) ;
172
-
173
- let mut inputs = expected. clone( ) ;
174
- inputs. reverse( ) ;
175
-
176
- sort_inputs( & mut inputs) ;
177
-
178
- assert_eq!( expected, inputs) ;
179
- }
180
- ) *
181
- }
182
- }
183
-
184
- const TXIN1_BIP69 : [ ( & str , u32 ) ; 17 ] = [
185
- ( "0e53ec5dfb2cb8a71fec32dc9a634a35b7e24799295ddd5278217822e0b31f57" , 0 ) ,
186
- ( "26aa6e6d8b9e49bb0630aac301db6757c02e3619feb4ee0eea81eb1672947024" , 1 ) ,
187
- ( "28e0fdd185542f2c6ea19030b0796051e7772b6026dd5ddccd7a2f93b73e6fc2" , 0 ) ,
188
- ( "381de9b9ae1a94d9c17f6a08ef9d341a5ce29e2e60c36a52d333ff6203e58d5d" , 1 ) ,
189
- ( "3b8b2f8efceb60ba78ca8bba206a137f14cb5ea4035e761ee204302d46b98de2" , 0 ) ,
190
- ( "402b2c02411720bf409eff60d05adad684f135838962823f3614cc657dd7bc0a" , 1 ) ,
191
- ( "54ffff182965ed0957dba1239c27164ace5a73c9b62a660c74b7b7f15ff61e7a" , 1 ) ,
192
- ( "643e5f4e66373a57251fb173151e838ccd27d279aca882997e005016bb53d5aa" , 0 ) ,
193
- ( "6c1d56f31b2de4bfc6aaea28396b333102b1f600da9c6d6149e96ca43f1102b1" , 1 ) ,
194
- ( "7a1de137cbafb5c70405455c49c5104ca3057a1f1243e6563bb9245c9c88c191" , 0 ) ,
195
- ( "7d037ceb2ee0dc03e82f17be7935d238b35d1deabf953a892a4507bfbeeb3ba4" , 1 ) ,
196
- ( "a5e899dddb28776ea9ddac0a502316d53a4a3fca607c72f66c470e0412e34086" , 0 ) ,
197
- ( "b4112b8f900a7ca0c8b0e7c4dfad35c6be5f6be46b3458974988e1cdb2fa61b8" , 0 ) ,
198
- ( "bafd65e3c7f3f9fdfdc1ddb026131b278c3be1af90a4a6ffa78c4658f9ec0c85" , 0 ) ,
199
- ( "de0411a1e97484a2804ff1dbde260ac19de841bebad1880c782941aca883b4e9" , 1 ) ,
200
- ( "f0a130a84912d03c1d284974f563c5949ac13f8342b8112edff52971599e6a45" , 0 ) ,
201
- ( "f320832a9d2e2452af63154bc687493484a0e7745ebd3aaf9ca19eb80834ad60" , 0 ) ,
202
- ] ;
203
-
204
-
205
- const TXIN2_BIP69 : [ ( & str , u32 ) ; 2 ] = [
206
- ( "35288d269cee1941eaebb2ea85e32b42cdb2b04284a56d8b14dcc3f5c65d6055" , 0 ) ,
207
- ( "35288d269cee1941eaebb2ea85e32b42cdb2b04284a56d8b14dcc3f5c65d6055" , 1 ) ,
208
- ] ;
209
- bip_txin_tests ! {
210
- bip69_txin_test_1: TXIN1_BIP69 . to_vec( ) ,
211
- bip69_txin_test_2: TXIN2_BIP69 . to_vec( ) ,
212
- }
213
132
}
0 commit comments