void signAndBroadcast() { if (this.listInput.Items.Count == 0) { MessageBox.Show("no input"); return; } if (this.listOutput.Items.Count == 0) { MessageBox.Show("no output"); return; } if (this.listWitness.Items.Count == 0) { MessageBox.Show("no witness"); return; } ThinNeo.Transaction trans = new ThinNeo.Transaction(); trans.attributes = new ThinNeo.Attribute[0]; if (tabCType.SelectedIndex == 0) { trans.type = ThinNeo.TransactionType.ContractTransaction; } else if (tabCType.SelectedIndex == 1) { if (lastScript == null) { throw new Exception("need script"); } if (lastFee.HasValue == false) { throw new Exception("need test script"); } trans.type = ThinNeo.TransactionType.InvocationTransaction; trans.extdata = new ThinNeo.InvokeTransData(); (trans.extdata as ThinNeo.InvokeTransData).script = lastScript; (trans.extdata as ThinNeo.InvokeTransData).gas = lastFee.Value; } trans.inputs = new ThinNeo.TransactionInput[this.listInput.Items.Count]; trans.outputs = new ThinNeo.TransactionOutput[this.listOutput.Items.Count]; trans.witnesses = new ThinNeo.Witness[this.listWitness.Items.Count]; for (var i = 0; i < listInput.Items.Count; i++) { var item = listInput.Items[i] as Tools.Input; var input = new ThinNeo.TransactionInput(); input.index = (ushort)item.Coin.fromN; input.hash = ThinNeo.Helper.HexString2Bytes(item.Coin.fromID).Reverse().ToArray();//反转 trans.inputs[i] = input; } for (var i = 0; i < listOutput.Items.Count; i++) { var item = listOutput.Items[i] as Tools.Output; var output = new ThinNeo.TransactionOutput(); output.assetId = ThinNeo.Helper.HexString2Bytes(item.assetID).Reverse().ToArray();//反转 output.toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(item.Target); output.value = item.Fix8; trans.outputs[i] = output; } for (var i = 0; i < listWitness.Items.Count; i++) { var item = listWitness.Items[i] as Tools.Witnees; var witness = new ThinNeo.Witness(); if (item.IsSmartContract) { if (item.iscript == null) { throw new Exception("a smartContract witness not set InvocationScript."); } var s = ThinNeo.Helper.GetPublicKeyHashFromAddress(item.address); witness.VerificationScript = rpc_getScript(s); witness.InvocationScript = item.iscript; return; } else //个人鉴证人 { var pubkey = ThinNeo.Helper.GetPublicKeyFromPrivateKey(this.privatekey); var addr = ThinNeo.Helper.GetAddressFromPublicKey(pubkey); if (item.address != addr) { MessageBox.Show("the key is no match with your witness."); } witness.VerificationScript = ThinNeo.Helper.GetScriptFromPublicKey(pubkey); var signdata = ThinNeo.Helper.Sign(trans.GetMessage(), this.privatekey); var sb = new ThinNeo.ScriptBuilder(); sb.EmitPushBytes(signdata); witness.InvocationScript = sb.ToArray(); } trans.witnesses[i] = witness; } var rawdata = trans.GetRawData(); bool b = rpc_SendRaw(rawdata); if (b) { var hash = trans.GetHash(); var str = ThinNeo.Helper.Bytes2HexString(hash.Reverse().ToArray()); MessageBox.Show("txid=" + str); } else { MessageBox.Show("transaction error"); } }
ThinNeo.Transaction GenTran() { if (this.listInput.Items.Count == 0) { MessageBox.Show("no input"); return(null); } if (this.listOutput.Items.Count == 0) { MessageBox.Show("no output"); return(null); } if (this.listWitness.Items.Count == 0) { MessageBox.Show("no witness"); return(null); } ThinNeo.Transaction trans = new ThinNeo.Transaction(); trans.attributes = new ThinNeo.Attribute[0]; if (tabCType.SelectedIndex == 0) { trans.type = ThinNeo.TransactionType.ContractTransaction; } else if (tabCType.SelectedIndex == 1) { if (lastScript == null) { throw new Exception("need script"); } if (lastFee.HasValue == false) { throw new Exception("need test script"); } trans.type = ThinNeo.TransactionType.InvocationTransaction; trans.extdata = new ThinNeo.InvokeTransData(); (trans.extdata as ThinNeo.InvokeTransData).script = lastScript; (trans.extdata as ThinNeo.InvokeTransData).gas = lastFee.Value; } trans.inputs = new ThinNeo.TransactionInput[this.listInput.Items.Count]; var _listOutput = new List <ThinNeo.TransactionOutput>(); for (var i = 0; i < listInput.Items.Count; i++) { var item = listInput.Items[i] as Tools.Input; var input = new ThinNeo.TransactionInput(); input.index = (ushort)item.Coin.fromN; var checkutxo = item.Coin.fromN + "_" + item.Coin.fromID; foreach (var v in Tools.CoinTool.UtxoHistory) { if (v == checkutxo) { if (MessageBox.Show("use a input with spented money. Realy?", "", MessageBoxButton.YesNo) == MessageBoxResult.No) { return(null); } } } input.hash = ThinNeo.Helper.HexString2Bytes(item.Coin.fromID).Reverse().ToArray();//反转 trans.inputs[i] = input; } for (var i = 0; i < listOutput.Items.Count; i++) { var item = listOutput.Items[i] as Tools.Output; if (string.IsNullOrEmpty(item.Target)) {//扔钱 continue; } var output = new ThinNeo.TransactionOutput(); output.assetId = ThinNeo.Helper.HexString2Bytes(item.assetID).Reverse().ToArray();//反转 output.toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(item.Target); output.value = item.Fix8; _listOutput.Add(output); } trans.outputs = _listOutput.ToArray(); return(trans); }
public static ThinNeo.Transaction makeTran(List <Utxo> utxos, string targetaddr, ThinNeo.Hash256 assetid, decimal sendcount) { var tran = new ThinNeo.Transaction(); tran.type = ThinNeo.TransactionType.ContractTransaction; tran.version = 0;//0 or 1 tran.extdata = null; tran.attributes = new ThinNeo.Attribute[0]; var scraddr = ""; utxos.Sort((a, b) => { if (a.value > b.value) { return(1); } else if (a.value < b.value) { return(-1); } else { return(0); } }); decimal count = decimal.Zero; List <ThinNeo.TransactionInput> list_inputs = new List <ThinNeo.TransactionInput>(); for (var i = 0; i < utxos.Count; i++) { ThinNeo.TransactionInput input = new ThinNeo.TransactionInput(); input.hash = utxos[i].txid; input.index = (ushort)utxos[i].n; list_inputs.Add(input); count += utxos[i].value; scraddr = utxos[i].addr; if (count >= sendcount) { break; } } tran.inputs = list_inputs.ToArray(); if (count >= sendcount)//输入大于等于输出 { List <ThinNeo.TransactionOutput> list_outputs = new List <ThinNeo.TransactionOutput>(); //输出 if (sendcount > decimal.Zero && targetaddr != null) { ThinNeo.TransactionOutput output = new ThinNeo.TransactionOutput(); output.assetId = assetid; output.value = sendcount; output.toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(targetaddr); list_outputs.Add(output); } //找零 var change = count - sendcount; if (change > decimal.Zero) { ThinNeo.TransactionOutput outputchange = new ThinNeo.TransactionOutput(); outputchange.toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(scraddr); outputchange.value = change; outputchange.assetId = assetid; list_outputs.Add(outputchange); } tran.outputs = list_outputs.ToArray(); } else { throw new Exception("no enough money."); } return(tran); }
//拼交易体 ThinNeo.Transaction makeTran(Dictionary <string, List <Utxo> > dir_utxos1, Dictionary <string, List <Utxo> > dir_utxos2, string[] targetaddrs, ThinNeo.Hash256 assetid, decimal sendcount) { if (!dir_utxos1.ContainsKey(assetid.ToString()) || !dir_utxos2.ContainsKey(assetid.ToString())) { throw new Exception("no enough money."); } List <Utxo> utxos1 = dir_utxos1[assetid.ToString()]; List <Utxo> utxos2 = dir_utxos2[assetid.ToString()]; var tran = new ThinNeo.Transaction(); tran.type = ThinNeo.TransactionType.ContractTransaction; tran.version = 0;//0 or 1 tran.extdata = null; tran.attributes = new ThinNeo.Attribute[0]; utxos1.Sort((a, b) => { if (a.value > b.value) { return(1); } else if (a.value < b.value) { return(-1); } else { return(0); } }); utxos2.Sort((a, b) => { if (a.value > b.value) { return(1); } else if (a.value < b.value) { return(-1); } else { return(0); } }); decimal count = decimal.Zero; string scraddr = ""; List <ThinNeo.TransactionInput> list_inputs = new List <ThinNeo.TransactionInput>(); for (var i = 0; i < utxos1.Count; i++) { ThinNeo.TransactionInput input = new ThinNeo.TransactionInput(); input.hash = utxos1[i].txid; input.index = (ushort)utxos1[i].n; list_inputs.Add(input); count += utxos1[i].value; scraddr = utxos1[i].addr; if (count >= (sendcount / 2)) { break; } } decimal count2 = decimal.Zero; string scraddr2 = ""; for (var i = 0; i < utxos2.Count; i++) { ThinNeo.TransactionInput input = new ThinNeo.TransactionInput(); input.hash = utxos2[i].txid; input.index = (ushort)utxos2[i].n; list_inputs.Add(input); count2 += utxos2[i].value; scraddr2 = utxos2[i].addr; if (count2 >= (sendcount / 2)) { break; } } tran.inputs = list_inputs.ToArray(); if (count + count2 >= sendcount)//输入大于等于输出 { List <ThinNeo.TransactionOutput> list_outputs = new List <ThinNeo.TransactionOutput>(); //输出 if (sendcount > decimal.Zero && targetaddrs.Length > 0) { foreach (string targetaddr in targetaddrs) { ThinNeo.TransactionOutput output = new ThinNeo.TransactionOutput(); output.assetId = assetid; output.value = sendcount / 2; output.toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(targetaddr); list_outputs.Add(output); } } //找零 var change1 = count - sendcount / 2; var change2 = count2 - sendcount / 2; if (change1 > decimal.Zero) { ThinNeo.TransactionOutput outputchange = new ThinNeo.TransactionOutput(); outputchange.toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(scraddr); outputchange.value = change1; outputchange.assetId = assetid; list_outputs.Add(outputchange); } if (change2 > decimal.Zero) { ThinNeo.TransactionOutput outputchange = new ThinNeo.TransactionOutput(); outputchange.toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(scraddr2); outputchange.value = change2; outputchange.assetId = assetid; list_outputs.Add(outputchange); } tran.outputs = list_outputs.ToArray(); } else { throw new Exception("no enough money."); } return(tran); }