@@ -786,10 +786,14 @@ where
786
786
}
787
787
Concrete :: And ( ref subs) => {
788
788
assert_eq ! ( subs. len( ) , 2 , "and takes 2 args" ) ;
789
- let mut left = best_compilations ( policy_cache, & subs[ 0 ] , sat_prob, dissat_prob) ?;
790
- let mut right = best_compilations ( policy_cache, & subs[ 1 ] , sat_prob, dissat_prob) ?;
791
- let mut q_zero_right = best_compilations ( policy_cache, & subs[ 1 ] , sat_prob, None ) ?;
792
- let mut q_zero_left = best_compilations ( policy_cache, & subs[ 0 ] , sat_prob, None ) ?;
789
+ let mut left =
790
+ best_compilations ( policy_cache, subs[ 0 ] . as_ref ( ) , sat_prob, dissat_prob) ?;
791
+ let mut right =
792
+ best_compilations ( policy_cache, subs[ 1 ] . as_ref ( ) , sat_prob, dissat_prob) ?;
793
+ let mut q_zero_right =
794
+ best_compilations ( policy_cache, subs[ 1 ] . as_ref ( ) , sat_prob, None ) ?;
795
+ let mut q_zero_left =
796
+ best_compilations ( policy_cache, subs[ 0 ] . as_ref ( ) , sat_prob, None ) ?;
793
797
794
798
compile_binary ! ( & mut left, & mut right, [ 1.0 , 1.0 ] , Terminal :: AndB ) ;
795
799
compile_binary ! ( & mut right, & mut left, [ 1.0 , 1.0 ] , Terminal :: AndB ) ;
@@ -813,48 +817,56 @@ where
813
817
let rw = subs[ 1 ] . 0 as f64 / total;
814
818
815
819
//and-or
816
- if let ( Concrete :: And ( x) , _) = ( & subs[ 0 ] . 1 , & subs[ 1 ] . 1 ) {
820
+ if let ( Concrete :: And ( x) , _) = ( subs[ 0 ] . 1 . as_ref ( ) , subs[ 1 ] . 1 . as_ref ( ) ) {
817
821
let mut a1 = best_compilations (
818
822
policy_cache,
819
- & x[ 0 ] ,
823
+ x[ 0 ] . as_ref ( ) ,
820
824
lw * sat_prob,
821
825
Some ( dissat_prob. unwrap_or ( 0 as f64 ) + rw * sat_prob) ,
822
826
) ?;
823
- let mut a2 = best_compilations ( policy_cache, & x[ 0 ] , lw * sat_prob, None ) ?;
827
+ let mut a2 = best_compilations ( policy_cache, x[ 0 ] . as_ref ( ) , lw * sat_prob, None ) ?;
824
828
825
829
let mut b1 = best_compilations (
826
830
policy_cache,
827
- & x[ 1 ] ,
831
+ x[ 1 ] . as_ref ( ) ,
828
832
lw * sat_prob,
829
833
Some ( dissat_prob. unwrap_or ( 0 as f64 ) + rw * sat_prob) ,
830
834
) ?;
831
- let mut b2 = best_compilations ( policy_cache, & x[ 1 ] , lw * sat_prob, None ) ?;
835
+ let mut b2 = best_compilations ( policy_cache, x[ 1 ] . as_ref ( ) , lw * sat_prob, None ) ?;
832
836
833
- let mut c =
834
- best_compilations ( policy_cache, & subs[ 1 ] . 1 , rw * sat_prob, dissat_prob) ?;
837
+ let mut c = best_compilations (
838
+ policy_cache,
839
+ subs[ 1 ] . 1 . as_ref ( ) ,
840
+ rw * sat_prob,
841
+ dissat_prob,
842
+ ) ?;
835
843
836
844
compile_tern ! ( & mut a1, & mut b2, & mut c, [ lw, rw] ) ;
837
845
compile_tern ! ( & mut b1, & mut a2, & mut c, [ lw, rw] ) ;
838
846
} ;
839
- if let ( _, Concrete :: And ( x) ) = ( & subs[ 0 ] . 1 , & subs[ 1 ] . 1 ) {
847
+ if let ( _, Concrete :: And ( x) ) = ( & subs[ 0 ] . 1 . as_ref ( ) , subs[ 1 ] . 1 . as_ref ( ) ) {
840
848
let mut a1 = best_compilations (
841
849
policy_cache,
842
- & x[ 0 ] ,
850
+ x[ 0 ] . as_ref ( ) ,
843
851
rw * sat_prob,
844
852
Some ( dissat_prob. unwrap_or ( 0 as f64 ) + lw * sat_prob) ,
845
853
) ?;
846
- let mut a2 = best_compilations ( policy_cache, & x[ 0 ] , rw * sat_prob, None ) ?;
854
+ let mut a2 = best_compilations ( policy_cache, x[ 0 ] . as_ref ( ) , rw * sat_prob, None ) ?;
847
855
848
856
let mut b1 = best_compilations (
849
857
policy_cache,
850
- & x[ 1 ] ,
858
+ x[ 1 ] . as_ref ( ) ,
851
859
rw * sat_prob,
852
860
Some ( dissat_prob. unwrap_or ( 0 as f64 ) + lw * sat_prob) ,
853
861
) ?;
854
- let mut b2 = best_compilations ( policy_cache, & x[ 1 ] , rw * sat_prob, None ) ?;
862
+ let mut b2 = best_compilations ( policy_cache, x[ 1 ] . as_ref ( ) , rw * sat_prob, None ) ?;
855
863
856
- let mut c =
857
- best_compilations ( policy_cache, & subs[ 0 ] . 1 , lw * sat_prob, dissat_prob) ?;
864
+ let mut c = best_compilations (
865
+ policy_cache,
866
+ subs[ 0 ] . 1 . as_ref ( ) ,
867
+ lw * sat_prob,
868
+ dissat_prob,
869
+ ) ?;
858
870
859
871
compile_tern ! ( & mut a1, & mut b2, & mut c, [ rw, lw] ) ;
860
872
compile_tern ! ( & mut b1, & mut a2, & mut c, [ rw, lw] ) ;
@@ -873,12 +885,22 @@ where
873
885
let mut r_comp = vec ! [ ] ;
874
886
875
887
for dissat_prob in dissat_probs ( rw) . iter ( ) {
876
- let l = best_compilations ( policy_cache, & subs[ 0 ] . 1 , lw * sat_prob, * dissat_prob) ?;
888
+ let l = best_compilations (
889
+ policy_cache,
890
+ subs[ 0 ] . 1 . as_ref ( ) ,
891
+ lw * sat_prob,
892
+ * dissat_prob,
893
+ ) ?;
877
894
l_comp. push ( l) ;
878
895
}
879
896
880
897
for dissat_prob in dissat_probs ( lw) . iter ( ) {
881
- let r = best_compilations ( policy_cache, & subs[ 1 ] . 1 , rw * sat_prob, * dissat_prob) ?;
898
+ let r = best_compilations (
899
+ policy_cache,
900
+ subs[ 1 ] . 1 . as_ref ( ) ,
901
+ rw * sat_prob,
902
+ * dissat_prob,
903
+ ) ?;
882
904
r_comp. push ( r) ;
883
905
}
884
906
@@ -913,8 +935,8 @@ where
913
935
let sp = sat_prob * k_over_n;
914
936
//Expressions must be dissatisfiable
915
937
let dp = Some ( dissat_prob. unwrap_or ( 0 as f64 ) + ( 1.0 - k_over_n) * sat_prob) ;
916
- let be = best ( types:: Base :: B , policy_cache, ast, sp, dp) ?;
917
- let bw = best ( types:: Base :: W , policy_cache, ast, sp, dp) ?;
938
+ let be = best ( types:: Base :: B , policy_cache, ast. as_ref ( ) , sp, dp) ?;
939
+ let bw = best ( types:: Base :: W , policy_cache, ast. as_ref ( ) , sp, dp) ?;
918
940
919
941
let diff = be. cost_1d ( sp, dp) - bw. cost_1d ( sp, dp) ;
920
942
best_es. push ( ( be. comp_ext_data , be) ) ;
@@ -947,7 +969,7 @@ where
947
969
let key_vec: Vec < Pk > = subs
948
970
. iter ( )
949
971
. filter_map ( |s| {
950
- if let Concrete :: Key ( ref pk) = * s {
972
+ if let Concrete :: Key ( ref pk) = s . as_ref ( ) {
951
973
Some ( pk. clone ( ) )
952
974
} else {
953
975
None
@@ -967,9 +989,10 @@ where
967
989
_ if k == subs. len ( ) => {
968
990
let mut it = subs. iter ( ) ;
969
991
let mut policy = it. next ( ) . expect ( "No sub policy in thresh() ?" ) . clone ( ) ;
970
- policy = it. fold ( policy, |acc, pol| Concrete :: And ( vec ! [ acc, pol. clone( ) ] ) ) ;
992
+ policy =
993
+ it. fold ( policy, |acc, pol| Concrete :: And ( vec ! [ acc, pol. clone( ) ] ) . into ( ) ) ;
971
994
972
- ret = best_compilations ( policy_cache, & policy, sat_prob, dissat_prob) ?;
995
+ ret = best_compilations ( policy_cache, policy. as_ref ( ) , sat_prob, dissat_prob) ?;
973
996
}
974
997
_ => { }
975
998
}
@@ -1178,8 +1201,11 @@ mod tests {
1178
1201
fn compile_timelocks ( ) {
1179
1202
// artificially create a policy that is problematic and try to compile
1180
1203
let pol: SPolicy = Concrete :: And ( vec ! [
1181
- Concrete :: Key ( "A" . to_string( ) ) ,
1182
- Concrete :: And ( vec![ Concrete :: after( 9 ) , Concrete :: after( 1000_000_000 ) ] ) ,
1204
+ Arc :: new( Concrete :: Key ( "A" . to_string( ) ) ) ,
1205
+ Arc :: new( Concrete :: And ( vec![
1206
+ Arc :: new( Concrete :: after( 9 ) ) ,
1207
+ Arc :: new( Concrete :: after( 1000_000_000 ) ) ,
1208
+ ] ) ) ,
1183
1209
] ) ;
1184
1210
assert ! ( pol. compile:: <Segwitv0 >( ) . is_err( ) ) ;
1185
1211
@@ -1273,13 +1299,22 @@ mod tests {
1273
1299
1274
1300
// Liquid policy
1275
1301
let policy: BPolicy = Concrete :: Or ( vec ! [
1276
- ( 127 , Concrete :: Threshold ( 3 , key_pol[ 0 ..5 ] . to_owned( ) ) ) ,
1302
+ (
1303
+ 127 ,
1304
+ Arc :: new( Concrete :: Threshold (
1305
+ 3 ,
1306
+ key_pol[ 0 ..5 ] . iter( ) . map( |p| ( p. clone( ) ) . into( ) ) . collect( ) ,
1307
+ ) ) ,
1308
+ ) ,
1277
1309
(
1278
1310
1 ,
1279
- Concrete :: And ( vec![
1280
- Concrete :: Older ( Sequence :: from_height( 10000 ) ) ,
1281
- Concrete :: Threshold ( 2 , key_pol[ 5 ..8 ] . to_owned( ) ) ,
1282
- ] ) ,
1311
+ Arc :: new( Concrete :: And ( vec![
1312
+ Arc :: new( Concrete :: Older ( Sequence :: from_height( 10000 ) ) ) ,
1313
+ Arc :: new( Concrete :: Threshold (
1314
+ 2 ,
1315
+ key_pol[ 5 ..8 ] . iter( ) . map( |p| ( p. clone( ) ) . into( ) ) . collect( ) ,
1316
+ ) ) ,
1317
+ ] ) ) ,
1283
1318
) ,
1284
1319
] ) ;
1285
1320
@@ -1391,8 +1426,10 @@ mod tests {
1391
1426
// and to a ms thresh otherwise.
1392
1427
// k = 1 (or 2) does not compile, see https://github.com/rust-bitcoin/rust-miniscript/issues/114
1393
1428
for k in & [ 10 , 15 , 21 ] {
1394
- let pubkeys: Vec < Concrete < bitcoin:: PublicKey > > =
1395
- keys. iter ( ) . map ( |pubkey| Concrete :: Key ( * pubkey) ) . collect ( ) ;
1429
+ let pubkeys: Vec < Arc < Concrete < bitcoin:: PublicKey > > > = keys
1430
+ . iter ( )
1431
+ . map ( |pubkey| Arc :: new ( Concrete :: Key ( * pubkey) ) )
1432
+ . collect ( ) ;
1396
1433
let big_thresh = Concrete :: Threshold ( * k, pubkeys) ;
1397
1434
let big_thresh_ms: SegwitMiniScript = big_thresh. compile ( ) . unwrap ( ) ;
1398
1435
if * k == 21 {
@@ -1419,18 +1456,18 @@ mod tests {
1419
1456
// or(thresh(52, [pubkey; 52]), thresh(52, [pubkey; 52])) results in a 3642-bytes long
1420
1457
// witness script with only 54 stack elements
1421
1458
let ( keys, _) = pubkeys_and_a_sig ( 104 ) ;
1422
- let keys_a: Vec < Concrete < bitcoin:: PublicKey > > = keys[ ..keys. len ( ) / 2 ]
1459
+ let keys_a: Vec < Arc < Concrete < bitcoin:: PublicKey > > > = keys[ ..keys. len ( ) / 2 ]
1423
1460
. iter ( )
1424
- . map ( |pubkey| Concrete :: Key ( * pubkey) )
1461
+ . map ( |pubkey| Arc :: new ( Concrete :: Key ( * pubkey) ) )
1425
1462
. collect ( ) ;
1426
- let keys_b: Vec < Concrete < bitcoin:: PublicKey > > = keys[ keys. len ( ) / 2 ..]
1463
+ let keys_b: Vec < Arc < Concrete < bitcoin:: PublicKey > > > = keys[ keys. len ( ) / 2 ..]
1427
1464
. iter ( )
1428
- . map ( |pubkey| Concrete :: Key ( * pubkey) )
1465
+ . map ( |pubkey| Arc :: new ( Concrete :: Key ( * pubkey) ) )
1429
1466
. collect ( ) ;
1430
1467
1431
1468
let thresh_res: Result < SegwitMiniScript , _ > = Concrete :: Or ( vec ! [
1432
- ( 1 , Concrete :: Threshold ( keys_a. len( ) , keys_a) ) ,
1433
- ( 1 , Concrete :: Threshold ( keys_b. len( ) , keys_b) ) ,
1469
+ ( 1 , Arc :: new ( Concrete :: Threshold ( keys_a. len( ) , keys_a) ) ) ,
1470
+ ( 1 , Arc :: new ( Concrete :: Threshold ( keys_b. len( ) , keys_b) ) ) ,
1434
1471
] )
1435
1472
. compile ( ) ;
1436
1473
let script_size = thresh_res. clone ( ) . and_then ( |m| Ok ( m. script_size ( ) ) ) ;
@@ -1443,8 +1480,10 @@ mod tests {
1443
1480
1444
1481
// Hit the maximum witness stack elements limit
1445
1482
let ( keys, _) = pubkeys_and_a_sig ( 100 ) ;
1446
- let keys: Vec < Concrete < bitcoin:: PublicKey > > =
1447
- keys. iter ( ) . map ( |pubkey| Concrete :: Key ( * pubkey) ) . collect ( ) ;
1483
+ let keys: Vec < Arc < Concrete < bitcoin:: PublicKey > > > = keys
1484
+ . iter ( )
1485
+ . map ( |pubkey| Arc :: new ( Concrete :: Key ( * pubkey) ) )
1486
+ . collect ( ) ;
1448
1487
let thresh_res: Result < SegwitMiniScript , _ > =
1449
1488
Concrete :: Threshold ( keys. len ( ) , keys) . compile ( ) ;
1450
1489
let n_elements = thresh_res
@@ -1462,8 +1501,10 @@ mod tests {
1462
1501
fn shared_limits ( ) {
1463
1502
// Test the maximum number of OPs with a 67-of-68 multisig
1464
1503
let ( keys, _) = pubkeys_and_a_sig ( 68 ) ;
1465
- let keys: Vec < Concrete < bitcoin:: PublicKey > > =
1466
- keys. iter ( ) . map ( |pubkey| Concrete :: Key ( * pubkey) ) . collect ( ) ;
1504
+ let keys: Vec < Arc < Concrete < bitcoin:: PublicKey > > > = keys
1505
+ . iter ( )
1506
+ . map ( |pubkey| Arc :: new ( Concrete :: Key ( * pubkey) ) )
1507
+ . collect ( ) ;
1467
1508
let thresh_res: Result < SegwitMiniScript , _ > =
1468
1509
Concrete :: Threshold ( keys. len ( ) - 1 , keys) . compile ( ) ;
1469
1510
let ops_count = thresh_res. clone ( ) . and_then ( |m| Ok ( m. ext . ops . op_count ( ) ) ) ;
@@ -1475,8 +1516,10 @@ mod tests {
1475
1516
) ;
1476
1517
// For legacy too..
1477
1518
let ( keys, _) = pubkeys_and_a_sig ( 68 ) ;
1478
- let keys: Vec < Concrete < bitcoin:: PublicKey > > =
1479
- keys. iter ( ) . map ( |pubkey| Concrete :: Key ( * pubkey) ) . collect ( ) ;
1519
+ let keys: Vec < Arc < Concrete < bitcoin:: PublicKey > > > = keys
1520
+ . iter ( )
1521
+ . map ( |pubkey| Arc :: new ( Concrete :: Key ( * pubkey) ) )
1522
+ . collect ( ) ;
1480
1523
let thresh_res = Concrete :: Threshold ( keys. len ( ) - 1 , keys) . compile :: < Legacy > ( ) ;
1481
1524
let ops_count = thresh_res. clone ( ) . and_then ( |m| Ok ( m. ext . ops . op_count ( ) ) ) ;
1482
1525
assert_eq ! (
@@ -1488,8 +1531,9 @@ mod tests {
1488
1531
1489
1532
// Test that we refuse to compile policies with duplicated keys
1490
1533
let ( keys, _) = pubkeys_and_a_sig ( 1 ) ;
1491
- let key = Concrete :: Key ( keys[ 0 ] ) ;
1492
- let res = Concrete :: Or ( vec ! [ ( 1 , key. clone( ) ) , ( 1 , key. clone( ) ) ] ) . compile :: < Segwitv0 > ( ) ;
1534
+ let key = Arc :: new ( Concrete :: Key ( keys[ 0 ] ) ) ;
1535
+ let res =
1536
+ Concrete :: Or ( vec ! [ ( 1 , Arc :: clone( & key) ) , ( 1 , Arc :: clone( & key) ) ] ) . compile :: < Segwitv0 > ( ) ;
1493
1537
assert_eq ! (
1494
1538
res,
1495
1539
Err ( CompilerError :: PolicyError ( policy:: concrete:: PolicyError :: DuplicatePubKeys ) )
0 commit comments