@@ -14,7 +14,7 @@ use ckb_crypto::secp::SECP256K1;
14
14
use ckb_hash:: blake2b_256;
15
15
use ckb_jsonrpc_types:: { self as json_types, JsonBytes } ;
16
16
use ckb_sdk:: {
17
- constants:: { DAO_TYPE_HASH , MULTISIG_SCRIPT , SIGHASH_TYPE_HASH , TYPE_ID_CODE_HASH } ,
17
+ constants:: { MultisigScript , DAO_TYPE_HASH , SIGHASH_TYPE_HASH , TYPE_ID_CODE_HASH } ,
18
18
util:: serialize_signature,
19
19
Address , AddressPayload , NetworkType , OldAddress ,
20
20
} ;
@@ -111,6 +111,19 @@ impl<'a> UtilSubCommand<'a> {
111
111
. conflicts_with ( arg:: privkey_path ( ) . get_name ( ) )
112
112
. about ( "The address extended from `m/44'/309'/0'` (Search 2000 receiving addresses and 2000 change addresses max)" ) ;
113
113
114
+ let arg_multisig_lock_hash = Arg :: with_name ( "multisig-code-hash" )
115
+ . long ( "multisig-code-hash" )
116
+ . takes_value ( true )
117
+ . multiple ( false )
118
+ . required ( false )
119
+ . default_value ( "0x36c971b8d41fbd94aabca77dc75e826729ac98447b46f91e00796155dddb0d29" )
120
+ . possible_values ( & [
121
+ "0x5c5069eb0857efc65e1bca0c07df34c31663b3622fd3876c876320fc9634e2a8" ,
122
+ "0x36c971b8d41fbd94aabca77dc75e826729ac98447b46f91e00796155dddb0d29" ,
123
+ ] )
124
+ . validator ( |input| FixedHashParser :: < H256 > :: default ( ) . validate ( input) )
125
+ . about ( "Specifies the multisig code hash to use (default: `0x36c971b8d41fbd94aabca77dc75e826729ac98447b46f91e00796155dddb0d29`). \n The alternative hash (`0x5c5069eb0857efc65e1bca0c07df34c31663b3622fd3876c876320fc9634e2a8`) is deprecated and NOT recommended for use." ) ;
126
+
114
127
App :: new ( name)
115
128
. about ( "Utilities" )
116
129
. subcommands ( vec ! [
@@ -263,6 +276,7 @@ impl<'a> UtilSubCommand<'a> {
263
276
App :: new( "to-multisig-addr" )
264
277
. about( "Convert address in single signature format to multisig format" )
265
278
. arg( arg_sighash_address. clone( ) )
279
+ . arg( arg_multisig_lock_hash. clone( ) )
266
280
. arg(
267
281
Arg :: with_name( "locktime" )
268
282
. long( "locktime" )
@@ -681,14 +695,24 @@ message = "0x"
681
695
. parse ( input) ?
682
696
} ;
683
697
698
+ let multisig_lock_code_hash: H256 =
699
+ FixedHashParser :: < H256 > :: default ( ) . from_matches ( m, "multisig-code-hash" ) ?;
700
+ let multisig_script = MultisigScript :: try_from ( multisig_lock_code_hash. clone ( ) )
701
+ . map_err ( |_err| {
702
+ format ! (
703
+ "invalid multisig lock code hash: {}" ,
704
+ multisig_lock_code_hash
705
+ )
706
+ } ) ?;
707
+
684
708
let genesis_timestamp =
685
709
NaiveDateTime :: parse_from_str ( "2019-11-16 06:00:00" , "%Y-%m-%d %H:%M:%S" )
686
710
. map ( |dt| dt. and_utc ( ) . timestamp_millis ( ) as u64 )
687
711
. unwrap ( ) ;
688
712
let target_timestamp = to_timestamp ( locktime) ?;
689
713
let elapsed = target_timestamp. saturating_sub ( genesis_timestamp) ;
690
714
let ( epoch_fraction, addr_payload) =
691
- gen_multisig_addr ( address. payload ( ) , None , elapsed) ;
715
+ gen_multisig_addr ( multisig_script , address. payload ( ) , None , elapsed) ;
692
716
let multisig_addr = Address :: new ( NetworkType :: Mainnet , addr_payload, true ) ;
693
717
let resp = format ! ( "{},{},{}" , address, locktime, multisig_addr) ;
694
718
if debug {
@@ -701,7 +725,7 @@ message = "0x"
701
725
elapsed / 1000 ,
702
726
epoch_fraction,
703
727
hex_string( multisig_addr. payload( ) . args( ) . as_ref( ) ) ,
704
- MULTISIG_SCRIPT . code_hash,
728
+ MultisigScript :: Legacy . script_id ( ) . code_hash,
705
729
) ;
706
730
}
707
731
Ok ( Output :: new_output ( serde_json:: json!( resp) ) )
@@ -713,6 +737,16 @@ message = "0x"
713
737
DateTime :: parse_from_rfc3339 ( m. value_of ( "locktime" ) . unwrap ( ) )
714
738
. map ( |dt| dt. timestamp_millis ( ) as u64 )
715
739
. map_err ( |err| err. to_string ( ) ) ?;
740
+
741
+ let multisig_lock_code_hash: H256 =
742
+ FixedHashParser :: < H256 > :: default ( ) . from_matches ( m, "multisig-code-hash" ) ?;
743
+ let multisig_script = MultisigScript :: try_from ( multisig_lock_code_hash. clone ( ) )
744
+ . map_err ( |_err| {
745
+ format ! (
746
+ "invalid multisig lock code hash: {}" ,
747
+ multisig_lock_code_hash
748
+ )
749
+ } ) ?;
716
750
let ( tip_epoch, tip_timestamp) =
717
751
self . rpc_client . get_tip_header ( ) . map ( |header_view| {
718
752
let header = header_view. inner ;
@@ -722,7 +756,7 @@ message = "0x"
722
756
} ) ?;
723
757
let elapsed = locktime_timestamp. saturating_sub ( tip_timestamp. 0 ) ;
724
758
let ( epoch, multisig_addr) =
725
- gen_multisig_addr ( address. payload ( ) , Some ( tip_epoch) , elapsed) ;
759
+ gen_multisig_addr ( multisig_script , address. payload ( ) , Some ( tip_epoch) , elapsed) ;
726
760
let resp = serde_json:: json!( {
727
761
"address" : {
728
762
"mainnet" : Address :: new( NetworkType :: Mainnet , multisig_addr. clone( ) , true ) . to_string( ) ,
@@ -789,10 +823,10 @@ message = "0x"
789
823
} ,
790
824
"secp256k1_blake160_multisig_all" : {
791
825
"script_id" : {
792
- "code_hash" : MULTISIG_SCRIPT . code_hash,
793
- "hash_type" : json_types:: ScriptHashType :: from( MULTISIG_SCRIPT . hash_type) ,
826
+ "code_hash" : MultisigScript :: Legacy . script_id ( ) . code_hash,
827
+ "hash_type" : json_types:: ScriptHashType :: from( MultisigScript :: Legacy . script_id ( ) . hash_type) ,
794
828
} ,
795
- "cell_dep" : json_types:: CellDep :: from( genesis_info. multisig_dep( ) ) ,
829
+ "cell_dep" : json_types:: CellDep :: from( genesis_info. multisig_dep( MultisigScript :: Legacy ) ) ,
796
830
} ,
797
831
"dao" : {
798
832
"script_id" : {
@@ -901,6 +935,7 @@ fn sign_message<P: ?Sized + AsRef<[ChildNumber]>>(
901
935
}
902
936
903
937
fn gen_multisig_addr (
938
+ multisig_script : MultisigScript ,
904
939
sighash_address_payload : & AddressPayload ,
905
940
tip_epoch_opt : Option < EpochNumberWithFraction > ,
906
941
elapsed : u64 ,
@@ -925,8 +960,8 @@ fn gen_multisig_addr(
925
960
data. freeze ( )
926
961
} ;
927
962
let payload = AddressPayload :: new_full (
928
- MULTISIG_SCRIPT . hash_type ,
929
- MULTISIG_SCRIPT . code_hash . pack ( ) ,
963
+ multisig_script . script_id ( ) . hash_type ,
964
+ multisig_script . script_id ( ) . code_hash . pack ( ) ,
930
965
args,
931
966
) ;
932
967
( epoch_fraction, payload)
@@ -947,11 +982,13 @@ mod test {
947
982
fn test_gen_multisig_addr ( ) {
948
983
let payload = AddressPayload :: new_short ( CodeHashIndex :: Sighash , H160 :: default ( ) ) ;
949
984
950
- let ( epoch, _) = gen_multisig_addr ( & payload, None , BLOCK_PERIOD * 2000 ) ;
985
+ let ( epoch, _) =
986
+ gen_multisig_addr ( MultisigScript :: Legacy , & payload, None , BLOCK_PERIOD * 2000 ) ;
951
987
assert_eq ! ( epoch, EpochNumberWithFraction :: new( 1 , 200 , EPOCH_LENGTH ) ) ;
952
988
953
989
// (1+2/3) + (1+1/2) = 3+1/6
954
990
let ( epoch, _) = gen_multisig_addr (
991
+ MultisigScript :: Legacy ,
955
992
& payload,
956
993
Some ( EpochNumberWithFraction :: new ( 1 , 400 , 600 ) ) ,
957
994
BLOCK_PERIOD * 2700 ,
0 commit comments