Пример #1
0
        /// <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();
        }
Пример #2
0
        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);
        }
Пример #3
0
        /// <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();
        }
Пример #4
0
        /// <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);
            }
        }
Пример #5
0
        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);
            }
        }
Пример #6
0
        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);
        }
Пример #7
0
        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));
        }
Пример #8
0
        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));
        }
Пример #9
0
 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())
     });
 }
Пример #10
0
        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);
        }
Пример #11
0
        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 }));
        }
Пример #12
0
        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;
            }
        }
Пример #13
0
        /// <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);
        }
Пример #14
0
        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);
        }
Пример #15
0
        /// <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;
            }
        }
Пример #17
0
        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);
        }
Пример #18
0
        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);
        }
Пример #20
0
        /// <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);
        }
Пример #21
0
        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);
            }
        }
Пример #22
0
        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);
        }
Пример #23
0
        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));
        }
Пример #25
0
        /// <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
            });
        }
Пример #26
0
        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());
        }
Пример #27
0
        /// <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");
        }