Example #1
0
 public static SignatureContext Parse(string value)
 {
     JObject json = JObject.Parse(value);
     string typename = string.Format("{0}.{1}", typeof(SignatureContext).Namespace, json["type"].AsString());
     ISignable signable = Assembly.GetExecutingAssembly().CreateInstance(typename) as ISignable;
     signable.FromUnsignedArray(json["hex"].AsString().HexToBytes());
     SignatureContext context = new SignatureContext(signable);
     JArray multisignatures = (JArray)json["multi_signatures"];
     for (int i = 0; i < multisignatures.Count; i++)
     {
         if (multisignatures[i] != null)
         {
             context.signatures[i] = new MultiSigContext(multisignatures[i]["redeem_script"].AsString().HexToBytes());
             JArray sigs = (JArray)multisignatures[i]["signatures"];
             for (int j = 0; j < sigs.Count; j++)
             {
                 if (sigs[j] != null)
                 {
                     context.signatures[i].signatures[j] = sigs[j].AsString().HexToBytes();
                 }
             }
         }
     }
     return context;
 }
Example #2
0
 public static SignatureContext Parse(string value)
 {
     JObject json = JObject.Parse(value);
     string typename = string.Format("{0}.{1}", typeof(SignatureContext).Namespace, json["type"].AsString());
     ISignable signable = Assembly.GetExecutingAssembly().CreateInstance(typename) as ISignable;
     using (MemoryStream ms = new MemoryStream(json["hex"].AsString().HexToBytes(), false))
     using (BinaryReader reader = new BinaryReader(ms, Encoding.UTF8))
     {
         signable.DeserializeUnsigned(reader);
     }
     SignatureContext context = new SignatureContext(signable);
     JArray multisignatures = (JArray)json["multi_signatures"];
     for (int i = 0; i < multisignatures.Count; i++)
     {
         if (multisignatures[i] != null)
         {
             context.signatures[i] = new MultiSigContext(multisignatures[i]["redeem_script"].AsString().HexToBytes());
             JArray sigs = (JArray)multisignatures[i]["signatures"];
             for (int j = 0; j < sigs.Count; j++)
             {
                 if (sigs[j] != null)
                 {
                     context.signatures[i].signatures[j] = sigs[j].AsString().HexToBytes();
                 }
             }
         }
     }
     return context;
 }
Example #3
0
 private void button2_Click(object sender, EventArgs e)
 {
     Block block = new Block
     {
         PrevBlock = UInt256.Zero,
         Timestamp = DateTime.Now.ToTimestamp(),
         Height = 0,
         Nonce = 2083236893, //向比特币致敬
         NextMiner = Contract.CreateMultiSigContract(Blockchain.GetMinSignatureCount(Blockchain.StandbyMiners.Length), Blockchain.StandbyMiners).ScriptHash,
         Transactions = new Transaction[]
         {
             new GenerationTransaction
             {
                 Nonce = 0,
                 Inputs = new TransactionInput[0],
                 Outputs = new TransactionOutput[0],
                 Scripts = { }
             },
             textBox3.Text.HexToBytes().AsSerializable<RegisterTransaction>()
         }
     };
     block.RebuildMerkleRoot();
     SignatureContext context = new SignatureContext(block.Header);
     InformationBox.Show(context.ToString(), "创世区块头签名上下文");
 }
Example #4
0
 public static SignatureContext Parse(string value)
 {
     JObject json = JObject.Parse(value);
     string typename = string.Format("{0}.{1}", typeof(SignatureContext).Namespace, json["type"].AsString());
     ISignable signable = Assembly.GetExecutingAssembly().CreateInstance(typename) as ISignable;
     using (MemoryStream ms = new MemoryStream(json["hex"].AsString().HexToBytes(), false))
     using (BinaryReader reader = new BinaryReader(ms, Encoding.UTF8))
     {
         signable.DeserializeUnsigned(reader);
     }
     SignatureContext context = new SignatureContext(signable);
     JArray scripts = (JArray)json["scripts"];
     for (int i = 0; i < scripts.Count; i++)
     {
         if (scripts[i] != null)
         {
             context.redeemScripts[i] = scripts[i]["redeem_script"].AsString().HexToBytes();
             context.signatures[i] = new Dictionary<ECPoint, byte[]>();
             JArray sigs = (JArray)scripts[i]["signatures"];
             for (int j = 0; j < sigs.Count; j++)
             {
                 ECPoint pubkey = ECPoint.DecodePoint(sigs[j]["pubkey"].AsString().HexToBytes(), ECCurve.Secp256r1);
                 byte[] signature = sigs[j]["signature"].AsString().HexToBytes();
                 context.signatures[i].Add(pubkey, signature);
             }
         }
     }
     return context;
 }
Example #5
0
 private async Task ShowInformationAsync(SignatureContext context)
 {
     if (context.Completed)
     {
         context.Signable.Scripts = context.GetScripts();
         Transaction tx = (Transaction)context.Signable;
         await Program.LocalNode.RelayAsync(tx);
         InformationBox.Show(tx.Hash.ToString(), "交易已发送,这是交易编号(TXID):", "交易成功");
     }
     else
     {
         InformationBox.Show(context.ToString(), "交易构造完成,但没有足够的签名:", "签名不完整");
     }
 }
Example #6
0
 public void Sign(Block block, ECPoint[] miners)
 {
     SignatureContext context = new SignatureContext(block);
     Contract contract = MultiSigContract.Create(null, miners.Length / 2 + 1, miners);
     foreach (ECPoint pubKey in miners)
     {
         UInt160 publicKeyHash = pubKey.EncodePoint(true).ToScriptHash();
         Account account = GetAccount(publicKeyHash);
         if (account == null) continue;
         byte[] signature = block.Sign(account);
         context.Add(contract, account.PublicKey, signature);
     }
     block.Script = context.GetScripts()[0];
 }
Example #7
0
 private void button1_Click(object sender, EventArgs e)
 {
     RegisterTransaction antshare = new RegisterTransaction
     {
         AssetType = AssetType.AntShare,
         Name = "[{'lang':'zh-CN','name':'小蚁股'},{'lang':'en','name':'AntShare'}]",
         Amount = Fixed8.FromDecimal(numericUpDown1.Value),
         Issuer = textBox1.Text.ToScriptHash(),
         Admin = textBox2.Text.ToScriptHash(),
         Inputs = new TransactionInput[0],
         Outputs = new TransactionOutput[0]
     };
     SignatureContext context = new SignatureContext(antshare);
     InformationBox.Show(context.ToString(), "小蚁股签名上下文");
 }
Example #8
0
        private void button1_Click(object sender, EventArgs e)
        {
            RegisterTransaction antshare = new RegisterTransaction
            {
                AssetType = AssetType.AntShare,
#if TESTNET
                Name = "[{'lang':'zh-CN','name':'小蚁股(测试)'},{'lang':'en','name':'AntShare(TestNet)'}]",
#else
                Name = "[{'lang':'zh-CN','name':'小蚁股'},{'lang':'en','name':'AntShare'}]",
#endif
                Amount = Fixed8.FromDecimal(numericUpDown1.Value),
                Issuer = ECPoint.Parse(textBox1.Text, ECCurve.Secp256r1),
                Admin = Wallet.ToScriptHash(textBox2.Text),
                Attributes = new TransactionAttribute[0],
                Inputs = new TransactionInput[0],
                Outputs = new TransactionOutput[0]
            };
            SignatureContext context = new SignatureContext(antshare);
            InformationBox.Show(context.ToString(), "小蚁股签名上下文:");
        }
Example #9
0
 private void 资产分发IToolStripMenuItem_Click(object sender, EventArgs e)
 {
     using (IssueDialog dialog = new IssueDialog())
     {
         if (dialog.ShowDialog() != DialogResult.OK) return;
         IssueTransaction tx = dialog.GetTransaction();
         if (tx == null) return;
         //TODO: 检查是否符合规则,如是否超过总量、分发方式是否符合约定等;
         SignatureContext context = new SignatureContext(tx);
         Program.CurrentWallet.Sign(context);
         if (context.Completed)
         {
             context.Signable.Scripts = context.GetScripts();
             InformationBox.Show(context.Signable.ToArray().ToHexString(), "分发交易构造完成,并已完整签名,可以广播。");
         }
         else
         {
             InformationBox.Show(context.ToString(), "分发交易构造完成,但签名信息还不完整。");
         }
     }
 }
Example #10
0
 public bool Sign(SignatureContext context)
 {
     bool fSuccess = false;
     foreach (UInt160 scriptHash in context.ScriptHashes)
     {
         Contract contract = GetContract(scriptHash);
         if (contract == null) continue;
         Account account = GetAccountByScriptHash(scriptHash);
         if (account == null) continue;
         byte[] signature;
         using (account.Decrypt())
         {
             signature = context.Signable.Sign(account.PrivateKey, account.PublicKey);
         }
         fSuccess |= context.Add(contract.RedeemScript, ECPoint.FromBytes(account.PublicKey, ECCurve.Secp256r1), signature);
     }
     return fSuccess;
 }
Example #11
0
 private async void 资产分发IToolStripMenuItem_Click(object sender, EventArgs e)
 {
     using (IssueDialog dialog = new IssueDialog())
     {
         if (dialog.ShowDialog() != DialogResult.OK) return;
         Transaction tx = dialog.GetTransaction();
         if (tx == null) return;
         SignatureContext context = new SignatureContext(tx);
         Program.CurrentWallet.Sign(context);
         await ShowInformationAsync(context);
     }
 }
Example #12
0
 private async void 注册资产RToolStripMenuItem_Click(object sender, EventArgs e)
 {
     using (AssetRegisterDialog dialog = new AssetRegisterDialog())
     {
         if (dialog.ShowDialog() != DialogResult.OK) return;
         Transaction tx = null;
         try
         {
             tx = dialog.GetTransaction();
         }
         catch
         {
             MessageBox.Show("数据填写不完整,或格式错误。");
             return;
         }
         if (tx == null)
         {
             MessageBox.Show("余额不足以支付系统费用。");
             return;
         }
         SignatureContext context = new SignatureContext(tx);
         Program.CurrentWallet.Sign(context);
         await ShowInformationAsync(context);
     }
 }
Example #13
0
 public bool Sign(SignatureContext context, byte[] redeemScript)
 {
     return context.Add(redeemScript, PublicKey, Sign(context.Signable));
 }
Example #14
0
 public bool Sign(SignatureContext context)
 {
     bool fSuccess = false;
     for (int i = 0; i < context.ScriptHashes.Length; i++)
     {
         WalletEntry entry = GetEntry(context.ScriptHashes[i]);
         if (entry == null) continue;
         for (int j = 0; j < entry.PrivateKeys.Length; j++)
         {
             byte[] signature;
             using (entry.Decrypt(j))
             {
                 signature = context.Signable.Sign(entry.PrivateKeys[j], entry.PublicKeys[j]);
             }
             fSuccess |= context.Add(entry.RedeemScript, Secp256r1Point.FromBytes(entry.PublicKeys[j]), signature);
         }
     }
     return fSuccess;
 }
Example #15
0
 public bool Sign(SignatureContext context)
 {
     bool fSuccess = false;
     foreach (UInt160 scriptHash in context.ScriptHashes)
     {
         Contract contract = GetContract(scriptHash);
         if (contract == null) continue;
         Account account = GetAccountByScriptHash(scriptHash);
         if (account == null) continue;
         byte[] signature;
         using (account.Decrypt())
         {
             signature = context.Signable.Sign(account.PrivateKey, account.PublicKey.EncodePoint(false).Skip(1).ToArray());
         }
         fSuccess |= context.Add(contract.RedeemScript, account.PublicKey, signature);
     }
     return fSuccess;
 }