/// <summary> /// The main. /// </summary> /// <param name="args"> /// The args. /// </param> private static void Main(string[] args) { var repository = new RestIotaRepository(new RestClient("https://field.deviota.com:443"), new PoWSrvService()); var bundle = new Bundle(); bundle.AddTransfer(new Transfer { Address = new Address(Hash.Empty.Value), Tag = new Tag("MYCSHARPPI"), Timestamp = Timestamp.UnixSecondsTimestamp, Message = TryteString.FromUtf8String("Hello from PiDiver #1!") }); bundle.AddTransfer(new Transfer { Address = new Address(Hash.Empty.Value), Tag = new Tag("MYCSHARPPI"), Timestamp = Timestamp.UnixSecondsTimestamp, Message = TryteString.FromUtf8String("Hello from PiDiver #2!") }); bundle.Finalize(); bundle.Sign(); repository.SendTrytes(bundle.Transactions); Console.WriteLine("Done"); Console.ReadKey(); }
public void TestAggregateTransactions() { var fragmentOne = TryteString.FromUtf8String("TestFragmentOne"); var fragmentTwo = TryteString.FromUtf8String("TestFragmentTwo"); var bundle = new Bundle(); bundle.AddTransfer(new Transfer { Address = new Address("RBTC9D9DCDEAUCFDCDADEAMBHAFAHKAJDHAODHADHDAD9KAHAJDADHJSGDJHSDGSDPODHAUDUAHDJAHAB"), Message = fragmentOne, Tag = Tag.Empty }); bundle.AddTransfer(new Transfer { Address = new Address("RBTC9D9DCDEAUCFDCDADEAMBHAFAHKAJDHAODHADHDAD9KAHAJDADHJSGDJHSDGSDPODHAUDUAHDJAHAB"), Message = fragmentTwo, Tag = Tag.Empty }); var expectedPayload = bundle.Transactions[0].Fragment.Concat(bundle.Transactions[1].Fragment); Assert.AreEqual(expectedPayload.Value, bundle.AggregateFragments().Value); }
/// <summary> /// The main. /// </summary> /// <param name="args"> /// The args. /// </param> private static void Main(string[] args) { var repository = new RestIotaRepository( new FallbackIotaClient( new List <string> { "https://invalid.node.com:443", "https://peanut.iotasalad.org:14265", "http://node04.iotatoken.nl:14265", "http://node05.iotatoken.nl:16265", "https://nodes.thetangle.org:443", "http://iota1.heidger.eu:14265", "https://nodes.iota.cafe:443", "https://potato.iotasalad.org:14265", "https://durian.iotasalad.org:14265", "https://turnip.iotasalad.org:14265", "https://nodes.iota.fm:443", "https://tuna.iotasalad.org:14265", "https://iotanode2.jlld.at:443", "https://node.iota.moe:443", "https://wallet1.iota.town:443", "https://wallet2.iota.town:443", "http://node03.iotatoken.nl:15265", "https://node.iota-tangle.io:14265", "https://pow4.iota.community:443", "https://dyn.tangle-nodes.com:443", "https://pow5.iota.community:443", }, 5000), new PoWSrvService()); var bundle = new Bundle(); bundle.AddTransfer( new Transfer { Address = new Address(Hash.Empty.Value), Tag = new Tag("MYCSHARPPI"), Timestamp = Timestamp.UnixSecondsTimestamp, Message = TryteString.FromUtf8String("Hello from PiDiver #1!") }); bundle.AddTransfer( new Transfer { Address = new Address(Hash.Empty.Value), Tag = new Tag("MYCSHARPPI"), Timestamp = Timestamp.UnixSecondsTimestamp, Message = TryteString.FromUtf8String("Hello from PiDiver #2!") }); bundle.Finalize(); bundle.Sign(); repository.SendTrytes(bundle.Transactions, 1); Console.WriteLine("Done"); Console.ReadKey(); }
/// <inheritdoc /> public async Task SendMessageAsync(Message message) { if (!message.HasKnownType) { throw new MessengerException(ResponseCode.MessengerException, new UnknownMessageException(message.Type)); } try { var bundle = new Bundle(); bundle.AddTransfer( new Transfer { Address = message.Receiver, Message = message.Payload, Tag = Constants.Tag, Timestamp = Timestamp.UnixSecondsTimestamp }); bundle.Finalize(); bundle.Sign(); await this.Repository.SendTrytesAsync(bundle.Transactions); } catch (Exception exception) { throw new MessengerException(ResponseCode.MessengerException, exception); } }
public void TestRestrictedMessageCreation32Bit() { var expectedPayload = new Bundle(); expectedPayload.AddTransfer(new Transfer { Address = new Address(), Message = new TryteString("AQRAQLYEXHTXQUVYAXBDJZFWM9QPHXNQRVVGEODVNZAQMPXIHVYDFLHKDBFLSEUDGHVGNYFLEBQTJORJ9BDWXYUBYQDBKYHXGCIRVRJLLRQCBFSYYFTRVRPYJTHIIOOFDISBILGHQCWXSNLRXRKPTBSBO9ENPHHCSTPGFEVK9GVOWCBTJKVRANFBPHEOQNTJJQNYWQSYYRXZMFHADWUQJVBOLP9BUV9PXUIAKDUGRICOLQXXSXNGNMUMBWJRJDBSUJWSPGLXMHBLUUSSWSQUTSWKRRPWURYJYHRHSRCLBEBMHKVFJMLYDDEIHHBCAZYLLNGMFTUSUZA9VAWSSFSKLDIFYDDZJXJZ9VRIADVEAPMRBBUAOJCWCWMBUEVGBFMXPHQEE9JNPLLSDBDJSLXZXISGDOAMGQSVMOMKOWTWJPYCDKXRRBBKLPJRJMN9LJZQZADQQYXNBNFQDBITXBXPSMWDNNJAODPSEJRQZCKTLSOLUIMOWXZHYXJOXAGRJC9NNGWLYY9VQYW9IYFCQWDZQJDNWHVIXEIYSHTSOGRHMPQZ9YUTWDCRUEZGJTKVDRFNZVRBVAJBBNHILDFSBPNJKBUVXW9CDOEGVFPAWUZROYEBYT9NHI9DNGLHWPSKMJELJSMVTRNGEJNAMNEWUQ9GSRANMRIEB9GWXJD9GX9EHTRNYEYZJFKALYJVPUITHKGMM9QJDOKHWXQ9YN9ZBBCRNESWWBPWZIQVGWDQSRVROIRTPK9STFWRDDUFDKSLQQOXRWSSQCOHIJUJLPOBUVNWLOGGXDMEFOQHXSGQOZVQGYLUABLBJHXZRRIB9ZTLAXHHSRHAODYTSDTJUGRWVDJAJNRNDL9YVEPKLVAQFPAONMKOHHCLAZWFTAZTMEQKGNMNBYHBGNNOV99HCMQDRZEGGPAWA9FFO9SESTP9TSFXLCYPJJ9JKROY99VVHENCHSSSXKDAFRGOKAKIWCOHXYNFPKKWCBSGENRBX9FQFBITIO9999USHGAMQMBYPYPQANDGZXIPYVFZCTRGALNR9XGZBYAKQYIJDSBTWHIJQMOVOVBVCRUXZD9IGMODZPXLGTKYOWRVQC9YYVVBVMDRSUUPJDJUMLNCPGZJLTGQPQOXKGKUWASQQ9AER9JLWMQA9GLPATMVRDFIWLC9GBIKRXGJSZLPZVKGTWIIDCGXIDKMLQTCWTPICN9UZZXEOFFCQSJPOXFSCEHJNGIGOYIFZFMPWHJOFZGIYRFWOZCSSHKPWHDEELMN9ZWULHRMRHVNGTNUEZEMRINSVYEGBOJMNYFWNLFSIHHRIFXZRLEGFIEOT9WYZQXFTKXRAYRRKDV9VYUBSZAKARAIZYDWBEDLLOCAXQZIXSIRFGCGZWVRRCME9TXPTDUYLYUGLIBENQ99SDQLYFBJZHGQYQBLJMLFZLQLPHYMCFMTOSDA99DXAMCEAMBGNFFDJIKTUCBHSYKH9KLRVBYXOJJYKZYXJLIKIZFQHNFWWNCQACXZIXDLJXNU9UNZQJMFLJJXGSEPXIFRDKSUENGGELMFPVQKHAYPHMIPHVKZTNFTWMERRTVFHJLKILHRX9XSVYJZQKQXIMIMPDGCNXZKXUBNZOVXMCZXGXZTVBTIQUZ9GDQJGIHFKFXYZHDNGPIUXLIKSDBQQNMJCVRJUKQVJWGOFOBTXDSFLM9BGYZJREIBUBEVCOME9NNKHFEKWGJRTMZFDHFZY9YHTFJNCNZBGMVEEKUYPZBYQQFVVZEFSQDXOWTNUSU9GUTS9ITJAYYELPZYITWELVOAKMPTUIL9UJD9TN9HVLIYWAHMQBIHLUSBRSAGXQRAOOKGIBYMM9AOLC9DQVMNFMPGDSQUTWMRKVKE9FRZNCQJDVDKBINILRFKBEEDZTWI9UUCNLIMT9MLQRMBRJQLKHJXEKWJDEK9WAKXUJVWMUNLBUSVYSUZDOIEJAKZZOWPQFNKDLPDICGTQKOSBPWKHGPBUWYXWYVPIOIELDLIBPI9FJRSHVEKRNMQ9VPOCCCASWKL99TZCFNHLHVMOOFNBGSRXYKCKJOLNEBYAFCRMDHOVWUZ9MIFDSRRFSHSIWIN9WLLXMOKCXYTTESFZUNMQAHYVOVQQH9YZVOQATUPEPGCCGTPBAAOSPJ9ALPYXONR9OCODZDJPNPMQIREEXICFQIWRZ99OPS9ALP9GLPTTWGRJHATSJJTEKFZDJYEUKBIAACLOALTSXWCCL9GBUTWIXVEW9HYLVKRRRAATNYMGSAKLUN9HJQPIMXJOYIDXNONMHXZUGXOFIQIFBTPYDXXMKOAUUNOJU9IIXFLSSWKOCRJKXNWKKAMJRMFYSMAOWSCI9NTRQKT99CIDHJMZWSDKAIKOYWHSCJZRQWWDZOC9TKXHXCDN9GTMMGXXHXIJFMTCQFTDAKPEPQLNVCIE9UMIYXHDQUGPJSHPMRFCHMPGOYHVATXBIGOCZAFDNTVMJRJIVQDLNQYNSASMLXPSFUMYBGHXTCFYDLOGOCDTWPZMVPKMP9EEXEKNMSTEQKFZIVU9DKHSEQA9XQNOKUK9ABSTZ9XRPDMDECMYRRGSYHEZDAWEDGTQSMRC9DQ9FUWS9QELTDYZCRFYABZKVLCFGVKYGYIWJGNQKI9ONMXWFJNFIEPZRSSLNUUQOXK9YXQYMWR9B9UAUXYYONKYUG9JAJOUMLKQOXBD9JBLAQHXBJINNLBXKYGYLPRLASOFISEFXG9KENN9YFFP9J9NVVYKAEFAUTIQRDTVKVHQYEWJOGQEUPSWEIMYWYYEZRGJUEDAHDYPQEGX9KTUODLORTCJZGJCKFGEJTWRGEACRRINEQBUWS9NUPP9BMONGQQABVGBLRQXZJYXDHS9DFWAWLOZVKSDZD9UGBPKDCHLYEAUOABXKMNWTSUZTHTZBYOALUHQHSEK9WPGWGVNQEGVDDFZJXLAYINRUQYQBROPB9RGAFWMPOBOANCGW9DJJ9NUIHLQE9RNZOHLPYAIACONJXYFRBAOVJEWOTO9HZCZOVJGHQOGGJAB9QUWDRI9KLX9EGOHGTJIYQHTTMAAETKGBLDQXGRTJOEHRIAPXACPFTVGIXUJFZXUCX9EHUESMGQN9EHXEQTSKJHWDIR9OJYP9USDPWECONYRTFZREIZHOBAOXK9FCEOWCLUNKEWKE9JPQGDZ9PWAVQUMNBLVMESODMGJAIVNVJSFTQFL9RTTCJAFIMIGXASIREOXLNVEHMHPQZIKIPRQWFGYLQHVPMBNIWTWINSKW9WIWVDKHAIHNMBOCETYLNTJMA9XMEVQBPUFPKXJHXHPQCFKF9UYQQFKBBPPZMNAKPMMHPLBPDAOACLZ9HKVFGGMQHHHQLWYWYYGNXPEITKTVNURENFBAOBXITZDYCUSASIYEVJBYDLBIMUF9HILXKYH9IDYOFEQMBHJJBFDTNPDXSNSXCPUFGRIOXNYOSKHBILRWEFWZELL9GLNQOMPLMAPTOIJXSQXNPIW9XLMYEYVTNM9BVLVAIPZSYTCHHXGBQXHCBOQAUHZXKDWUREOOGKK9S9ZTKHGIQWHZOOFCGXBBCSYPGOGNRJLGVNWAGJZWKKLTHCJG9FJVRXMHQARRAHGUTITDDIMTIZAYARKJMQFCEAAOTHSHXDQKSNGMN99YGWRNLNMJXXFIQD9THOIHINYIEJMWRCZTAHJC9QIAKDIHIELNIMDKHFFWVCAHGMITJYNZ9XZSLFCGFFEQLONULNTQAJLOJTWO9BJQEBGTY9OCJBXKXNDEJWCDRYCNFDKYODHPAHQBGDXHMLVETVNRLRIJDHKAHZBAOFGMQFSTHPHBXKRAJFVIUDCKGNCDD9XTFDVNW9RLRNN9QRRUGOTMRRSVISCWE9ALTXCOCYHIQGXLGDB9RGICVSTUHJFWMWQCUICLJZCACGYCUHMGTGEJGAACGEXKJNJWKUGXRNBTEKIYUNXZZHXASCBPRDJAVXWESHU9DW9UVPJLWBKUXPDAIQ9JQPAHPMGVRUY9RLAMRTOKDVVUAZAPMNBSHRNNYDGC9BKAKKBPGHFDOHXCFWNSH9FZUMQHXMIUYKQLKHAYXPNEDYDUXTZXUKTBRJGBSZFMCNRZIQQLOLPRZPZBCX9EZBRUFGHGHBLYBLYYWZACGWGYRGV9IGZLTXOIMSCOTBNIGUXMOPVOFKIEUZASTZAHKXLYECJFLVZCORRFYDNVCYSKFCREQXXMDEHPSQFDERBICWFMOJS9PPSQYTVEXYSYGHWIWITZHRBZLHJWUYWQCAPLSBYJTJGCUXQPITAUJX9WEUVJDNUNKSDLHWDWKDQARSRKSLGLUCDNCERMKOJXCRXWCCYIAQZVGJLYTYQNGUDYYMXXL9XDBLEWPRMAY9DMMUHYUPMNBRRXJDIFDWEFJBRPYMPDPIPGXGXBMZ9JHAOISUMCNGUNCCPWKFJNBR9ZATRMDTOFDKMBQEZSCDSBNNEIUUCDHPHFBOBXLNGPOVZCATQRKVYSQHSHIVFZTW9BHPTPXUJGNNUBHWLZF9TBA9JONTWZRWHGHFIQGHAKSWBAHB99"), Tag = new Tag("ASDF"), Timestamp = Timestamp.UnixSecondsTimestamp }); expectedPayload.Finalize(); expectedPayload.Sign(); var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI"); var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, new InMemoryIotaRepository()); var channelKey = new TryteString("NXRZEZIKWGKIYDPVBRKWLYTWLUVSDLDCHVVSVIWDCIUZRAKPJUIABQDZBV9EGTJWUFTIGAUT9STIENCBC"); var channel = channelFactory.Create(Mode.Restricted, seed, SecurityLevel.Medium, channelKey); var message = channel.CreateMessage(new TryteString("IREALLYWANTTHISTOWORKINCSHARPASWELLPLEASEMAKEITHAPPEN")); Assert.AreEqual("RRPXQHDJY9BKXC9NGHDCSHRIDYORSUUEPFHXPQVDGSQTVYPCGVIZRWQINOUYFDUXTHFTKHLBOLYLHMKE9", message.Root.Value); Assert.AreEqual("BAVSMNXFTVBBEPXVROQYWBFHAELANDS9UFLDEOERJGKMXOGTL9UBEJF9WUDNGKUEDFZYAAFACRRRACDHV", message.Address.Value); Assert.AreEqual("OLHRFQPHPPQWTVSZNIZEKFOB9JPWKWQQPUCNLFAVEYCL9QVXRWFTDT9KPIHERRULOOBUKTJZJWKENTPLO", message.NextRoot.Value); Assert.AreEqual("OLHRFQPHPPQWTVSZNIZEKFOB9JPWKWQQPUCNLFAVEYCL9QVXRWFTDT9KPIHERRULOOBUKTJZJWKENTPLO", channel.NextRoot.Value); for (var i = 0; i < expectedPayload.Transactions.Count; i++) { Assert.AreEqual(expectedPayload.Transactions[i].Fragment.Value, message.Payload.Transactions[i].Fragment.Value); } }
public async Task <bool> SendMessageAsync(TryteString message, string address, int retryNumber = 3) { var roundNumber = 0; while (roundNumber < retryNumber) { //this.UpdateNode(roundNumber); var bundle = new Bundle(); bundle.AddTransfer(CreateTransfer(message, address)); try { await this.Repository.SendTransferAsync(this.seed, bundle, SecurityLevel.Medium, Depth, this.MinWeight); return(true); } catch (Exception e) { Trace.WriteLine(e); roundNumber++; } } return(false); }
public async Task SendMessage(TryteString message, string address) { var bundle = new Bundle(); bundle.AddTransfer(this.CreateTransfer(message, address)); await Task.Factory.StartNew(() => this.repository.SendTransfer(this.seed, bundle, SecurityLevel.Medium, 27, 14)); }
public async Task SendJsonMessageAsync <T>(SentDataWrapper <T> data, string address) { var serializeObject = JsonConvert.SerializeObject(data); var bundle = new Bundle(); bundle.AddTransfer(this.CreateTransfer(TryteString.FromAsciiString(serializeObject), address)); await Task.Factory.StartNew(() => this.repository.SendTransfer(this.seed, bundle, SecurityLevel.Medium, 27, 14)); }
private static void CreateTransferAndAddToBundle(Address address, Bundle bundle, dynamic payload) { bundle.AddTransfer(new Transfer { Address = new Address(address.Value), Tag = new Tag("OPENEHR"), Timestamp = Timestamp.UnixSecondsTimestamp, Message = TryteString.FromUtf8String(payload.ToString()) }); }
public void TestAttachToTangle() { var seed = new Seed("QLWOWK9NBXOT9IJ9FXEAPGAHEQDDVMTQXL9DD9VOSTXKSFUABIO9AETEAJPZSNEEPQMJDLWTTMOFDVVBE"); var bundle = new Bundle(); bundle.AddTransfer( new Transfer { Address = new Address("YTXCUUWTXIXVRQIDSECVFRTKAFOEZITGDPLWYVUVFURMNVDPIRXEIQN9JHNFNVKVJMQVMA9GDZJROTSFZHIVJOVAEC") { Balance = 0, PrivateKey = new PrivateKeyStub() }, Message = TryteString.FromAsciiString("Hello world!"), Tag = new Tag("CSHARP"), Timestamp = Timestamp.UnixSecondsTimestamp }); bundle.Finalize(); bundle.Sign(); var branchTransaction = new Hash("QINJZUOQGRRIKZJIKWJRBHVLQPKKGKGRODPMJXZZVZKNNVIGTYELWSYWRESO9JNZYSJBVYANLFVIZ9999"); var trunkTransaction = new Hash("CXTEVCPNIEMITBQAVKWAQNZMVCHOZPTNQHGHQPSQDXEGWKLHDXLZUDEVOBONAEJJTFDGDRAXDVBUZ9999"); var restClientMock = new Mock <IRestClient>(); restClientMock.Setup(r => r.Execute <AttachToTangleResponse>(It.IsAny <IRestRequest>())).Returns( () => { var restResponse = new RestResponse <AttachToTangleResponse> { StatusCode = HttpStatusCode.OK, Data = new AttachToTangleResponse { Trytes = new List <string> { TransactionTrytesWithPoWDone } } }; return(restResponse); }); var repository = new RestIotaRepository(restClientMock.Object); var result = repository.AttachToTangle(branchTransaction, trunkTransaction, bundle.Transactions); Assert.AreEqual(TransactionTrytesWithPoWDone, result[0].Value); }
public ActionResult SendMessage(string Message) { //connection to a iota node var repository = new RestIotaRepository(new RestClient("http://node04.iotatoken.nl:14265"), new PoWService(new CpuPowDiver())); User sender = HttpContext.Session.GetObjectFromJson <User>("User"); Connections connection = HttpContext.Session.GetObjectFromJson <Connections>("SelectedConnection"); //set refresh bools if (connection.UserA_.Name.Equals(sender.Name)) { connection.Refresh_B = true; } else { connection.Refresh_A = true; } //updating entry _context.Connections.Update(connection); _context.SaveChanges(); string sendingAddress = (connection.UserA_.UserID == sender.UserID) ? connection.AddressB : connection.AddressA; string encryptedMsg = Utility.EncryptString(Message, connection.EncryptionKey); Transfer trans = new Transfer() { Address = new Address(sendingAddress) { Balance = 0 }, Message = TryteString.FromAsciiString(encryptedMsg), Tag = new Tag("CSHARP"), Timestamp = Timestamp.UnixSecondsTimestamp }; Bundle bundle = new Bundle(); bundle.AddTransfer(trans); bundle.Finalize(); bundle.Sign(); //sending the message to the tangle var resultTransactions = repository.SendTrytes(bundle.Transactions, 27, 14); return(RedirectToAction("ShowSpecificChat", new { connection = connection.ConnectionsID })); }
private static void SendToChain(string address, RestIotaRepository repository, string message) { Seed seed = new Seed(address); Transfer transfer = new Transfer { Address = new Address(address), Message = TryteString.FromUtf8String(message), ValueToTransfer = 0 }; Bundle bundle = new Bundle(); bundle.AddTransfer(transfer); int depth = 3; int minWeightMagnitude = 9; try { var sendTransfer = repository.SendTransfer(seed, bundle, SecurityLevel.Medium, depth, minWeightMagnitude); //TransactionHashList bundleTransactions = repository.FindTransactionsByBundles(new List<Hash> {bundle.Hash}); //foreach (Hash transactionsHash in bundleTransactions.Hashes) //{ // Hash hash = new Hash(transactionsHash.Value); // var transactionsTrytes = repository.GetTrytes(bundleTransactions.Hashes); // var transaction = Transaction.FromTrytes(transactionsTrytes[0], hash); //} TransactionHashList transactionsByAdress = repository.FindTransactionsByAddresses(new List <Address> { new Address(address) }); var transactionsTrytesAddress = repository.GetTrytes(transactionsByAdress.Hashes).First(); Hash hashAddress = new Hash(transactionsByAdress.Hashes[0].Value); Transaction transactionOne = Transaction.FromTrytes(transactionsTrytesAddress, hashAddress); TransactionTrytes transactionTrytes = new TransactionTrytes(""); TransactionTrytes test = transactionOne.ToTrytes(); var text = test.Value; } catch (Exception exception) { Console.WriteLine(exception); //throw; } }
/// <summary> /// The create bundle from payload. /// </summary> /// <param name="messageAddress"> /// The message address. /// </param> /// <param name="payload"> /// The payload. /// </param> /// <returns> /// The <see cref="Bundle"/>. /// </returns> private static Bundle CreateBundleFromPayload(Address messageAddress, List <int> payload) { var bundle = new Bundle(); bundle.AddTransfer( new Transfer { Address = messageAddress, Message = new TryteString(Converter.TritsToTrytes(payload.ToArray())), Timestamp = Timestamp.UnixSecondsTimestamp }); bundle.Finalize(); bundle.Sign(); return(bundle); }
private static Bundle CreateBundle(TryteString requestAdressTrytes) { var bundle = new Bundle(); bundle.AddTransfer( new Transfer { Address = new Address(Seed.Random().Value), Message = requestAdressTrytes, Tag = Constants.Tag, Timestamp = Timestamp.UnixSecondsTimestamp }); bundle.Finalize(); bundle.Sign(); return(bundle); }
/// <inheritdoc /> /// Send Trytes can be used to send messages to any address without providing a seed. Call SenTrytesAsync in async context /// /// 1. Create a bundle and add a transfer without any value, but with a message /// 2. Finalize and sign the bundle /// 3. Send the bundle. Note that the minWeightMagnitude was set to 14 for faster PoW public override List <TransactionTrytes> Execute() { var bundle = new Bundle(); bundle.AddTransfer(new Transfer { Address = new Address("ENTERAVALIDADDRESSHERE"), Message = TryteString.FromUtf8String("Hello there!"), Tag = Tag.Empty, Timestamp = Timestamp.UnixSecondsTimestamp }); bundle.Finalize(); bundle.Sign(); return(this.Repository.SendTrytes(bundle.Transactions, 2)); }
public string PublishRouteProof(Route route) { try { _logger.LogInformation($"Proof for route {route.Data?.Name} started"); var start = DateTimeOffset.Now; var tangleProofRoute = JsonConvert.SerializeObject( new TangleRouteProof() { Hash = route.Hash } ); var address = _iotaRepository .GetNewAddresses(_seed, 0, 1, SecurityLevel.Medium) .First(); _logger.LogInformation($"Address for route {route.Data?.Name} generated. Took {(DateTimeOffset.Now - start).TotalSeconds}"); var bundle = new Bundle(); bundle.AddTransfer(new Transfer { Address = address, Message = TryteString.FromUtf8String( tangleProofRoute ), Tag = Tag.Empty, Timestamp = Timestamp.UnixSecondsTimestamp }); bundle.Finalize(); bundle.Sign(); _iotaRepository.SendTrytes(bundle.Transactions);//, 27, 14); _logger.LogInformation($"Proof for route {route.Data?.Name} finished. Took {(DateTimeOffset.Now - start).TotalSeconds}"); return(address.Value); } catch (Exception e) { _logger.LogError(e.ToString()); throw; } }
static Hash AttachChunk(byte[] chunk) { var bundle = new Bundle(); bundle.AddTransfer(new Transfer { Address = new Address(Hash.Empty.Value), Tag = new Tag("MUTSI"), Timestamp = Timestamp.UnixSecondsTimestamp, Message = TryteString.FromBytes(chunk) }); bundle.Finalize(); bundle.Sign(); // see Getting Started to see how a repository is created var result = repository.SendTrytes(bundle.Transactions); return(bundle.Hash); }
public static void SendBalance() { var s1 = Seed.Random(); var s2 = Seed.Random(); var repository = IotaRepositoryFactory.Create("https://nodes.devnet.thetangle.org"); var nodeInfo = repository.GetNodeInfo(); var mainDevnetSeed = new Seed("PHIDOZJCOJGGYHMP9DPZQGHXYCBMJEJWESNEXGAEUY9OGUOKKUYYEBREJBXRWRSHCWSFPILJBPVCDKGVA"); //var depositSeed = repository.GetNewAddresses(s1, 0, 1, SecurityLevel.Medium); //var mainDevnetSeedsenderBalance = repository.GetAccountData(mainDevnetSeed, true, 2, 0, 5); //var senderSeed = new Seed("VJEFRYYWLYMKGGQPERQISOAIJRCLKDJKDYFPQYTAEKQVLEFTEYKYKVSEFBWBCLVNBUPNYCUDNXSJQLKWV"); //var recipientSeed = new Seed("NYLBCMVKSWQJCIVWUSHLOYRAGGJQTMUOUXJKQTT9LYIV9ZWTYANOWRFTUKNVPVEJGHUXNPAPNCSKLFSAC"); //var senderBalance = repository.GetAccountData(senderSeed, true, 2, 0, 10); //var recipientBalance = repository.GetAccountData(recipientSeed, true, 2, 0, 10); ////Generate one new recipient address //var recipientAddress = repository.GetNewAddresses(recipientSeed, 0, 1, SecurityLevel.Medium); //Prepare transaction var transfer1 = new Transfer( address: "TJGKASWXRYEQUILZBVBYVORFXWZBOGHGOEMLZBMFYFKURXGBBDNCFFODEPZLTP9E9ZNOZDDUEPSUNIKXDIRBMM9PHB", tag: "PATRIQTUTORIALS", message: "PatriQ tutorials testing https://patriq.gitbook.io/iota/", timestamp: DateTime.Now, value: 10); //Create a bundle var bundle = new Bundle(); bundle.AddTransfer(transfer1); //Send the bundle var result = repository.SendTransfer(mainDevnetSeed, bundle, SecurityLevel.Medium, depth: 4, minWeightMagnitude: 9); //Check the result in Tangle Explorer Console.WriteLine("Link to Tangle Explorer: {0}{1}", "https://devnet.thetangle.org/bundle/", result.Hash); }
/// <inheritdoc /> public virtual async Task PromoteTransactionAsync(Hash tailTransaction, int depth = 8, int minWeightMagnitude = 14, int attempts = 10) { if (attempts <= 0) { return; } var isPromotable = await this.IsPromotableAsync(tailTransaction, depth); if (!isPromotable) { throw new ArgumentException("Transaction not promotable (anymore). Try to reattach!"); } var promotionBundle = new Bundle(); promotionBundle.AddTransfer( new Transfer { Address = new Address(Hash.Empty.Value), Tag = Tag.Empty, Message = TryteString.FromUtf8String("Tangle.Net Promotion"), ValueToTransfer = 0 }); promotionBundle.Finalize(); promotionBundle.Sign(); var approveeTransactions = await this.GetTransactionsToApproveAsync(depth, tailTransaction); var attachResultTrytes = await this.AttachToTangleAsync( approveeTransactions.BranchTransaction, approveeTransactions.TrunkTransaction, promotionBundle.Transactions, minWeightMagnitude); await this.BroadcastAndStoreTransactionsAsync(attachResultTrytes); await this.PromoteTransactionAsync(tailTransaction, depth, minWeightMagnitude, attempts - 1); }
/// <inheritdoc /> public async Task <TryteString> PublishInvoiceHashAsync(byte[] document, CngKey key) { var payload = new InvoicePayload(DocumentHash.Create(document), Encryption.CreateSignatureScheme(key).SignData(document)); var bundle = new Bundle(); bundle.AddTransfer(new Transfer { Address = new Address(Seed.Random().Value), Message = payload.ToTryteString(), Timestamp = Timestamp.UnixSecondsTimestamp, Tag = new Tag("CHECKCHEQUE") }); bundle.Finalize(); bundle.Sign(); await this.IotaRepository.SendTrytesAsync(bundle.Transactions, 2); return(bundle.Hash); }
public void TestRestrictedMessageCreation64Bit() { var expectedPayload = new Bundle(); expectedPayload.AddTransfer(new Transfer { Address = new Address(), Message = new TryteString("AQRAQLYEXHTXQUVYAXBDJZFWM9QPHXNQRVVGEODVNZAQMPXIHVYDFLHKDBFLSEUDGHVGNYFLEBQTJORJ9BDWXYUBYQDBKYHXGCIRVRJLLRQCBFSYYFTRVRPYJTHIIOOFDISBILGHQCEWSNLRXRKPTBSBO9ENPHHCSTPGFEMQEWXEZ9BZIX9ICPGKLXKRGBFGUVVAUEJLXIXMDUOTZREGMSDVULQDHGQSLIHOAXHHXOZZDJUKDA9PBIXS9VAQVWVBYYMOGTCRXWSGIPAWRVVMDFLC9ZWARUVVGAHOTV9CBKAWZOLABYTYWRHPGYRIEOVCASDPBNXPVEQ9EASXF9IACICBBDBGGBQ9TXMMRGU9FFFWJEREBQTVXRRYTXG9HTKVNQPCJGEWIPKKPUETECNQFVDJOXNAHVGQKRWJLTQMHGZRWMCIIXVEPQGKYUINQB9ZVBORKPIVV9NXLFZVSBPDDYRCISBASVZJBBNXYARAOANTKCQNEZBAATBWSVBVVISHCYBBLJLYQUCRZVKASMHWTEFRKSQNUZ9YOFNWMZUJ9ZWGZYLVDBIOIUQKHLPEQHIF9FISNHLR9TDCBPQNUHM9RTGMVARZKKHISYKXTV9BSHDJNGUJY9OLMSKBFWPCOXJHAFAMRBIN9UXRKRLNODKIDLXRWFMQF9OWRYADJLEUQTAYYOLHQFFOWIYNMAG9NI9MKDMTDCKUGKJDPLWDWDRWWGCHYTKMTBPWYVBYYJXEHHLDZXOCGWSAFCAJDDIG9CLVRYGBQTBWXDFUJIXHODHT9INSECIDTNFXFLIZTFCYKAMMJGQPHNHYNBESVPSHXNYAVICPWEWGMT9RC9DXXALHMBPVKRPOXHOZVPKXPOKTPZLBWSUNXOHIKTICJDZVGLREREL9TDGAOMHRBZTZXKTIUFRPVY9SGQZZKPAHPZJEQJ9VF9EVOJHIXEPANATJVJVONHQK9XF9PDZSILBRXIYWVBGBMROQGI9AOCW9RVFXCOQCKJBMUWPOYAXDRC9G9XWRVJTMO9ZHDJTYKRQUJGMOTSUTVXOPYZK9KOZZNWNCNSWOSF9DLHPLSALNLZIU9KLXABKIQXNHHEOLRJN9HVTEXWPH9C9OTOCETMHJVQKHBFQEFJRBSYIZEUTRXHQJJYMCCURTSWAMDEASTTFVRYCDYDDUVKVHUVZPYSNEOXVXUEGENTIDFITOYTZEHLAARKPZBDXMUAWGOLRERABFSNFUHWIHQSBNKCFPCVRRIFOCYYSRVGEXYT9DKLWDMICVPQLZGFELCGKQLLBNRIXGUQBSLAKKWJUQKZNTPPQPHNSDHEYMWPIOSWTYWPSCAAQAYYIQ9LXXEBN9FSYFJTLHGZTDOSXFXAQLUNVS9IAJZOMXFRLWRLACPHXCUGARGBACABDUUXFHPURNAKQDDYUCQMQLGOEYDUEULPFVP9WBWFZYSXQOSHZQTEGBMTXBNFDOSMSNUQ9MHCPMINTTBWZKHUTSTDAXMJJNJZABAHLZVVLNIOAZQLUA9NQGGFBKO9GECCVFFLCUCOBIRMBXWWRWMPOVHNDFN9LG9BQJMWLVYFPCMO9HQTU9ZVXGKVVHQHDWYLAIRVUBCSFBGOGLP9DMNYKHLBSF9ZRICQSN9EBDCPUVYWSKZBNJYZECKC9GCRTZAL9NPWOFJUADDBGSKJIIDTLDJLQSGQDGA9QZGLABGXYVHLYVFATWOQHAVS9UWAMEU9VZTNFMDUZPMYRYPECPY9NTSS9QMSAJCLWCXOQZCHQFJOMW9FHUWKEPTZV9KCTWZTBGOWFFHOBSEIIQZ9FXEFPPVQRZLASCEAVVJWCZNUQMJEZCFO9UVOLPAPNJPOEEXYBAGGGUXOB9QUTCVAGDSYIKLDOAFNXSLHJST9QLOITR9RDWIBYNZVH9P9GGH9EJGUUAITTNCJCAPRLSFLUVEHVGNEF9QILNTUMYAFCZMMNLDTHKPJZAYUXNLIRSRIPELTXVBDNKTAEIETHHAMWLDORDRGQTRTBXKRYESYOWCID9NPUKCHXYORUIDMPUDVUWZVLYSIIAPTTTHYRWLGJIYHMKAU9PXGMXT9PFEWXXNXEXYRGUPVQ9ZVREQHHQMFJWJSFLVORIVDAVDRENFMZHYHDJSYCOLWB9RTAFXVKBWMSRGVLMHVHQJDNHPIVRDUSRKSYBZWBULB9QPFDEXQNLX9INXGLDQIJCAVSLNNRJSHOLQASBZTQF9QXV9QLHIPXLACEEEDEXTBJF9HNRWDLNQUIONKWXFST9NNXOAPNYHFOJWFTLFJEPTABUVUMVSGFQFANEKMVTGGFINNJSSWDXNJEVYBAPRLQQKOOJBDWSEMSUHXRCFBJTFFAKIYAMGAXCGAXWPFPUGCTWOPOMWJFGPKKYRYLWLVENOWPPNUQZEBLXEYAFQXTANUDHXYPZMXMMICYEZ9VONFTMYHMBWCJWW9HFSKZMPLOIHMTAXZGBNPEMDHYZHYLGYCJFYBYFGZILZPQ9UETUKNVPLISIALLJSRJNOAKFTL9DYDWNFBYSOBOCTCAVJGXTTLGLQ9SCMCHSFTDJXSKGHHZAEGGJUMYGB9IIELEGDSBLZKMTJJSYJWZCJWEKNGDX9PAQAOPHWRUIOTELQGTFEOQBZOYWMJHAQZMCEPQRKZGPVDVKPD9HMJWVJVQRJK9JKKB9OP9IQBRSAIFVGAIWQJYPXMYGIXAYXQTLDW9OTRPKRJAPFPPNPWQKSPUZORGCLJA9YJZJ9GTGP99DCSSGN9WT9WQAVTJBAZZASKTSFZSDLKXEJDSXTMGQMLWWZSDDWSPBZEZOERBQZFDYFKFQLWOOXDSKTVJALTYRMFAHVZFGVNHR9JQUNXYCC9ZBHGBVQLEQQFYXIFMGZRHKZM9XYFNU9JFHOZPHZPITFOLQZOVEJWQVP9JBIVQJKGUVSGADFYGSIZNAWWGZMDDGNS9FVROUFLLLOFFSRQIFMIHWOSCSDGDVA9XKBYMHIPPHHTNJBSZJYHNVWMBOUW9RYNNSJERIRCEAZGFREYUMZXGYCCWVGPUWQLZUVVZEUJG9KBYILXFRZRTCIUJMOMEEZHCNOYRVYQVCMGMWOHRDERKZETUNHZNEQWNUJNLBNXDVPYHNIZWOTXU9ASXOOSXUDYGG9BOORBKMTXBRRLKKOZSU9JTNXAFIU9IRRXEMQYQVFJISEXPTTCUBM9NJBDXARCHEWDQTGUVIGVKEHHHAZWVIVKPUWUGFW9KHXDGIKLOCLEATBNHYOCZXEFQKQUOVRNVHMGXJIBLNFETCYPZMRBBMLMKWBOWWLYXVEUYSNKSWTLPBDVWJDLKCUJVTORYLGRZZXDBQHBFLOAXVVRCSNCDGPDLQMNMWWJSXEHSVINRKCBBENJHJRIMXVGMQJDUROBI9YMIQDTLSUHETANLIALPSDTTAJWQKNLWKUOCUEKYRCUODUMABILWL9YP9KZEONKRHBLJFAVEVWTZDFICLLFMUFZVPWKYLCLFQKS9JFOCJC9LRJESEPMWYHDC9ELBQLPDKVEFMGEL9TBDAAYUMGRZ9YCGXALWJZX9MNHBSRJYNP9IARGKIZCCYKLNSMUB9AZWHSINIMPFCTSMMPKVHYHRRENSZZXVBIKMVPMTKSOBPQ9PMALTOV9GDPKTWAE9KTDYOA9NNANSQQOJECKEQ9ZBRDISIUZCAWSJGYCOPEIGMJBVBVQGWTGPAHADULEPFM9ALNCIXWVSCBVQRHQANTLDVEXMAOXFQDDUQYNZOHHFBIAEENWZWJXVQICBNZTCQUNW9AQRGAQXINGXBXOYVE9JNXYGUHSUFLPADVPJUFMECKHQSIRRDNBYSOOZK9GKCK9HTDLANJUAJZQVLNVGZRLXBIYLGUVGCZDY9OCBIOPPTBZMGV9OUCKGREHCVXDCZBSU9IXKONSZFKDQBWUFDEEZVBPMFKOTPFLBGPMSMZVGBRHOQHNMGUN9I9GQEBAPXBFLPNBBSP9MCVEDSOCVIDEZCNQUEHZVJTDMEOVFUFYRGCPBOOVQGUYQYCBMRJBTLVXRSVIKJQRPOPNOOGUFGHGYW9QDLPVRYRDTEDICCLR9WEZXFLVUNMAEMFLHHNHDSXVHPLBLGOQTVKDAHUCMDTFYTJATAEZRYEDIBJPOFTFCIAEUL9XAUUIBQCRBDTMEPWVGTSBODMHBYRWLBJIRVIDDXAKDHSQFIXYBHMHNLQLNYPDQFCMETQZNJCJZZYAJCBDUYXMXBPVQJZCXNGFXOSLDHJSZY9CHNXVDEJHRCIAPJRZUQ9FJHJBPYFDDGMJRQMNZY9YTAEOHRFOFKNTPWSPWPIAGWZZBM9OVRYQ9PDMSFFNWVX9ONILLWBDFXKGOBMHLWNDCXXUGFDJRMNRRHBNPKIVP9NKNBEKLIOFCNGVBTWVQ9GMPEUATEAGWMITUAZCMOGFFVTDWCFTVONROHASJHYFSXMDYDOCVRXZBUMKDZICCQFYBVDPYSABNKTUPADTWJZGKLBQWUPSEOJIITYTNYXMGBQSSUPYMTSCYLSLIZCVJTJPHBETOROBNA99"), Tag = new Tag("ASDF"), Timestamp = Timestamp.UnixSecondsTimestamp }); expectedPayload.Finalize(); expectedPayload.Sign(); var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI"); var mamFactory = new CurlMamFactory( new Curl(CurlMode.CurlP27), new CurlMask(), new IssSigningHelper(new Curl(CurlMode.CurlP27), new Curl(CurlMode.CurlP27), new Curl(CurlMode.CurlP27)), new HammingNonceDiver(CurlMode.CurlP27, ProofOfWork.HammingNonce.Mode._64bit)); var channelFactory = new MamChannelFactory(mamFactory, CurlMerkleTreeFactory.Default, new InMemoryIotaRepository()); var channelKey = new TryteString("NXRZEZIKWGKIYDPVBRKWLYTWLUVSDLDCHVVSVIWDCIUZRAKPJUIABQDZBV9EGTJWUFTIGAUT9STIENCBC"); var channel = channelFactory.Create(Mode.Restricted, seed, SecurityLevel.Medium, channelKey); var message = channel.CreateMessage(new TryteString("IREALLYWANTTHISTOWORKINCSHARPASWELLPLEASEMAKEITHAPPEN")); Assert.AreEqual("RRPXQHDJY9BKXC9NGHDCSHRIDYORSUUEPFHXPQVDGSQTVYPCGVIZRWQINOUYFDUXTHFTKHLBOLYLHMKE9", message.Root.Value); Assert.AreEqual("BAVSMNXFTVBBEPXVROQYWBFHAELANDS9UFLDEOERJGKMXOGTL9UBEJF9WUDNGKUEDFZYAAFACRRRACDHV", message.Address.Value); Assert.AreEqual("OLHRFQPHPPQWTVSZNIZEKFOB9JPWKWQQPUCNLFAVEYCL9QVXRWFTDT9KPIHERRULOOBUKTJZJWKENTPLO", message.NextRoot.Value); Assert.AreEqual("OLHRFQPHPPQWTVSZNIZEKFOB9JPWKWQQPUCNLFAVEYCL9QVXRWFTDT9KPIHERRULOOBUKTJZJWKENTPLO", channel.NextRoot.Value); for (var i = 0; i < expectedPayload.Transactions.Count; i++) { Assert.AreEqual(expectedPayload.Transactions[i].Fragment.Value, message.Payload.Transactions[i].Fragment.Value); } }
private static Bundle CreateBundle(Address contactRequestAddress, TryteString rejectedContactMessage) { var rejectedContactBundle = new Bundle(); rejectedContactBundle.AddTransfer( new Transfer { Address = contactRequestAddress, Message = rejectedContactMessage, Timestamp = Timestamp.UnixSecondsTimestamp, Tag = Constants.Tag }); rejectedContactBundle.Finalize(); rejectedContactBundle.Sign(); // calculate hashes var transactions = rejectedContactBundle.Transactions; rejectedContactBundle.Transactions = transactions.Select(t => Transaction.FromTrytes(t.ToTrytes())).ToList(); return(rejectedContactBundle); }
public async Task TestTransactionIsCachedShouldMergeWithMessagesFromTangle() { var repository = new InMemoryIotaRepository(); var transactionCache = new MemoryTransactionCache(); var messenger = new TangleMessenger(repository, transactionCache); var receiver = new Address("GUEOJUOWOWYEXYLZXNQUYMLMETF9OOGASSKUZZWUJNMSHLFLYIDIVKXKLTLZPMNNJCYVSRZABFKCAVVIW"); var payload = TryteString.FromUtf8String("Hi. I'm a test"); var messageOne = new Message(payload, receiver); var bundle = new Bundle(); bundle.AddTransfer( new Transfer { Address = messageOne.Receiver, Message = messageOne.Payload, Tag = Constants.Tag, Timestamp = Timestamp.UnixSecondsTimestamp }); bundle.Finalize(); bundle.Sign(); await repository.SendTrytesAsync(bundle.Transactions); await transactionCache.SaveTransactionAsync( new TransactionCacheItem { Address = receiver, TransactionHash = new Hash(Seed.Random().Value), TransactionTrytes = new TransactionTrytes(TryteString.FromUtf8String("Hi. I'm a test").Value) }); var sentMessages = await messenger.GetMessagesByAddressAsync(receiver); Assert.AreEqual(2, sentMessages.Count); Assert.AreEqual("Hi. I'm a test", sentMessages[0].Payload.ToUtf8String()); Assert.AreEqual("Hi. I'm a test", sentMessages[1].Payload.ToUtf8String()); }
public static async Task <Bundle> PublishWithAreaCodeAsync(this IIotaRepository repository, TryteString message, IotaAreaCode areaCode, Address address = null) { if (address == null) { address = new Address(Seed.Random().Value); } var bundle = new Bundle(); bundle.AddTransfer(new Transfer { Address = address, Message = message, Tag = new Tag(areaCode.Value), Timestamp = Timestamp.UnixSecondsTimestamp }); bundle.Finalize(); bundle.Sign(); var transactionTrytes = await repository.SendTrytesAsync(bundle.Transactions, 2); return(Bundle.FromTransactionTrytes(transactionTrytes, bundle.Hash)); }
/// <summary> /// The action. /// </summary> /// <param name="request"> /// The request. /// </param> /// <returns> /// The <see cref="StoreFileResponse"/>. /// </returns> protected override StoreFileResponse Action(StoreFileRequest request) { var message = request.Data.ToTrytes(); var bundle = new Bundle(); bundle.AddTransfer( new Transfer { Address = new Address(request.Address), Message = message, Tag = new Tag("CSHARPFILES"), Timestamp = Timestamp.UnixSecondsTimestamp }); bundle.Finalize(); bundle.Sign(); var sentTransactionTrytes = this.IotaRepository.SendTrytes(bundle.Transactions, 27, 14); var tailTransaction = Transaction.FromTrytes(sentTransactionTrytes[0]); return(new StoreFileResponse { TailTransactionHash = tailTransaction.Hash.Value }); }
public async Task TestInvalidMessageOnMamStreamShouldBeIgnored() { var seed = new Seed("JETCPWLCYRM9XYQMMZIFZLDBZZEWRMRVGWGGNCUH9LFNEHKEMLXAVEOFFVOATCNKVKELNQFAGOVUNWEJI"); var mask = new CurlMask(); var iotaRepository = new InMemoryIotaRepository(); var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository); var channelKey = new TryteString("NXRZEZIKWGKIYDPVBRKWLYTWLUVSDLDCHVVSVIWDCIUZRAKPJUIABQDZBV9EGTJWUFTIGAUT9STIENCBC"); var channel = channelFactory.Create(Mode.Restricted, seed, SecurityLevel.Medium, channelKey); var message = channel.CreateMessage(TryteString.FromUtf8String("Hello everyone!")); await channel.PublishAsync(message); var bundle = new Bundle(); bundle.AddTransfer(new Transfer { Address = message.Address, Message = TryteString.FromUtf8String("I do not belong here and should be ignored!"), Tag = Tag.Empty, Timestamp = Timestamp.UnixSecondsTimestamp }); bundle.Finalize(); bundle.Sign(); await iotaRepository.SendTrytesAsync(bundle.Transactions, 27, 14); var subcriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, mask); var subscription = subcriptionFactory.Create(message.Root, Mode.Restricted, channelKey); var unmaskedMessages = await subscription.FetchAsync(); Assert.AreEqual(1, unmaskedMessages.Count); Assert.AreEqual("Hello everyone!", unmaskedMessages[0].Message.ToUtf8String()); }
/// <inheritdoc /> public MaskedAuthenticatedMessage Create(MerkleTree tree, int index, TryteString message, Hash nextRoot, TryteString channelKey, Mode mode, int securityLevel) { var nextRootTrits = nextRoot.ToTrits(); var messageTrits = message.ToTrits(); var indexTrits = Pascal.Encode(index); var messageLengthTrits = Pascal.Encode(messageTrits.Length); var subtree = tree.GetSubtreeByIndex(index); var subtreeTrytes = subtree.ToTryteString(); var subtreeTrits = subtreeTrytes.ToTrits(); var siblingsLength = subtreeTrits.Length; var siblingsCount = siblingsLength / Constants.TritHashLength; var siblingsCountTrits = Pascal.Encode(siblingsCount); var signatureLength = subtree.Key.TrytesLength * Converter.Radix; var nextRootStart = indexTrits.Length + messageLengthTrits.Length; var nextRootEnd = nextRootStart + nextRootTrits.Length; var messageEnd = nextRootStart + nextRootTrits.Length + messageTrits.Length; var nonceEnd = messageEnd + NonceLength; var signatureEnd = nonceEnd + signatureLength; var siblingsCountTritsEnd = signatureEnd + siblingsCountTrits.Length; this.Curl.Reset(); this.Curl.Absorb(channelKey.ToTrits()); this.Curl.Absorb(tree.Root.Hash.ToTrits()); var payload = new List <int>(); payload.InsertRange(0, indexTrits); payload.InsertRange(indexTrits.Length, messageLengthTrits); this.Curl.Absorb(payload.Take(nextRootStart).ToArray()); payload.InsertRange(nextRootStart, nextRootTrits); payload.InsertRange(nextRootEnd, messageTrits); var encryptablePayloadPart = payload.Skip(nextRootStart).Take(nextRootTrits.Length + messageTrits.Length).ToArray(); this.Mask.Mask(encryptablePayloadPart, this.Curl); for (var i = 0; i < encryptablePayloadPart.Length; i++) { payload[nextRootStart + i] = encryptablePayloadPart[i]; } var nonceTrits = this.HammingNonceDiver.Search(this.Curl.Rate(this.Curl.State.Length), securityLevel, Constants.TritHashLength / 3, 0) .ToArray(); this.Mask.Mask(nonceTrits, this.Curl); payload.InsertRange(messageEnd, nonceTrits); var signature = this.SigningHelper.Signature(this.Curl.Rate(Constants.TritHashLength), subtree.Key.ToTrits()); payload.InsertRange(nonceEnd, signature); payload.InsertRange(signatureEnd, siblingsCountTrits); payload.InsertRange(siblingsCountTritsEnd, subtreeTrits); var encryptableSignaturePart = payload.Skip(nonceEnd).ToArray(); this.Mask.Mask(encryptableSignaturePart, this.Curl); for (var i = 0; i < encryptableSignaturePart.Length; i++) { payload[nonceEnd + i] = encryptableSignaturePart[i]; } var nextThirdRound = payload.Count % Converter.Radix; if (nextThirdRound != 0) { payload.InsertRange(payload.Count, new int[Converter.Radix - nextThirdRound]); } this.Curl.Reset(); var bundle = new Bundle(); bundle.AddTransfer( new Transfer { Address = this.GetMessageAddress(tree.Root.Hash, mode), Message = new TryteString(Converter.TritsToTrytes(payload.ToArray())), Timestamp = Timestamp.UnixSecondsTimestamp }); bundle.Finalize(); bundle.Sign(); return(new MaskedAuthenticatedMessage { Payload = bundle, Root = tree.Root.Hash, Address = this.GetMessageAddress(tree.Root.Hash, mode), NextRoot = nextRoot }); }
private void DoProcessPipelineTasks(object state) { const int maxMessageChars = 2187; if (this.ProcessingTasksInProgress) { return; // task is already running, exiting } this.ProcessingTasksInProgress = true; // semaphore _logger.LogInformation("Background Task: Processing Tasks... Starting"); var tasks = _db.GetDBTaskEntryFromPipelineAsync().Result; if (tasks.Count > 0) { bool ErrorOccurred = false; foreach (var item in tasks) { if (item.Task == "SENDTX") // has to be all uppercase { var actualnode = this._nodemanager.SelectNode(); var actualPOWnode = this._nodemanager.SelectPOWNode(); // TODO: select also POW service and potential failover if (actualPOWnode == null) //if no POW server then using the same node as for TIPS selection, etc. { actualPOWnode = actualnode; if (actualPOWnode != null) { _logger.LogInformation("No POW server. Using the standard one... Actual node: {actualnode}", actualnode); } } if (actualnode != null && actualPOWnode != null) { var IotaRepo = new RestIotaRepository(new RestClient(actualnode) { Timeout = 15000 }, new POWService(actualPOWnode)); var bundle = new Bundle(); Bundle RetBundle = null; var guid = item.GlobalId; var seed = Seed.Random(); var input = item.Input; var MessageinTrytes = TryteString.FromUtf8String(input.Message).Value; // converting to trytes while (MessageinTrytes.Length > 0) // now let's split message to several transactions in case it is too long. Max is 2187 trytes { bundle.AddTransfer( new Transfer { Address = new Address(input.Address), Tag = new Tag(input.Tag), ValueToTransfer = 0, Timestamp = Timestamp.UnixSecondsTimestamp, Message = new TryteString(MessageinTrytes.Length > maxMessageChars ? MessageinTrytes.Substring(0, maxMessageChars) : MessageinTrytes) }); MessageinTrytes = MessageinTrytes.Length > maxMessageChars?MessageinTrytes.Substring(maxMessageChars - 1) : ""; } try { _logger.LogInformation("Performing external API call SendTransfer via {actualnode}", actualnode); RetBundle = IotaRepo.SendTransfer(seed, bundle, 2, depth: 3); _logger.LogInformation("Background Task: Processing Tasks... Transaction sent, Bundle Hash: {RetBundle.Hash.Value}", RetBundle.Hash.Value); } catch (Exception e) { // swallowing exception ErrorOccurred = true; _logger.LogInformation("Background Task: Processing Tasks... Error occured, Error: {e}", e); } if (!ErrorOccurred) { _db.UpdateDBTaskEntryInPipeline(guid, 200, RetBundle.Hash.Value).Wait(); } } else { _logger.LogInformation("No nodes via which to send TX. Skipping it for the current cycle..."); } } } } else { // no other tasks in pipeline StopProcessingPipeline(); } this.ProcessingTasksInProgress = false; // semaphore _logger.LogInformation("Background Task: Processing Tasks... Ending"); }