diff --git a/AntSharesCore/Core/Blockchain.cs b/AntSharesCore/Core/Blockchain.cs
index b09886a5c9..6d39ea2560 100644
--- a/AntSharesCore/Core/Blockchain.cs
+++ b/AntSharesCore/Core/Blockchain.cs
@@ -66,17 +66,17 @@ public abstract class Blockchain : IDisposable
{
AssetType = AssetType.AntShare,
#if TESTNET
- Name = "[{\"lang\":\"zh-CN\",\"name\":\"小蚁股(测试)\"},{\"lang\":\"en\",\"name\":\"AntShare(TestNet)\"}]",
+ Name = "[{'lang':'zh-CN','name':'小蚁股(测试)'},{'lang':'en','name':'AntShare(TestNet)'}]",
#else
- Name = "[{\"lang\":\"zh-CN\",\"name\":\"小蚁股\"},{\"lang\":\"en\",\"name\":\"AntShare\"}]",
+ Name = "[{'lang':'zh-CN','name':'小蚁股'},{'lang':'en','name':'AntShare'}]",
#endif
Amount = Fixed8.FromDecimal(100000000),
- Precision = 0,
- Issuer = ECCurve.Secp256r1.Infinity,
+ Issuer = ECPoint.DecodePoint((new[] { (byte)0x02 }).Concat(ECCurve.Secp256r1.G.EncodePoint(false).Skip(1).Sha256().Sha256()).ToArray(), ECCurve.Secp256r1),
Admin = (new[] { (byte)ScriptOp.OP_TRUE }).ToScriptHash(),
Attributes = new TransactionAttribute[0],
Inputs = new TransactionInput[0],
- Outputs = new TransactionOutput[0]
+ Outputs = new TransactionOutput[0],
+ Scripts = new Script[0]
};
///
@@ -86,17 +86,17 @@ public abstract class Blockchain : IDisposable
{
AssetType = AssetType.AntCoin,
#if TESTNET
- Name = "[{\"lang\":\"zh-CN\",\"name\":\"小蚁币(测试)\"},{\"lang\":\"en\",\"name\":\"AntCoin(TestNet)\"}]",
+ Name = "[{'lang':'zh-CN','name':'小蚁币(测试)'},{'lang':'en','name':'AntCoin(TestNet)'}]",
#else
- Name = "[{\"lang\":\"zh-CN\",\"name\":\"小蚁币\"},{\"lang\":\"en\",\"name\":\"AntCoin\"}]",
+ Name = "[{'lang':'zh-CN','name':'小蚁币'},{'lang':'en','name':'AntCoin'}]",
#endif
Amount = Fixed8.FromDecimal(MintingAmount.Sum(p => p * DecrementInterval)),
- Precision = 8,
- Issuer = ECCurve.Secp256r1.Infinity,
+ Issuer = ECPoint.DecodePoint((new[] { (byte)0x02 }).Concat(ECCurve.Secp256r1.G.EncodePoint(false).Skip(1).Sha256().Sha256()).ToArray(), ECCurve.Secp256r1),
Admin = (new[] { (byte)ScriptOp.OP_FALSE }).ToScriptHash(),
Attributes = new TransactionAttribute[0],
Inputs = new TransactionInput[0],
- Outputs = new TransactionOutput[0]
+ Outputs = new TransactionOutput[0],
+ Scripts = new Script[0]
};
///
@@ -128,6 +128,7 @@ public abstract class Blockchain : IDisposable
AntCoin,
new IssueTransaction
{
+ Nonce = 2083236893,
Attributes = new TransactionAttribute[0],
Inputs = new TransactionInput[0],
Outputs = new[]
@@ -182,18 +183,6 @@ public abstract class Blockchain : IDisposable
static Blockchain()
{
- AntShare.Scripts = new[] { new Script { RedeemScript = Contract.CreateSignatureRedeemScript(AntShare.Issuer) } };
- using (ScriptBuilder sb = new ScriptBuilder())
- {
- sb.Push(ECCurve.Secp256r1.G.EncodePoint(true).Skip(1).Concat(AntShare.GetHashForSigning()).ToArray());
- AntShare.Scripts[0].StackScript = sb.ToArray();
- }
- AntCoin.Scripts = new[] { new Script { RedeemScript = Contract.CreateSignatureRedeemScript(AntCoin.Issuer) } };
- using (ScriptBuilder sb = new ScriptBuilder())
- {
- sb.Push(ECCurve.Secp256r1.G.EncodePoint(true).Skip(1).Concat(AntCoin.GetHashForSigning()).ToArray());
- AntCoin.Scripts[0].StackScript = sb.ToArray();
- }
GenesisBlock.RebuildMerkleRoot();
}
@@ -349,7 +338,7 @@ public virtual IEnumerable GetMiners(IEnumerable others)
Dictionary enrollments = GetEnrollments(others).ToDictionary(p => p.Hash, p => p.PublicKey);
foreach (var vote in votes)
{
- foreach (UInt256 hash in vote.Enrollments.Take(miner_count))
+ foreach (UInt256 hash in vote.Enrollments)
{
if (!enrollments.ContainsKey(hash)) continue;
ECPoint pubkey = enrollments[hash];
diff --git a/AntSharesCore/Core/IssueTransaction.cs b/AntSharesCore/Core/IssueTransaction.cs
index d8a1759e71..975813945a 100644
--- a/AntSharesCore/Core/IssueTransaction.cs
+++ b/AntSharesCore/Core/IssueTransaction.cs
@@ -1,6 +1,7 @@
using AntShares.Network;
using System;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
namespace AntShares.Core
@@ -10,6 +11,11 @@ namespace AntShares.Core
///
public class IssueTransaction : Transaction
{
+ ///
+ /// 随机数
+ ///
+ public uint Nonce;
+
///
/// 系统费用
///
@@ -32,6 +38,15 @@ public IssueTransaction()
{
}
+ ///
+ /// 反序列化交易中的额外数据
+ ///
+ /// 数据来源
+ protected override void DeserializeExclusiveData(BinaryReader reader)
+ {
+ this.Nonce = reader.ReadUInt32();
+ }
+
///
/// 获取需要校验的脚本散列值
///
@@ -48,6 +63,15 @@ public override UInt160[] GetScriptHashesForVerifying()
return hashes.OrderBy(p => p).ToArray();
}
+ ///
+ /// 序列化交易中的额外数据
+ ///
+ /// 存放序列化后的结果
+ protected override void SerializeExclusiveData(BinaryWriter writer)
+ {
+ writer.Write(Nonce);
+ }
+
///
/// 验证交易
///
diff --git a/AntSharesCore/Core/RegisterTransaction.cs b/AntSharesCore/Core/RegisterTransaction.cs
index 28c0339da7..3e87310e6c 100644
--- a/AntSharesCore/Core/RegisterTransaction.cs
+++ b/AntSharesCore/Core/RegisterTransaction.cs
@@ -30,7 +30,6 @@ public class RegisterTransaction : Transaction
/// 2. 不限量模式:当Amount等于-1时,表示当前资产可以由创建者无限量发行。这种模式的自由度最大,但是公信力最低,不建议使用。
///
public Fixed8 Amount;
- public byte Precision;
///
/// 发行者的公钥
///
@@ -40,7 +39,7 @@ public class RegisterTransaction : Transaction
///
public UInt160 Admin;
- private static readonly string ShareName = "[{\"lang\":\"zh-CN\",\"name\":\"股权\"},{\"lang\":\"en\",\"name\":\"Share\"}]";
+ private static readonly string ShareName = "[{'lang':'zh-CN','name':'股权'},{'lang':'en','name':'Share'}]";
///
/// 系统费用
@@ -70,20 +69,18 @@ public RegisterTransaction()
/// 数据来源
protected override void DeserializeExclusiveData(BinaryReader reader)
{
- AssetType = (AssetType)reader.ReadByte();
+ this.AssetType = (AssetType)reader.ReadByte();
if (!Enum.IsDefined(typeof(AssetType), AssetType) || AssetType == AssetType.CreditFlag || AssetType == AssetType.DutyFlag)
throw new FormatException();
- Name = reader.ReadVarString();
- Amount = reader.ReadSerializable();
+ this.Name = reader.ReadVarString();
+ this.Amount = reader.ReadSerializable();
if (Amount == Fixed8.Zero || Amount < -Fixed8.Satoshi) throw new FormatException();
if (AssetType == AssetType.Share && Amount <= Fixed8.Zero)
throw new FormatException();
if (AssetType == AssetType.Invoice && Amount != -Fixed8.Satoshi)
throw new FormatException();
- Precision = reader.ReadByte();
- if (Precision > 8) throw new FormatException();
- Issuer = ECPoint.DeserializeFrom(reader, ECCurve.Secp256r1);
- Admin = reader.ReadSerializable();
+ this.Issuer = ECPoint.DeserializeFrom(reader, ECCurve.Secp256r1);
+ this.Admin = reader.ReadSerializable();
}
private Dictionary _names;
@@ -125,7 +122,7 @@ public string GetName(CultureInfo culture = null)
public override UInt160[] GetScriptHashesForVerifying()
{
UInt160 issuer = Contract.CreateSignatureRedeemScript(Issuer).ToScriptHash();
- return base.GetScriptHashesForVerifying().Union(new[] { issuer }).OrderBy(p => p).ToArray();
+ return base.GetScriptHashesForVerifying().Union(new UInt160[] { issuer, Admin }).OrderBy(p => p).ToArray();
}
protected override void OnDeserialized()
@@ -146,7 +143,6 @@ protected override void SerializeExclusiveData(BinaryWriter writer)
writer.Write((byte)AssetType);
writer.WriteVarString(Name);
writer.Write(Amount);
- writer.Write(Precision);
writer.Write(Issuer);
writer.Write(Admin);
}
@@ -169,7 +165,6 @@ public override JObject ToJson()
json["asset"]["name"] = Name;
}
json["asset"]["amount"] = Amount.ToString();
- json["asset"]["precision"] = Precision;
json["asset"]["high"] = Amount.GetData() >> 32;
json["asset"]["low"] = Amount.GetData() & 0xffffffff;
json["asset"]["issuer"] = Issuer.ToString();
diff --git a/AntSharesCore/Core/Transaction.cs b/AntSharesCore/Core/Transaction.cs
index 6fd6b003d3..d65cd6f0ec 100644
--- a/AntSharesCore/Core/Transaction.cs
+++ b/AntSharesCore/Core/Transaction.cs
@@ -22,10 +22,6 @@ public abstract class Transaction : IInventory
///
public readonly TransactionType Type;
///
- /// 版本
- ///
- public const byte Version = 0;
- ///
/// 该交易所具备的额外特性
///
public TransactionAttribute[] Attributes;
@@ -164,8 +160,6 @@ void ISignable.DeserializeUnsigned(BinaryReader reader)
private void DeserializeUnsignedWithoutType(BinaryReader reader)
{
- if (reader.ReadByte() != Version)
- throw new FormatException();
DeserializeExclusiveData(reader);
Attributes = reader.ReadSerializableArray();
if (Attributes.Select(p => p.Usage).Distinct().Count() != Attributes.Length)
@@ -179,6 +173,10 @@ private void DeserializeUnsignedWithoutType(BinaryReader reader)
Outputs = reader.ReadSerializableArray();
if (Outputs.Length > ushort.MaxValue + 1)
throw new FormatException();
+ if (Blockchain.AntShare != null)
+ foreach (TransactionOutput output in Outputs.Where(p => p.AssetId == Blockchain.AntShare.Hash))
+ if (output.Value.GetData() % 100000000 != 0)
+ throw new FormatException();
}
public bool Equals(Transaction other)
@@ -277,7 +275,6 @@ protected virtual void SerializeExclusiveData(BinaryWriter writer)
void ISignable.SerializeUnsigned(BinaryWriter writer)
{
writer.Write((byte)Type);
- writer.Write(Version);
SerializeExclusiveData(writer);
writer.Write(Attributes);
writer.Write(Inputs);
@@ -315,9 +312,6 @@ public virtual bool Verify()
{
RegisterTransaction asset = Blockchain.Default.GetTransaction(group.Key) as RegisterTransaction;
if (asset == null) return false;
- foreach (TransactionOutput output in group)
- if (output.Value.GetData() % (long)Math.Pow(10, 8 - asset.Precision) != 0)
- return false;
}
TransactionResult[] results = GetTransactionResults()?.ToArray();
if (results == null) return false;
diff --git a/AntSharesCore/Network/InventoryType.cs b/AntSharesCore/Network/InventoryType.cs
index fe9fe0b08e..f24db414c2 100644
--- a/AntSharesCore/Network/InventoryType.cs
+++ b/AntSharesCore/Network/InventoryType.cs
@@ -3,7 +3,7 @@
///
/// 定义清单中的对象类型
///
- public enum InventoryType : byte
+ public enum InventoryType : uint
{
///
/// 交易
diff --git a/AntSharesCore/Network/Payloads/InvPayload.cs b/AntSharesCore/Network/Payloads/InvPayload.cs
index fd3f1a540f..6e9a82623b 100644
--- a/AntSharesCore/Network/Payloads/InvPayload.cs
+++ b/AntSharesCore/Network/Payloads/InvPayload.cs
@@ -1,35 +1,37 @@
using AntShares.IO;
-using System;
using System.IO;
+using System.Linq;
namespace AntShares.Network.Payloads
{
internal class InvPayload : ISerializable
{
- public InventoryType Type;
- public UInt256[] Hashes;
+ public InventoryVector[] Inventories;
+
+ public static InvPayload Create(InventoryVector[] vectors)
+ {
+ return new InvPayload
+ {
+ Inventories = vectors
+ };
+ }
public static InvPayload Create(InventoryType type, params UInt256[] hashes)
{
return new InvPayload
{
- Type = type,
- Hashes = hashes
+ Inventories = hashes.Select(p => new InventoryVector { Type = type, Hash = p }).ToArray()
};
}
void ISerializable.Deserialize(BinaryReader reader)
{
- Type = (InventoryType)reader.ReadByte();
- if (!Enum.IsDefined(typeof(InventoryType), Type))
- throw new FormatException();
- Hashes = reader.ReadSerializableArray();
+ Inventories = reader.ReadSerializableArray();
}
void ISerializable.Serialize(BinaryWriter writer)
{
- writer.Write((byte)Type);
- writer.Write(Hashes);
+ writer.Write(Inventories);
}
}
}
diff --git a/AntSharesCore/Network/Payloads/InventoryVector.cs b/AntSharesCore/Network/Payloads/InventoryVector.cs
new file mode 100644
index 0000000000..3f68d82e42
--- /dev/null
+++ b/AntSharesCore/Network/Payloads/InventoryVector.cs
@@ -0,0 +1,44 @@
+using AntShares.IO;
+using System;
+using System.IO;
+
+namespace AntShares.Network.Payloads
+{
+ internal class InventoryVector : IEquatable, ISerializable
+ {
+ public InventoryType Type;
+ public UInt256 Hash;
+
+ void ISerializable.Deserialize(BinaryReader reader)
+ {
+ Type = (InventoryType)reader.ReadUInt32();
+ if (!Enum.IsDefined(typeof(InventoryType), Type))
+ throw new FormatException();
+ Hash = reader.ReadSerializable();
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (!(obj is InventoryVector)) return false;
+ return Equals((InventoryVector)obj);
+ }
+
+ public bool Equals(InventoryVector other)
+ {
+ if (ReferenceEquals(other, null)) return false;
+ if (ReferenceEquals(this, other)) return true;
+ return Hash == other.Hash;
+ }
+
+ public override int GetHashCode()
+ {
+ return Hash.GetHashCode();
+ }
+
+ void ISerializable.Serialize(BinaryWriter writer)
+ {
+ writer.Write((uint)Type);
+ writer.Write(Hash);
+ }
+ }
+}
diff --git a/AntSharesCore/Network/Payloads/VersionPayload.cs b/AntSharesCore/Network/Payloads/VersionPayload.cs
index 6a44658b28..ecff16cc7b 100644
--- a/AntSharesCore/Network/Payloads/VersionPayload.cs
+++ b/AntSharesCore/Network/Payloads/VersionPayload.cs
@@ -14,7 +14,6 @@ internal class VersionPayload : ISerializable
public uint Nonce;
public string UserAgent;
public uint StartHeight;
- public bool Relay;
public static VersionPayload Create(int port, uint nonce, string userAgent)
{
@@ -26,8 +25,7 @@ public static VersionPayload Create(int port, uint nonce, string userAgent)
Port = (ushort)port,
Nonce = nonce,
UserAgent = userAgent,
- StartHeight = Blockchain.Default?.Height ?? 0,
- Relay = true
+ StartHeight = Blockchain.Default?.Height ?? 0
};
}
diff --git a/AntSharesCore/Network/RemoteNode.cs b/AntSharesCore/Network/RemoteNode.cs
index 4279a30b97..7b25d12bf5 100644
--- a/AntSharesCore/Network/RemoteNode.cs
+++ b/AntSharesCore/Network/RemoteNode.cs
@@ -179,22 +179,22 @@ private void OnGetBlocksMessageReceived(GetBlocksPayload payload)
private void OnGetDataMessageReceived(InvPayload payload)
{
- foreach (UInt256 hash in payload.Hashes.Distinct())
+ foreach (InventoryVector vector in payload.Inventories.Distinct())
{
IInventory inventory;
- if (!localNode.RelayCache.TryGet(hash, out inventory) && !localNode.ServiceEnabled)
+ if (!localNode.RelayCache.TryGet(vector.Hash, out inventory) && !localNode.ServiceEnabled)
continue;
- switch (payload.Type)
+ switch (vector.Type)
{
case InventoryType.TX:
if (inventory == null && Blockchain.Default != null)
- inventory = Blockchain.Default.GetTransaction(hash);
+ inventory = Blockchain.Default.GetTransaction(vector.Hash);
if (inventory != null)
EnqueueMessage("tx", inventory);
break;
case InventoryType.Block:
if (inventory == null && Blockchain.Default != null)
- inventory = Blockchain.Default.GetBlock(hash);
+ inventory = Blockchain.Default.GetBlock(vector.Hash);
if (inventory != null)
{
BloomFilter filter = bloom_filter;
@@ -258,26 +258,24 @@ private void OnInventoryReceived(IInventory inventory)
private void OnInvMessageReceived(InvPayload payload)
{
- if (payload.Type != InventoryType.TX && payload.Type != InventoryType.Block && payload.Type != InventoryType.Consensus)
- return;
- UInt256[] hashes = payload.Hashes.Distinct().ToArray();
+ InventoryVector[] vectors = payload.Inventories.Distinct().Where(p => Enum.IsDefined(typeof(InventoryType), p.Type)).ToArray();
lock (LocalNode.KnownHashes)
{
- hashes = hashes.Where(p => !LocalNode.KnownHashes.Contains(p)).ToArray();
+ vectors = vectors.Where(p => !LocalNode.KnownHashes.Contains(p.Hash)).ToArray();
}
- if (hashes.Length == 0) return;
+ if (vectors.Length == 0) return;
lock (missions_global)
{
if (localNode.GlobalMissionsEnabled)
- hashes = hashes.Where(p => !missions_global.Contains(p)).ToArray();
- foreach (UInt256 hash in hashes)
+ vectors = vectors.Where(p => !missions_global.Contains(p.Hash)).ToArray();
+ foreach (InventoryVector vector in vectors)
{
- missions_global.Add(hash);
- missions.Add(hash);
+ missions_global.Add(vector.Hash);
+ missions.Add(vector.Hash);
}
}
- if (hashes.Length == 0) return;
- EnqueueMessage("getdata", InvPayload.Create(payload.Type, hashes));
+ if (vectors.Length == 0) return;
+ EnqueueMessage("getdata", InvPayload.Create(vectors));
}
private void OnMemPoolMessageReceived()
@@ -376,7 +374,6 @@ private Message ReceiveMessage(TimeSpan timeout)
internal bool Relay(IInventory data)
{
- if (!Version.Relay) return false;
if (data.InventoryType == InventoryType.TX)
{
BloomFilter filter = bloom_filter;
diff --git a/AntSharesCore/project.json b/AntSharesCore/project.json
index cd7ee945f5..588c22b5d8 100644
--- a/AntSharesCore/project.json
+++ b/AntSharesCore/project.json
@@ -1,8 +1,11 @@
{
"copyright": "? AntShares Project 2015 Released under the MIT license",
"title": "AntShares",
- "version": "1.0-coreclr",
- "buildOptions": { "allowUnsafe": true },
+ "version": "0.7.1-coreclr",
+ "buildOptions": {
+ "allowUnsafe": true,
+ "define": [ "TESTNET" ]
+ },
"dependencies": {
"Microsoft.EntityFrameworkCore.Sqlite": "1.0.0",
diff --git a/AntSharesDaemon/project.json b/AntSharesDaemon/project.json
index dcd34235ac..a14afc4cc2 100644
--- a/AntSharesDaemon/project.json
+++ b/AntSharesDaemon/project.json
@@ -1,14 +1,14 @@
{
"copyright": "© AntShares Project 2016 Released under the MIT license",
"title": "AntShares",
- "version": "1.0-coreclr",
+ "version": "0.7.1-coreclr",
"buildOptions": {
"emitEntryPoint": true,
- "define": [ "DEBUG" ]
+ "define": [ "DEBUG", "TESTNET" ]
},
"dependencies": {
- "AntSharesCore": "1.0-coreclr",
+ "AntSharesCore": "0.7.1-coreclr",
"Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
"Microsoft.NETCore.App": {
"type": "platform",
diff --git a/AntSharesDaemon/project.lock.json b/AntSharesDaemon/project.lock.json
index d452e857e3..b8b5097dcf 100644
--- a/AntSharesDaemon/project.lock.json
+++ b/AntSharesDaemon/project.lock.json
@@ -2835,7 +2835,7 @@
"lib/netstandard1.3/System.Xml.XPath.XmlDocument.dll": {}
}
},
- "AntSharesCore/1.0.0-coreclr": {
+ "AntSharesCore/0.7.1-coreclr": {
"type": "project",
"framework": ".NETStandard,Version=v1.6",
"dependencies": {
@@ -8180,7 +8180,7 @@
"ref/xamarinwatchos10/_._"
]
},
- "AntSharesCore/1.0.0-coreclr": {
+ "AntSharesCore/0.7.1-coreclr": {
"type": "project",
"path": "../AntSharesCore/project.json",
"msbuildProject": "../AntSharesCore/AntSharesCore.xproj"
@@ -8188,7 +8188,7 @@
},
"projectFileDependencyGroups": {
"": [
- "AntSharesCore >= 1.0.0-coreclr",
+ "AntSharesCore >= 0.7.1-coreclr",
"Microsoft.AspNetCore.Server.Kestrel >= 1.0.0",
"Microsoft.NETCore.App >= 1.0.1"
],
diff --git a/AntSharesUI/AntSharesUI.csproj b/AntSharesUI/AntSharesUI.csproj
index 2d71bc4aaf..27aa5aa6d3 100644
--- a/AntSharesUI/AntSharesUI.csproj
+++ b/AntSharesUI/AntSharesUI.csproj
@@ -39,7 +39,7 @@
true
bin\Debug\
- TRACE;DEBUG
+ TRACE;DEBUG;TESTNET
full
AnyCPU
prompt
@@ -54,6 +54,7 @@
prompt
MinimumRecommendedRules.ruleset
false
+ TESTNET
diff --git a/AntSharesUI/Properties/AssemblyInfo.cs b/AntSharesUI/Properties/AssemblyInfo.cs
index 5d5d08056b..0de6ea6fcb 100644
--- a/AntSharesUI/Properties/AssemblyInfo.cs
+++ b/AntSharesUI/Properties/AssemblyInfo.cs
@@ -30,6 +30,6 @@
//
// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”:
-[assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("0.6.*")]
//[assembly: AssemblyVersion("1.0.0.0")]
//[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/AntSharesUI/UI/AssetRegisterDialog.cs b/AntSharesUI/UI/AssetRegisterDialog.cs
index 743aa5fb81..11ba2b0f99 100644
--- a/AntSharesUI/UI/AssetRegisterDialog.cs
+++ b/AntSharesUI/UI/AssetRegisterDialog.cs
@@ -21,7 +21,6 @@ public RegisterTransaction GetTransaction()
AssetType = (AssetType)comboBox1.SelectedItem,
Name = (AssetType)comboBox1.SelectedItem == AssetType.Share ? string.Empty : $"[{{'lang':'zh-CN','name':'{textBox1.Text}'}}]",
Amount = checkBox1.Checked ? Fixed8.Parse(textBox2.Text) : -Fixed8.Satoshi,
- Precision = 8,
Issuer = (ECPoint)comboBox2.SelectedItem,
Admin = Wallet.ToScriptHash(comboBox3.Text),
Outputs = new TransactionOutput[0]
diff --git a/AntSharesUI/UI/IssueDialog.cs b/AntSharesUI/UI/IssueDialog.cs
index 0d763fe112..87ae4a6031 100644
--- a/AntSharesUI/UI/IssueDialog.cs
+++ b/AntSharesUI/UI/IssueDialog.cs
@@ -24,8 +24,10 @@ public IssueDialog(RegisterTransaction asset = null)
public IssueTransaction GetTransaction()
{
if (txOutListBox1.Asset == null) return null;
+ Random rand = new Random();
return Program.CurrentWallet.MakeTransaction(new IssueTransaction
{
+ Nonce = (uint)rand.Next(),
Outputs = txOutListBox1.Items.GroupBy(p => p.Output.ScriptHash).Select(g => new TransactionOutput
{
AssetId = txOutListBox1.Asset.Hash,
diff --git a/Miner/project.json b/Miner/project.json
index d14e7d09b0..57f74720d5 100644
--- a/Miner/project.json
+++ b/Miner/project.json
@@ -1,14 +1,14 @@
{
"copyright": "© AntShares Project 2015 Released under the MIT license",
"title": "AntShares",
- "version": "1.0-coreclr",
+ "version": "0.7.1-coreclr",
"buildOptions": {
"emitEntryPoint": true
},
"dependencies": {
- "AntSharesCore": "1.0-coreclr",
- "AntSharesDaemon": "1.0-coreclr",
+ "AntSharesCore": "0.7.1-coreclr",
+ "AntSharesDaemon": "0.7.1-coreclr",
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.1"
diff --git a/Miner/project.lock.json b/Miner/project.lock.json
index c628b8fbbb..5bb1e29964 100644
--- a/Miner/project.lock.json
+++ b/Miner/project.lock.json
@@ -2835,7 +2835,7 @@
"lib/netstandard1.3/System.Xml.XPath.XmlDocument.dll": {}
}
},
- "AntSharesCore/1.0.0-coreclr": {
+ "AntSharesCore/0.7.1-coreclr": {
"type": "project",
"framework": ".NETStandard,Version=v1.6",
"dependencies": {
@@ -2860,11 +2860,11 @@
"netstandard1.6/AntSharesCore.dll": {}
}
},
- "AntSharesDaemon/1.0.0-coreclr": {
+ "AntSharesDaemon/0.7.1-coreclr": {
"type": "project",
"framework": ".NETCoreApp,Version=v1.0",
"dependencies": {
- "AntSharesCore": "1.0.0-coreclr",
+ "AntSharesCore": "0.7.1-coreclr",
"Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
"Microsoft.NETCore.App": "1.0.1"
},
@@ -8195,12 +8195,12 @@
"ref/xamarinwatchos10/_._"
]
},
- "AntSharesCore/1.0.0-coreclr": {
+ "AntSharesCore/0.7.1-coreclr": {
"type": "project",
"path": "../AntSharesCore/project.json",
"msbuildProject": "../AntSharesCore/AntSharesCore.xproj"
},
- "AntSharesDaemon/1.0.0-coreclr": {
+ "AntSharesDaemon/0.7.1-coreclr": {
"type": "project",
"path": "../AntSharesDaemon/project.json",
"msbuildProject": "../AntSharesDaemon/AntSharesDaemon.xproj"
@@ -8208,8 +8208,8 @@
},
"projectFileDependencyGroups": {
"": [
- "AntSharesCore >= 1.0.0-coreclr",
- "AntSharesDaemon >= 1.0.0-coreclr",
+ "AntSharesCore >= 0.7.1-coreclr",
+ "AntSharesDaemon >= 0.7.1-coreclr",
"Microsoft.NETCore.App >= 1.0.1"
],
".NETCoreApp,Version=v1.0": []