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; }
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; }
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(), "创世区块头签名上下文"); }
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; }
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(), "交易构造完成,但没有足够的签名:", "签名不完整"); } }
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]; }
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(), "小蚁股签名上下文"); }
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(), "小蚁股签名上下文:"); }
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(), "分发交易构造完成,但签名信息还不完整。"); } } }
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; }
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); } }
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); } }
public bool Sign(SignatureContext context, byte[] redeemScript) { return context.Add(redeemScript, PublicKey, Sign(context.Signable)); }
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; }
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; }