Пример #1
0
 private void CheckSignatures()
 {
     if (context.Signatures.Count(p => p != null) >= context.M && context.TransactionHashes.All(p => context.Transactions.ContainsKey(p)))
     {
         Log($"{nameof(CheckSignatures)} {context.Signatures.Count(p => p != null)}/{context.M}");
         Contract         contract = MultiSigContract.Create(context.Miners[context.MinerIndex].EncodePoint(true).ToScriptHash(), context.M, context.Miners);
         Block            block    = context.MakeHeader();
         SignatureContext sc       = new SignatureContext(block);
         for (int i = 0; i < context.Miners.Length; i++)
         {
             if (context.Signatures[i] != null)
             {
                 sc.Add(contract, context.Miners[i], context.Signatures[i]);
             }
         }
         sc.Signable.Scripts = sc.GetScripts();
         block.Transactions  = context.TransactionHashes.Select(p => context.Transactions[p]).ToArray();
         Log($"RelayBlock hash:{block.Hash}");
         if (!LocalNode.Relay(block))
         {
             Log($"failed hash:{block.Hash}");
         }
         context.State |= ConsensusState.BlockSent;
     }
 }
Пример #2
0
 public MultiSigContract GetContract()
 {
     ECPoint[] publicKeys = listBox1.Items.OfType <string>().Select(p => ECPoint.DecodePoint(p.HexToBytes(), ECCurve.Secp256r1)).ToArray();
     foreach (ECPoint publicKey in publicKeys)
     {
         Account account = Program.CurrentWallet.GetAccount(publicKey.EncodePoint(true).ToScriptHash());
         if (account != null)
         {
             return(MultiSigContract.Create(account.PublicKeyHash, (int)numericUpDown2.Value, publicKeys));
         }
     }
     return(null);
 }
Пример #3
0
 private void 多方签名MToolStripMenuItem_Click(object sender, EventArgs e)
 {
     using (CreateMultiSigContractDialog dialog = new CreateMultiSigContractDialog())
     {
         if (dialog.ShowDialog() != DialogResult.OK)
         {
             return;
         }
         MultiSigContract contract = dialog.GetContract();
         if (contract == null)
         {
             MessageBox.Show("无法添加智能合约,因为当前钱包中不包含签署该合约的私钥。");
             return;
         }
         Program.CurrentWallet.AddContract(contract);
         listView1.SelectedIndices.Clear();
         AddContractToListView(contract, true);
     }
 }
Пример #4
0
 public static UInt160 GetMinerAddress(ECPoint[] miners)
 {
     return(MultiSigContract.CreateMultiSigRedeemScript(miners.Length / 2 + 1, miners).ToScriptHash());
 }