private void CheckSignatures() { if (context.Signatures.Count(p => p != null) >= context.M && context.TransactionHashes.All(p => context.Transactions.ContainsKey(p))) { VerificationContract contract = VerificationContract.CreateMultiSigContract(context.Validators[context.MyIndex].EncodePoint(true).ToScriptHash(), context.M, context.Validators); Block block = context.MakeHeader(); ContractParametersContext sc = new ContractParametersContext(block); for (int i = 0, j = 0; i < context.Validators.Length && j < context.M; i++) { if (context.Signatures[i] != null) { sc.AddSignature(contract, context.Validators[i], context.Signatures[i]); j++; } } sc.Verifiable.Scripts = sc.GetScripts(); block.Transactions = context.TransactionHashes.Select(p => context.Transactions[p]).ToArray(); Log($"relay block: {block.Hash}"); if (!localNode.Relay(block)) { Log($"reject block: {block.Hash}"); } context.State |= ConsensusState.BlockSent; } }
public VerificationContract GetContract() { ECPoint[] publicKeys = listBox1.Items.OfType <string>().Select(p => ECPoint.DecodePoint(p.HexToBytes(), ECCurve.Secp256r1)).ToArray(); foreach (ECPoint publicKey in publicKeys) { KeyPair key = Program.CurrentWallet.GetKey(publicKey.EncodePoint(true).ToScriptHash()); if (key != null) { return(VerificationContract.CreateMultiSigContract(key.PublicKeyHash, (int)numericUpDown2.Value, publicKeys)); } } return(null); }
private void RegisterContract(ECPoint[] publicKeys, int nValidatorCount) { UInt160 walletAddrHash = UInt160.Zero; foreach (UInt160 scriptHash in GetAddresses()) { if (Wallet.GetAddressVersion(Wallet.ToAddress(scriptHash)) == Wallet.AddressVersion) { walletAddrHash = scriptHash; KeyPair key = (KeyPair)GetKeyByScriptHash(scriptHash); if (key != null) { VerificationContract newContract = VerificationContract.CreateMultiSigContract(key.PublicKeyHash, nValidatorCount, publicKeys); if (GetContracts().Contains(newContract) == false) { AddContract(newContract); } } break; } } }