def add_multi_sign_transaction(self, m: int, pub_keys: List[bytes] or List[str], signer: Account): """ This interface is used to generate an Transaction object which has multi signature. """ for index, pk in enumerate(pub_keys): if isinstance(pk, str): pub_keys[index] = pk.encode('ascii') pub_keys = ProgramBuilder.sort_public_keys(pub_keys) tx_hash = self.hash256() sig_data = signer.generate_signature(tx_hash) if self.sig_list is None or len(self.sig_list) == 0: self.sig_list = [] elif len(self.sig_list) >= TX_MAX_SIG_SIZE: raise SDKException( ErrorCode.param_err( 'the number of transaction signatures should not be over 16' )) else: for i in range(len(self.sig_list)): if self.sig_list[i].public_keys == pub_keys: if len(self.sig_list[i].sig_data) + 1 > len(pub_keys): raise SDKException( ErrorCode.param_err('too more sigData')) if self.sig_list[i].m != m: raise SDKException(ErrorCode.param_err('M error')) self.sig_list[i].sig_data.append(sig_data) return sig = Sig(pub_keys, m, [sig_data]) self.sig_list.append(sig)
def test_sort_public_key(self): pub_keys = [acct1.get_public_key_bytes(), acct2.get_public_key_bytes(), acct3.get_public_key_bytes()] builder = ProgramBuilder() sort_pub_keys = builder.sort_public_keys(pub_keys) self.assertEqual("023cab3b268c4f268456a972c672c276d23a9c3ca3dfcfc0004d786adbf1fb9282", sort_pub_keys[0].hex()) self.assertEqual("03d0fdb54acba3f81db3a6e16fa02e7ea3678bd205eb4ed2f1cfa8ab5e5d45633e", sort_pub_keys[1].hex()) self.assertEqual("02e8e84be09b87985e7f9dfa74298f6bb7f70f85515afca7e041fe964334e4b6c1", sort_pub_keys[2].hex())
def test_sort_public_keys(self): pub_keys = [ '02035b015221686aef1054b02605da2c3958885670b8298d36706593d3c451fa7e', '022b06295115ef825b8a17524815d77cd79a44c9c8980288e35bab542792425fc2', '03616dbe28eb6f2efdebe6a7b8fd824a56cf3e2ea5e03f802e19e686cb347d986f', '0364c210b769c73ffc2782c74beb881581148023e42562a53d6dd8273e26845901', '0296b60945cdbe44e9c8cfbeef7f6e462cb638dc65a5424e364ab0304063043950', '02a2d9e83c40303a3439db54e55052c0133cbbc61580f008197d2d9c03abc2a8ef', '02f7ec18df95f869e475361923105b9511dd8491d06ec0072530c174783a837846' ] pub_keys = ProgramBuilder.sort_public_keys(pub_keys) self.assertEqual(7, len(pub_keys))