private static byte[] blake2sSelfTest() { var inc = Blake2s.CreateIncrementalHasher(blake2sCheck.Length); foreach (int diglen in new[] { 16, 20, 28, 32 }) { foreach (int msglen in new[] { 0, 3, 64, 65, 255, 1024 }) { var msg = getTestSequence(msglen); var key = getTestSequence(diglen); inc.Update(Blake2s.ComputeHash(diglen, msg)); inc.Update(Blake2s.ComputeHash(diglen, key, msg)); } } return(inc.Finish()); }
public void Crypto1Test() { var sourceStr = "FeFjpcsfHErXPk5HkfVcwH6zYaRT2xNytDTeSjfuVywt"; var sourceByte = SimpleBase.Base58.Bitcoin.Decode(sourceStr).ToArray(); var privateByte = SimpleBase.Base58.Bitcoin.Decode("ohPH5zghdzmRDxd978r7y6r8YFoTcKm1MgW2gzik3omCuZLysjwNjTd9hnGREFyQHqhShoU4ri7q748UgdwZpzA").ToArray(); using (var _api = BCTransactionTools.CreateContextBC("165.22.220.8", 9090, 60000)) { // WalletDataGetResult WalletData = _api._connect.WalletDataGet(sourceByte); // long transactionId = WalletData.WalletData.LastTransactionId + 1; var transactionId = _api.WalletDataGet(sourceByte).WalletData.LastTransactionId + 1; // var connect = _api._connect; // for (int i = 0; i <= 19; i++) { transactionId++; Transaction transac = new Transaction { Id = transactionId, Source = sourceByte, Amount = BCTransactionTools.GetAmountByDouble_C(0.1M), Fee = BCTransactionTools.EncodeFeeFromDouble(0.1), // если перевод смарта то таргет публичник смарта Target = SimpleBase.Base58.Bitcoin.Decode("FY8J5uSb2D3qX3iwUSvcUSGvrBGAvsrXxKxMQdFfpdmm").ToArray(), // если перевод CS - то адресат назначения. //"DM79n9Lbvm3XhBf1LwyBHESaRmJEJez2YiL549ArcHDC"), // UserFields = model.UserData }; transac.UserFields = new byte[5]; #region ДЕПЛОЙ СМАРТА (убрать if при необходимости) if (1 == 2) { string codeSmart = ""; Byte[] byteSource = transac.Source; //code var byteCodes = _api.SmartContractCompile(codeSmart); if (byteCodes.Status.Code > 0) { throw new Exception(byteCodes.Status.Message); } foreach (var item in byteCodes.ByteCodeObjects) { byteSource.Concat(item.ByteCode); } transac.Target = Blake2s.ComputeHash(byteSource); transac.SmartContract = new SmartContractInvocation() { SmartContractDeploy = new SmartContractDeploy() { SourceCode = codeSmart, ByteCodeObjects = byteCodes.ByteCodeObjects } }; } #endregion #region ВЫЗОВ МЕТОДА СМАРТА (убрать if при необходимости) if (1 == 2) { transac.SmartContract = new SmartContractInvocation() { Method = "transfer", Params = new List <Variant>() { new Variant() { // адресат перевода V_string = "DM79n9Lbvm3XhBf1LwyBHESaRmJEJez2YiL549ArcHDC" // { Value = "DM79n9Lbvm3XhBf1LwyBHESaRmJEJez2YiL549ArcHDC", Key = "STRING" }, // new Credtis_Api_Connect.Model.ParamsCreateModel { Value = "0.5", Key = "STRING" } }, new Variant() { V_string = "0.5" } } }; } #endregion transac.Currency = 1; Console.WriteLine(SimpleBase.Base58.Bitcoin.Encode(BCTransactionTools.CreateByteHashByTransaction(transac))); Rebex.Security.Cryptography.Ed25519 crypt = new Rebex.Security.Cryptography.Ed25519(); crypt.FromPrivateKey(privateByte); // var b58 = new SimpleBase.Base58(); transac.Signature = crypt .SignMessage(BCTransactionTools.CreateByteHashByTransaction(transac)); Console.WriteLine(); Console.WriteLine(SimpleBase.Base58.Bitcoin.Encode(transac.Signature)); // Console.WriteLine(BitConverter.ToString(transac.Signature)); // работает в старом вариант // var _api1 = BCTransactionTools.CreateContextBC("165.22.220.8", 9090, 6000); // var res = _api.TransactionFlow(transac); Console.WriteLine(); // Console.WriteLine(BitConverter.ToString(BCTransactionTools.CreateByteHashByTransaction(transac)).Replace("-","")); // = Res1; } } }
internal static ResponseBlock Parse(byte[] bytes) { try { if (bytes == null) { return(new ResponseBlock() { Success = false, Message = "Input bytes array is null" }); } using (BinaryReader bin = new BinaryReader(new MemoryStream(bytes))) { int hashing_len = 0; Block block = new Block(); block.Version = bin.ReadByte(); int len = bin.ReadByte(); if (len != Primitives.HashSize) { return(new ResponseBlock() { Success = false, Message = "The hash size is not equal" }); } block.PreviousHash = new Primitives.Hash { Value = bin.ReadBytes(len) }; block.Sequence = bin.ReadUInt64(); // user fields int cnt = (int)bin.ReadByte(); if (cnt > 0) { block.UserFields = new List <UserField>(); for (int i = 0; i < cnt; i++) { block.UserFields.Add(UserField.Parse(bin)); } } // round cost block.RoundCost = new Money(); block.RoundCost.Integral = bin.ReadInt32(); block.RoundCost.Fraction = bin.ReadUInt64(); // transactions cnt = (int)bin.ReadUInt32(); if (cnt > 0) { block.Transactions = new List <Transaction>(); for (int i = 0; i < cnt; i++) { block.Transactions.Add(Transaction.Parse(bin)); } // round cost clarify if (block.RoundCost.IsZero) { foreach (var t in block.Transactions) { block.RoundCost += t.ActualFee; } } } // new wallets cnt = (int)bin.ReadUInt32(); if (cnt > 0) { block.IntroducedWallets = new List <WalletIntroduce>(); for (int i = 0; i < cnt; i++) { WalletIntroduce w = new WalletIntroduce(); Int64 v = bin.ReadInt64(); if (v < 0) { v = -v; // address is target if (v < block.Transactions.Count) { w.Key = block.Transactions[(int)v].Target; } } else { if (v < block.Transactions.Count) { w.Key = block.Transactions[(int)v].Source; } } w.Id = bin.ReadUInt32(); block.IntroducedWallets.Add(w); } } // consensus info // current RT cnt = (int)(uint)bin.ReadByte(); UInt64 bits_trusted = bin.ReadUInt64(); // count of "1" = sig_blk_cnt if (cnt > 0) { block.TrustedNodes = new List <ConsensusMember>(); for (int i = 0; i < cnt; i++) { block.TrustedNodes.Add(new ConsensusMember() { Id = new Primitives.PublicKey { Value = bin.ReadBytes(Primitives.PublicKeySize) } }); } } // previous consensus cnt = (int)(uint)bin.ReadByte(); if (cnt > 0) { block.TrustedApproval = new List <KeyValuePair <int, Primitives.Signature> >(); UInt64 bits_appr = bin.ReadUInt64(); int sig_prev_rt_cnt = CountBits(bits_appr); int isig = 0; for (int i = 0; i < cnt; i++) { if ((bits_appr & (0x1UL << i)) == 0) { continue; } if (isig >= sig_prev_rt_cnt) { break; } block.TrustedApproval.Add(new KeyValuePair <int, Primitives.Signature>( isig, new Primitives.Signature { Value = bin.ReadBytes(Primitives.SignatureSize) } )); isig++; } if (isig != sig_prev_rt_cnt) { //TODO: malformed trusted approval section } } hashing_len = (int)(uint)bin.ReadUInt64(); // continue read block.TrustedNodes (signatures) cnt = block.TrustedNodes.Count; for (int i = 0; i < cnt; i++) { if ((bits_trusted & (0x1UL << i)) == 0) { continue; } block.TrustedNodes[i].Signature = new Primitives.Signature() { Value = bin.ReadBytes(Primitives.SignatureSize) }; } // contract signatures cnt = (int)(uint)bin.ReadByte(); if (cnt > 0) { block.ContractsApproval = new List <ContractConfirmation>(); for (int i = 0; i < cnt; i++) { block.ContractsApproval.Add(ContractConfirmation.Parse(bin)); } } if (bin.BaseStream.Position == bin.BaseStream.Length) { if (hashing_len > 0) { block.Hash = new Primitives.Hash() { Value = Blake2s.ComputeHash(Primitives.HashSize, bytes.AsSpan(0, hashing_len)) }; } return(new ResponseBlock() { Success = true, Block = block }); } return(new ResponseBlock() { Success = false, Message = "The stream postion is not equal to the stream length" }); } } catch (Exception ex) { return(new ResponseBlock() { Success = false, Message = ex.Message }); } }
public Transaction InitTransaction(RequestApiModel model) { Transaction transac = new Transaction(); using (var client = GetClientByModel(model)) { // отправитель var sourceByte = SimpleBase.Base58.Bitcoin.Decode(model.PublicKey); transac.Source = sourceByte.ToArray(); if (model.Fee == 0) { Decimal res; if (!string.IsNullOrWhiteSpace(model.FeeAsString) && Decimal.TryParse(model.FeeAsString.Replace(",", "."), NumberStyles.Any, CultureInfo.GetCultureInfo("en-US"), out res)) { transac.Fee = BCTransactionTools.EncodeFeeFromDouble(Decimal.ToDouble(res)); } else { transac.Fee = BCTransactionTools.EncodeFeeFromDouble(Decimal.ToDouble(model.Fee)); } } else { transac.Fee = BCTransactionTools.EncodeFeeFromDouble(Decimal.ToDouble(model.Fee)); } //transac.Fee = BCTransactionTools.EncodeFeeFromDouble(Decimal.ToDouble(model.Fee)); transac.Currency = 1; // ЗАПРОС механизм присваивания транзакции transac.Id = client.WalletDataGet(sourceByte.ToArray()).WalletData.LastTransactionId + 1; if (!String.IsNullOrEmpty(model.UserData)) { transac.UserFields = SimpleBase.Base58.Bitcoin.Decode(model.UserData).ToArray(); } // transac.UserFields = Convert.FromBase64String(model.UserData); if (model.MethodApi == ApiMethodConstant.TransferCs) { if (model.Amount == 0) { if (string.IsNullOrEmpty(model.AmountAsString)) { transac.Amount = new Amount(); } else { Decimal res; if (Decimal.TryParse(model.AmountAsString.Replace(",", "."), NumberStyles.Any, CultureInfo.GetCultureInfo("en-US"), out res)) { transac.Amount = BCTransactionTools.GetAmountByDouble_C(res); } else { transac.Amount = BCTransactionTools.GetAmountByDouble_C(model.Amount); } } } else { transac.Amount = BCTransactionTools.GetAmountByDouble_C(model.Amount); } if (model.Fee == 0) { var minFee = MinTransactionFee; if (model.Amount - minFee >= 0.0M) { model.Fee = minFee; model.Amount = model.Amount - minFee; //GetActualFee(RequestFeeModel) //ServiceProvider.GetService<MonitorService>().GetBalance(model); transac.Fee = BCTransactionTools.EncodeFeeFromDouble(Convert.ToDouble(minFee)); transac.Amount = BCTransactionTools.GetAmountByDouble_C(model.Amount); } else { throw new Exception("Fee is zero and couldn't be get from transaction sum"); } } transac.Target = SimpleBase.Base58.Bitcoin.Decode(model.ReceiverPublicKey).ToArray(); } else if (model.MethodApi == ApiMethodConstant.SmartDeploy) { transac.Amount = BCTransactionTools.GetAmountByDouble_C(0); // Byte[] byteSource = sourceByte; IEnumerable <Byte> sourceCodeByte = sourceByte.ToArray(); sourceCodeByte = sourceCodeByte.Concat(BitConverter.GetBytes(transac.Id).Take(6)); // ЗАПРОС var byteCodes = client.SmartContractCompile(model.SmartContractSource); if (byteCodes.Status.Code > 0) { throw new Exception(byteCodes.Status.Message); } foreach (var item in byteCodes.ByteCodeObjects) { sourceCodeByte = sourceCodeByte.Concat(item.ByteCode); } transac.Target = Blake2s.ComputeHash(sourceCodeByte.ToArray()); transac.SmartContract = new SmartContractInvocation() { SmartContractDeploy = new SmartContractDeploy() { SourceCode = model.SmartContractSource, ByteCodeObjects = byteCodes.ByteCodeObjects }, }; } else if (model.MethodApi == ApiMethodConstant.SmartMethodExecute) { var listParam = new List <Variant>(); var contractParams = new List <TokenParamsApiModel>(); if (model.ContractParams.Count > model.TokenParams.Count) { foreach (var item in model.ContractParams) { var param = new Variant(); if (item.ValBool != null) { param.V_boolean = item.ValBool.Value; } else if (item.ValDouble != null) { param.V_double = item.ValDouble.Value; } else if (item.ValInt != null) { param.V_int = item.ValInt.Value; } else if (item.ValInt != null) { param.V_int = item.ValInt.Value; } else { param.V_string = item.ValString; } listParam.Add(param); } } else { foreach (var item in model.TokenParams) { var param = new Variant(); if (item.ValBool != null) { param.V_boolean = item.ValBool.Value; } else if (item.ValDouble != null) { param.V_double = item.ValDouble.Value; } else if (item.ValInt != null) { param.V_int = item.ValInt.Value; } else if (item.ValInt != null) { param.V_int = item.ValInt.Value; } else { param.V_string = item.ValString; } listParam.Add(param); } } transac.Amount = BCTransactionTools.GetAmountByDouble_C(0); // количество токенов фиксируем в параметрах if (model.ContractPublicKey == null || model.ContractPublicKey == "") { transac.Target = SimpleBase.Base58.Bitcoin.Decode(model.TokenPublicKey).ToArray(); // в таргет публичный ключ Token } else { transac.Target = SimpleBase.Base58.Bitcoin.Decode(model.ContractPublicKey).ToArray(); // в таргет публичный ключ Contract } transac.SmartContract = new SmartContractInvocation() { Method = (model.ContractMethod == null || model.ContractMethod == "") ? model.TokenMethod : model.ContractMethod, Params = listParam }; } else if (model.MethodApi == ApiMethodConstant.TransferToken) { transac.Amount = BCTransactionTools.GetAmountByDouble_C(0); // количество токенов фиксируем в параметрах transac.Target = SimpleBase.Base58.Bitcoin.Decode(model.TokenPublicKey).ToArray(); // в таргет публичный ключ токена transac.SmartContract = new SmartContractInvocation() { Method = "transfer", Params = new List <Variant>() { new Variant() { // адресат перевода V_string = model.ReceiverPublicKey }, new Variant() { V_string = model.Amount.ToString().Replace(",", ".") } } }; } } return(transac); }