public void NonceTestMethod()
        {
            string message = "Keyhole Software";

            Console.WriteLine("Message: " + message);

            string hashValue = SHA256.generateHash(message);

            Console.WriteLine(string.Format("Hash: {0}", hashValue));

            string nonceKey   = "12345";
            long   nonce      = 0;
            bool   nonceFound = false;
            string nonceHash  = "";

            long start = TimeUtils.CurrentTimeMillis();

            while (!nonceFound)
            {
                nonceHash  = SHA256.generateHash(message + nonce);
                nonceFound = nonceHash.Substring(0, nonceKey.Length).Equals(nonceKey);
                nonce++;
            }

            long ms = TimeUtils.CurrentTimeMillis() - start;

            Console.WriteLine(string.Format("Nonce: {0} ", ms));
            Console.WriteLine(string.Format("Nonce Hash: {0}", nonceHash));
            Console.WriteLine(string.Format("Nonce Search Time: {0} ms", ms));

            Assert.IsTrue(nonceFound);
        }
Beispiel #2
0
        public BlockWithTransactions Build(ulong nonce)
        {
            var txs        = _transactions ?? throw new InvalidOperationException();
            var merkleRoot = UInt256Utils.Zero;

            if (txs.Count > 0)
            {
                merkleRoot = MerkleTree.ComputeRoot(txs.Select(tx => tx.Hash).ToArray()) ??
                             throw new InvalidOperationException();
            }
            var header = new BlockHeader
            {
                PrevBlockHash = _prevBlock != null?_prevBlock.Keccak() : UInt256Utils.Zero,
                                    MerkleRoot = merkleRoot,
                                    Index      = _prevBlock?.Index + 1 ?? 0,
                                    StateHash  = _stateHash,
                                    Nonce      = nonce
            };
            var block = new Block
            {
                Hash = header.Keccak(),
                TransactionHashes = { txs.Select(tx => tx.Hash) },
                Header            = header,
                Multisig          = _multiSig ?? new MultiSig(),
                Timestamp         = TimeUtils.CurrentTimeMillis(),
            };

            return(new BlockWithTransactions(block, txs));
        }
Beispiel #3
0
        public void Test_SignRoundTrip()
        {
            var privateKey = "0xD95D6DB65F3E2223703C5D8E205D98E3E6B470F067B0F94F6C6BF73D4301CE48".HexToBytes();
            var publicKey  = Crypto.ComputePublicKey(privateKey, true);
            var address    = "0x6Bc32575ACb8754886dC283c2c8ac54B1Bd93195".HexToBytes();

            CollectionAssert.AreEqual(address, Crypto.ComputeAddress(publicKey));

            var       startTs = TimeUtils.CurrentTimeMillis();
            const int n       = 100;

            for (var it = 0; it < n; ++it)
            {
                // var message = "0xdeadbeef" + it.ToString("X4");
                var message =
                    "0xec808504a817c800825208948e7b7262e0fa4616566591d51f998f16a79fb547880de0b6b3a764000080018080";
                var digest = message.HexToBytes();
                // using old chain id
                var signature = Crypto.Sign(digest, privateKey, false);
                Assert.IsTrue(Crypto.VerifySignature(digest, signature, publicKey, false));
                var recoveredPubkey = Crypto.RecoverSignature(digest, signature, false);
                Assert.AreEqual(recoveredPubkey, publicKey);

                // using new chain id
                signature = Crypto.Sign(digest, privateKey, true);
                Assert.IsTrue(Crypto.VerifySignature(digest, signature, publicKey, true));
                recoveredPubkey = Crypto.RecoverSignature(digest, signature, true);
                Assert.AreEqual(recoveredPubkey, publicKey);
            }

            var endTs = TimeUtils.CurrentTimeMillis();

            Console.WriteLine($"Full sign + recover time: {endTs - startTs}ms");
            Console.WriteLine($"Per 1 iteration: {(double) (endTs - startTs) / n}ms");
        }
Beispiel #4
0
        private static void _Benchmark(string text, Func <int, int> action, uint tries)
        {
            var lastTime = TimeUtils.CurrentTimeMillis();
            var mod      = tries / 100;

            if (mod == 0)
            {
                mod = 1;
            }
            for (var i = 0; i < tries; i++)
            {
                if (i % mod == 0)
                {
                    Console.CursorLeft = 0;
                    Console.Write($"{text} {100 * i / tries}%");
                }

                action(i);
            }

            var deltaTime = TimeUtils.CurrentTimeMillis() - lastTime;

            Console.CursorLeft = text.Length;
            Console.WriteLine($"{1000.0 * tries / deltaTime} RPS");
        }
 public BlockchainEventFilterParams(BlockchainEvent eventType, UInt256[] txHashes)
 {
     EventType = eventType;
     // sorting the tx hashes for further optimization
     Array.Sort(txHashes, (x, y) => UInt256Utils.Compare(x, y));
     PendingTransactionList = new List <UInt256>(txHashes.ToList());
     PollingTime            = TimeUtils.CurrentTimeMillis();
 }
Beispiel #6
0
        public T Benchmark <T>(Func <T> action)
        {
            var startTs = TimeUtils.CurrentTimeMillis();
            var res     = action.Invoke();

            TotalTime += TimeUtils.CurrentTimeMillis() - startTs;
            Count     += 1;
            return(res);
        }
 public BlockchainEventFilterParams(BlockchainEvent eventType, ulong?fromBlock, ulong?toBlock, List <UInt160> addresses, List <List <UInt256> > topics)
 {
     EventType   = eventType;
     FromBlock   = fromBlock;
     ToBlock     = toBlock;
     AddressList = new List <UInt160>(addresses);
     TopicLists  = new List <List <UInt256> >(topics);
     PollingTime = TimeUtils.CurrentTimeMillis();
 }
Beispiel #8
0
 private JObject GetNodeStats()
 {
     using var process = Process.GetCurrentProcess();
     return(new JObject
     {
         ["uptime"] = TimeUtils.CurrentTimeMillis() - _startTs,
         ["threads"] = process.Threads.Count,
         ["memory"] = process.WorkingSet64,
         ["max_memory"] = process.PeakWorkingSet64,
     });
 }
        public void RemoveUnusedFilters()
        {
            var currentTime = TimeUtils.CurrentTimeMillis();

            foreach (var(filterId, filterParams) in _filters)
            {
                if (currentTime - filterParams.PollingTime >= TimeOut())
                {
                    Remove(filterId);
                }
            }
        }
Beispiel #10
0
        private void Worker()
        {
            _isConnected = true;
            while (_isConnected)
            {
                var now = TimeUtils.CurrentTimeMillis();
                MessageBatchContent toSend = new MessageBatchContent();

                lock (_messageQueue)
                {
                    const int maxSendSize = 64 * 1024; // let's not send more than 64 KiB at once
                    while (_messageQueue.Count > 0 && toSend.CalculateSize() < maxSendSize)
                    {
                        var message = _messageQueue.First.Value;
                        toSend.Messages.Add(message);
                        _messageQueue.RemoveFirst();
                    }
                }

                if (toSend.Messages.Count > 0)
                {
                    var megaBatch      = _messageFactory.MessagesBatch(toSend.Messages);
                    var megaBatchBytes = megaBatch.ToByteArray();
                    if (megaBatchBytes.Length == 0)
                    {
                        throw new Exception("Cannot send empty message");
                    }
                    Logger.LogTrace(
                        $"Sending {toSend.Messages.Count} messages to hub, {megaBatchBytes.Length} bytes total, peer = {PeerPublicKey.ToHex()}");
                    var messageTypes = toSend.Messages.Select(m =>
                                                              m.MessageCase != NetworkMessage.MessageOneofCase.ConsensusMessage
                            ? m.MessageCase.ToString()
                            : m.ConsensusMessage.PrettyTypeString()
                                                              );
                    Logger.LogTrace($"Messages types: {string.Join("; ", messageTypes)}");
                    foreach (var message in toSend.Messages)
                    {
                        MessageCounter
                        .WithLabels(PeerPublicKey.ToHex(), message.MessageCase.ToString())
                        .Inc();
                        MessageBytesCounter
                        .WithLabels(PeerPublicKey.ToHex(), message.MessageCase.ToString())
                        .Inc(message.CalculateSize());
                    }

                    _hubConnector.Send(PeerPublicKey, megaBatchBytes);
                    _eraMsgCounter += 1;
                }

                var toSleep = Math.Clamp(250 - (long)(TimeUtils.CurrentTimeMillis() - now), 1, 1000);
                Thread.Sleep(TimeSpan.FromMilliseconds(toSleep));
            }
        }
Beispiel #11
0
 public NodeService(
     IBlockSynchronizer blockSynchronizer,
     IBlockchainEventFilter blockchainEventFilter,
     INetworkManager networkManager,
     IBlockManager blockManager
     )
 {
     _blockchainEventFilter = blockchainEventFilter;
     _blockSynchronizer     = blockSynchronizer;
     _blockManager          = blockManager;
     _startTs = TimeUtils.CurrentTimeMillis();
 }
 public JArray GetLogs(ulong id, BlockchainEventFilterParams filter, bool poll)
 {
     if (poll)
     {
         filter.PollingTime = TimeUtils.CurrentTimeMillis();
         _filters[id]       = filter;
     }
     if ((filter.FromBlock is null) || (filter.ToBlock is null))
     {
         return(new JArray());
     }
     return(GetLogs((ulong)filter.FromBlock, (ulong)filter.ToBlock, filter.AddressList, filter.TopicLists));
 }
Beispiel #13
0
        private static void _BenchOneTxInBlock(
            ITransactionBuilder transactionBuilder,
            ITransactionSigner transactionSigner,
            EcdsaKeyPair keyPair
            )
        {
            var       address1 = "0x6bc32575acb8754886dc283c2c8ac54b1bd93195".HexToUInt160();
            var       address2 = "0xe3c7a20ee19c0107b9121087bcba18eb4dcb8576".HexToUInt160();
            var       lastTime = TimeUtils.CurrentTimeMillis();
            const int tries    = 100;

            for (var i = 0; i < tries; i++)
            {
                if (i % 10 == 0)
                {
                    Console.CursorLeft = 0;
                    Console.Write($"Benchmarking... {100 * i / tries}%");
                }

                var transferTx =
                    transactionBuilder.TransferTransaction(address1, address2, Money.FromDecimal(1.2m));
                var signed = transactionSigner.Sign(transferTx, keyPair, true);
                // var blockWithTxs = new BlockBuilder(latestBlock.Header)
                //     .WithTransactions(new[] {signed})
                //     .Build(123456);
                // // var stateHash = blockchainManager.CalcStateHash(blockWithTxs.Block, blockWithTxs.Transactions);
                // var block = blockWithTxs.Block;
                // // block.Header.StateHash = stateHash;
                // block.Hash = block.Header.Keccak();
                // block.Multisig = new MultiSig
                // {
                //     Quorum = 1,
                //     Signatures =
                //     {
                //         new MultiSig.Types.SignatureByValidator
                //         {
                //             Key = keyPair.PublicKey,
                //             Value = blockManager.Sign(block.Header, keyPair)
                //         }
                //     },
                //     Validators = {keyPair.PublicKey}
                // };
                // // blockchainManager.PersistBlockManually(block, blockWithTxs.Transactions);
            }

            var deltaTime = TimeUtils.CurrentTimeMillis() - lastTime;

            Console.CursorLeft = "Benchmarking... ".Length;
            Console.WriteLine($"{1000 * tries / deltaTime} RPS");
        }
Beispiel #14
0
        public void Start(RunOptions options)
        {
            var stateManager = _container.Resolve <IStateManager>();

            const uint T       = 100000;
            const uint batches = 10;
            IDictionary <UInt256, UInt256> blocks = new Dictionary <UInt256, UInt256>();

            var contract = UInt160Utils.Zero;

            Console.WriteLine("Initial repo version: " + stateManager.LastApprovedSnapshot.Storage.Version);
            for (var it = 0u; it < batches; ++it)
            {
                Console.WriteLine($"commit number {it}");
                var snapshot = stateManager.NewSnapshot();
                var start    = TimeUtils.CurrentTimeMillis();
                for (var i = 0u; i < T; ++i)
                {
                    if (blocks.Count == 0 || Rand() % 3 != 0)
                    {
                        var key   = RandUInt256();
                        var value = RandUInt256();
                        blocks[key] = value;
                        snapshot.Storage.SetValue(contract, key, value);
                    }
                    else
                    {
                        var key = blocks.Keys.First();
                        snapshot.Storage.DeleteValue(contract, key, out var wasValue);
                        if (!wasValue.Equals(blocks[key]))
                        {
                            throw new InvalidOperationException("FAIL: value in storage is incorrect");
                        }
                        blocks.Remove(key);
                    }
                }

                stateManager.Approve();

                var inMemPhase = TimeUtils.CurrentTimeMillis();
                Console.WriteLine($"{T} insertions in {inMemPhase - start}ms");
                Console.WriteLine($"{(double) (inMemPhase - start) / T}ms per insertion");
                Console.WriteLine($"{(double) T * 1000 / (inMemPhase - start)} insertions per sec");

                stateManager.Commit();
                var commit = TimeUtils.CurrentTimeMillis();

                Console.WriteLine($"Commited {T} operations in {commit - inMemPhase}ms");
            }
        }
Beispiel #15
0
        public void Start()
        {
            _startTime = TimeUtils.CurrentTimeMillis();
            while (!Terminated)
            {
                MessageEnvelope msg;
                lock (_queueLock)
                {
                    while (_queue.IsEmpty && !Terminated)
                    {
                        Monitor.Wait(_queueLock, 1000);
                        if (TimeUtils.CurrentTimeMillis() - _startTime > _alertTime)
                        {
                            Logger.LogWarning($"Protocol {Id} is waiting for _queueLock too long, last message" +
                                              $" is [{_lastMessage}]");
                        }
                    }

                    if (Terminated)
                    {
                        return;
                    }

                    _queue.TryDequeue(out msg);
                }

                try
                {
                    ProcessMessage(msg);
                    MessageCounter.WithLabels($"{Id}".Split(' ')[0], msg.TypeString()).Inc();
                    if (TimeUtils.CurrentTimeMillis() - _startTime > _alertTime)
                    {
                        Logger.LogWarning($"Protocol {Id} is too long, last message is [{_lastMessage}]");
                    }
                }
                catch (Exception e)
                {
                    // We should investigate exceptions for each protocol and handle them carefully. Consensus depend
                    // on the messages from honest validators to deliver properly, no matter the delay. If a protocol
                    // stops due to exception while handling message from malicious node, this may interrupt the communication
                    // among honest nodes which may cause the consensus stop working, or worse, giving wrong result.
                    Logger.LogError($"{Id}: exception occured while processing message: {e}");
                    Terminated = true;
                    break;
                }
            }
        }
Beispiel #16
0
        private void SetKeyboardListener()
        {
            KeyboardWatcher.OnKeyInput += (s, e) =>
            {
                Console.WriteLine(e.KeyData.Keyname);

                if (ClickedOnEscBtn(e))
                {
                    userCommandsListener.OnExit();
                    return;
                }

                if (ClickedOnUndoBtn(e) && ClickLegal())
                {
                    lastTimeClicked = TimeUtils.CurrentTimeMillis();
                    userCommandsListener.OnUndo();
                }


                if (ClickedOnSkipBtn(e) && ClickLegal())
                {
                    lastTimeClicked = TimeUtils.CurrentTimeMillis();
                    userCommandsListener.OnUserSkipped();
                }


                if (ClickedOnPauseBtn(e) && ClickLegal())
                {
                    lastTimeClicked = TimeUtils.CurrentTimeMillis();

                    //if running
                    if (isAllowedToReadPixel)
                    {
                        userCommandsListener.OnUserPaused(true);
                        isAllowedToReadPixel = false;
                    }
                    else
                    {
                        //if paused
                        isAllowedToReadPixel = true;
                        userCommandsListener.OnUserPaused(false);
                        LookForAColor().Start();
                    }
                }
            };
        }
        void SetNotification_GAME(string MesajTitle, string MesajIcerigi, string GetMessageDTOJSON1)
        {
            int requestID    = (int)TimeUtils.CurrentTimeMillis();
            var resultIntent = new Intent(this, typeof(ArkadasOyunSec_Gelen));

            resultIntent.SetFlags(ActivityFlags.ClearTop | ActivityFlags.SingleTop | ActivityFlags.NewTask);
            resultIntent.PutExtra("GetMessageDTOJSON", GetMessageDTOJSON1);
            var stackBuilder = Android.App.TaskStackBuilder.Create(this);

            stackBuilder.AddParentStack(Java.Lang.Class.FromType(typeof(ArkadasOyunSec_Gelen)));
            stackBuilder.AddNextIntent(resultIntent);

            // Create the PendingIntent with the back stack:
            var resultPendingIntent = stackBuilder.GetPendingIntent(requestID, PendingIntentFlags.UpdateCurrent | PendingIntentFlags.OneShot);

            // Build the notification:
            var builder = new NotificationCompat.Builder(this, CHANNEL_ID)
                          .SetAutoCancel(true)                   // Dismiss the notification from the notification area when the user clicks on it
                          .SetContentIntent(resultPendingIntent) // Start up this activity when the user clicks the intent.
                          .SetContentTitle(MesajTitle)           // Set the title
                          .SetNumber(30)                         // Display the count in the Content Info
                          .SetSmallIcon(Resource.Mipmap.ic_launcher)
                                                                 //.SetVibrate(new long[] { 0, 500, 1000 })
                          .SetPriority(NotificationCompat.PriorityHigh)
                                                                 //.SetSound(uri)
                          .SetContentText(MesajIcerigi);         // the message to display.

            //// Instantiate the Big Text style:
            //NotificationCompat.BigTextStyle textStyle = new NotificationCompat.BigTextStyle();

            //// Fill it with text:
            //textStyle.BigText(MesajIcerigi);

            //// Set the summary text:
            //textStyle.SetSummaryText(MesajIcerigi);

            //// Plug this style into the builder:
            //builder.SetStyle(textStyle);


            var notificationManager = NotificationManagerCompat.From(this);
            var newid = NOTIFICATION_ID++;

            notificationManager.Notify(requestID, builder.Build());
        }
Beispiel #18
0
        public Block <T> newBlock()
        {
            int    count        = chain.Count();
            string previousHash = "root";

            if (count > 0)
            {
                previousHash = blockChainHash();
            }

            Block <T> block = new Block <T>();

            block.setTimeStamp(TimeUtils.CurrentTimeMillis());
            block.setIndex(count);
            block.setPreviousHash(previousHash);
            // chain.add(block);
            return(block);
        }
Beispiel #19
0
        public void RegisterMeasurement(long delta)
        {
            var timestamp = TimeUtils.CurrentTimeMillis();

            if (timestamp >= LastTimeReported + Interval.TotalMilliseconds)
            {
                if (LastTimeReported != 0)
                {
                    _callback.Invoke((float)Sum * 1000 / (timestamp - LastTimeReported), Count);
                }
                Count            = 0;
                Sum              = 0;
                LastTimeReported = timestamp;
            }

            Count += 1;
            Sum   += delta;
        }
Beispiel #20
0
    public void Run()
    {
        init();

        long   lastTime  = TimeUtils.GetNanoseconds();
        double nsPerTick = 1000000000D / 60D;

        int ticks = 0;

        long   lastTimer = TimeUtils.CurrentTimeMillis();
        double delta     = 0;

        while (running)
        {
            if (!paused)
            {
                long now = TimeUtils.GetNanoseconds();
                delta   += (now - lastTime) / nsPerTick;
                lastTime = now;

                while (delta >= 1)
                {
                    ticks++;
                    tick();
                    delta -= 1;
                }

                Thread.Sleep(2);

                //Console.WriteLine(ticks + " GameCore ticks");

                if (TimeUtils.CurrentTimeMillis() - lastTimer >= 1000)
                {
                    lastTimer += 1000;

                    Console.WriteLine(ticks + " GameCore ticks");
                    ticks = 0;
                }
            }
        }

        stop();
    }
Beispiel #21
0
        private void PingWorker()
        {
            while (_running)
            {
                try
                {
                    var reply = _networkManager.MessageFactory.PingReply(
                        TimeUtils.CurrentTimeMillis(), _stateManager.LastApprovedSnapshot.Blocks.GetTotalBlockHeight()
                        );
                    _networkBroadcaster.Broadcast(reply);
                    Logger.LogTrace($"Broadcasted our height: {reply.PingReply.BlockHeight}");
                }
                catch (Exception e)
                {
                    Logger.LogError($"Error in ping worker: {e}");
                }

                Thread.Sleep(TimeSpan.FromMilliseconds(3_000));
            }
        }
Beispiel #22
0
        public void Test_AesGcmEncryptDecryptRoundTrip()
        {
            var key      = Crypto.GenerateRandomBytes(32);
            var baseText =
                "0xf86d808504a817c800832dc6c0948e7b7262e0fa4616566591d51f998f16a79fb547880de0b6b3a76400008025a0115105d96a43f41a5ea562bb3e591cbfa431a8cdae9c3030457adca2cb854f78a012fb41922c53c73473563003667ed8e783359c91d95b42301e1955d530b1ca33"
                .HexToBytes();
            const int n       = 1000;
            var       startTs = TimeUtils.CurrentTimeMillis();

            for (var it = 0; it < n; ++it)
            {
                var plaintext = baseText.Concat(it.ToBytes()).ToArray();
                var cipher    = Crypto.AesGcmEncrypt(key, plaintext);
                var decrypted = Crypto.AesGcmDecrypt(key, cipher);
                Assert.IsTrue(plaintext.SequenceEqual(decrypted));
            }

            var endTs = TimeUtils.CurrentTimeMillis();

            Console.WriteLine($"{n} encrypt/decrypt: {endTs - startTs}ms, avg = {(double) (endTs - startTs) / n}");
        }
        public JArray SyncPendingTransaction(ulong id, BlockchainEventFilterParams filter, bool poll)
        {
            var results = new JArray();

            var pendingTx = filter.PendingTransactionList;
            var poolTx    = _transactionPool.Transactions.Keys.ToArray();

            Array.Sort(poolTx, (x, y) => UInt256Utils.Compare(x, y));

            // comparing two sorted list listA and listB in O(listA.Count + listB.Count)

            int iter = 0;

            foreach (var txHash in poolTx)
            {
                if (txHash is null)
                {
                    continue;
                }

                while (iter < pendingTx.Count && UInt256Utils.Compare(txHash, pendingTx[iter]) > 0)
                {
                    iter++;
                }
                if (iter == pendingTx.Count || UInt256Utils.Compare(txHash, pendingTx[iter]) < 0)
                {
                    results.Add(Web3DataFormatUtils.Web3Data(txHash));
                }
            }

            if (poll)
            {
                // Pending transaction list in filter must be sorted for further optimization
                filter.PendingTransactionList = new List <UInt256>(poolTx.ToList());
                filter.PollingTime            = TimeUtils.CurrentTimeMillis();
                _filters[id] = filter;
            }
            return(results);
        }
        public JArray SyncBlocks(ulong id, BlockchainEventFilterParams filter, bool poll)
        {
            var results         = new JArray();
            var lastSyncedBlock = filter.LastSyncedBlock;
            var highestBlock    = _stateManager.LastApprovedSnapshot.Blocks.GetTotalBlockHeight();

            for (var i = lastSyncedBlock; i < highestBlock; i++)
            {
                var block = _blockManager.GetByHeight(i);
                if (block is null)
                {
                    continue;
                }
                results.Add(Web3DataFormatUtils.Web3Data(block !.Hash));
            }

            if (poll)
            {
                filter.LastSyncedBlock = highestBlock;
                filter.PollingTime     = TimeUtils.CurrentTimeMillis();
                _filters[id]           = filter;
            }
            return(results);
        }
Beispiel #25
0
 public override double Evaluate(Reasoner reasoner, ITerm[] args)
 {
     return(TimeUtils.CurrentTimeMillis());
 }
Beispiel #26
0
 private bool ClickLegal()
 {
     return(TimeUtils.CurrentTimeMillis() - lastTimeClicked > CLICK_SAFETY_WAIT_MILLIS);
 }
Beispiel #27
0
        private void BlockSyncWorker()
        {
            var rnd = new Random();

            Logger.LogDebug("Starting block synchronization worker");
            while (_running)
            {
                try
                {
                    var myHeight = _blockManager.GetHeight();
                    if (myHeight > _networkManager.LocalNode.BlockHeight)
                    {
                        _networkManager.LocalNode.BlockHeight = myHeight;
                    }

                    if (_peerHeights.Count == 0)
                    {
                        Logger.LogWarning("Peer height map is empty, nobody responds to pings?");
                        Thread.Sleep(TimeSpan.FromMilliseconds(1_000));
                        continue;
                    }

                    var maxHeight = _peerHeights.Values.Max();
                    if (myHeight >= maxHeight)
                    {
                        Logger.LogTrace($"Nothing to do: my height is {myHeight} and peers are at {maxHeight}");
                        Thread.Sleep(TimeSpan.FromMilliseconds(1_000));
                        continue;
                    }

                    const int maxPeersToAsk      = 1;
                    const int maxBlocksToRequest = 10;

                    var peers = _peerHeights
                                .Where(entry => entry.Value >= maxHeight)
                                .Select(entry => entry.Key)
                                .OrderBy(_ => rnd.Next())
                                .Take(maxPeersToAsk)
                                .ToArray();

                    var leftBound  = myHeight + 1;
                    var rightBound = Math.Min(maxHeight, myHeight + maxBlocksToRequest);
                    Logger.LogTrace($"Sending query for blocks [{leftBound}; {rightBound}] to {peers.Length} peers");
                    foreach (var peer in peers)
                    {
                        _networkManager.SendTo(
                            peer, _networkManager.MessageFactory.SyncBlocksRequest(leftBound, rightBound)
                            );
                    }

                    var waitStart = TimeUtils.CurrentTimeMillis();
                    while (true)
                    {
                        lock (_peerHasBlocks)
                        {
                            Monitor.Wait(_peerHasBlocks, TimeSpan.FromMilliseconds(1_000));
                        }

                        if (TimeUtils.CurrentTimeMillis() - waitStart > 5_000)
                        {
                            break;
                        }
                    }
                }
                catch (Exception e)
                {
                    Logger.LogError($"Error in block synchronizer: {e}");
                    Thread.Sleep(1_000);
                }
            }
        }
Beispiel #28
0
        public OperatingError Execute(Block block, IEnumerable <TransactionReceipt> transactionsEnumerable, bool checkStateHash,
                                      bool commit)
        {
            // No two threads can be in the safeContext at the same time.
            // Always execute / emulate inside safeContext. this makes sure that no two threads
            // concurrently writes to the chain.

            var error = _stateManager.SafeContext(() =>
            {
                var transactions   = transactionsEnumerable.ToList();
                var snapshotBefore = _stateManager.LastApprovedSnapshot;
                var startTime      = TimeUtils.CurrentTimeMillis();
                var operatingError = _Execute(
                    block, transactions, out _, out _, false, out var gasUsed, out var totalFee
                    );
                if (operatingError != OperatingError.Ok)
                {
                    Logger.LogError($"Error occured while executing block: {operatingError}");
                    return(operatingError);
                }

                if (checkStateHash && !_stateManager.LastApprovedSnapshot.StateHash.Equals(block.Header.StateHash))
                {
                    Logger.LogError(
                        $"Cannot execute block {block.Hash.ToHex()} " +
                        $"with stateHash={block.Header.StateHash.ToHex()} specified in header," +
                        $"since computed state hash is {_stateManager.LastApprovedSnapshot.StateHash.ToHex()}, " +
                        $"stack trace is {new System.Diagnostics.StackTrace()}");

                    _stateManager.RollbackTo(snapshotBefore);
                    return(OperatingError.InvalidStateHash);
                }

                /* flush changes to database */
                if (!commit)
                {
                    return(OperatingError.Ok);
                }
                // TODO: this is hack to avoid concurrency issues, one more save will be done in BlockPersisted() call
                _snapshotIndexRepository.SaveSnapshotForBlock(block.Header.Index, _stateManager.LastApprovedSnapshot);
                if (block.Header.Index > 0)
                {
                    var blockTime = block.Timestamp -
                                    _stateManager.LastApprovedSnapshot.Blocks.GetBlockByHeight(block.Header.Index - 1) !
                                    .Timestamp;
                    BlockTime.Observe(blockTime / 1000.0);
                    BlockHeight.Set(block.Header.Index);
                    BlockSize.Observe(block.CalculateSize());
                    foreach (var transactionReceipt in transactions)
                    {
                        TxSize.Observe(transactionReceipt.Transaction.RlpWithSignature(transactionReceipt.Signature, HardforkHeights.IsHardfork_9Active(block.Header.Index)).Count());
                    }
                    TxInBlock.Observe(block.TransactionHashes.Count);

                    Logger.LogInformation(
                        $"New block {block.Header.Index} with hash {block.Hash.ToHex()}, " +
                        $"txs {block.TransactionHashes.Count} in {TimeUtils.CurrentTimeMillis() - startTime}ms, " +
                        $"gas used {gasUsed}, fee {totalFee}. " +
                        $"Since last block: {blockTime} ms"
                        );
                }
                _stateManager.Commit();
                BlockPersisted(block);
                return(OperatingError.Ok);
            });

            return(error);
        }
        public void Start(RunOptions options)
        {
            var stateManager = _container.Resolve <IStateManager>();

            var hash     = UInt160Utils.Zero;
            var contract = new Contract
                           (
                hash,
                "0061736d0100000001240760027f7f017f60037f7f7f017f60037f7f7f0060027f7f006000017f60017f0060000002ae010903656e760d6765745f63616c6c5f73697a65000403656e760f636f70795f63616c6c5f76616c7565000203656e760b73797374656d5f68616c74000503656e761063727970746f5f6b656363616b323536000203656e760b77726974655f6576656e74000203656e760c6c6f61645f73746f72616765000303656e760a7365745f72657475726e000303656e760a6765745f73656e646572000503656e760c736176655f73746f726167650003031110060005010505000000020503050203020405017001080805030100020608017f01419089040b071202066d656d6f727902000573746172740009090d010041010b070a0c0f101112140a806610e61e03037f047e027f23808080800041f0016b22002480808080000240024002401080808080004104490d0041004104200041b0016a1081808080000240024002400240024002400240024020002800b00122014185fafb1e4a0d00024020014197acb4e87d4a0d0020014189bc9d9d7b460d04200141a98bf0dc7b460d03200141a4af89be7d470d0a418180808000108b808080000c0b0b200141016a220241014d0d0720014198acb4e87d460d01200141a3f0caeb7d470d09418280808000108d808080000c0a0b024002400240200141dcc5b5f7034a0d0020014186fafb1e460d01200141c082bfc801460d08200141f0c08a8c03470d0b02401080808080004118460d0041061082808080000b41044118200041206a1081808080002000290320210320002903282104200020002802303602682000200437036020002003370358410029038088808000210341002903888880800021044100290390888080002105200041002903988880800022064238883c00cf01200020064230883c00ce01200020064228883c00cd01200020064220883c00cc01200020064218883c00cb01200020064210883c00ca01200020064208883c00c901200020063c00c801200020054238883c00c701200020054230883c00c601200020054228883c00c501200020054220883c00c401200020054218883c00c301200020054210883c00c201200020054208883c00c101200020053c00c001200020044238883c00bf01200020044230883c00be01200020044228883c00bd01200020044220883c00bc01200020044218883c00bb01200020044210883c00ba01200020044208883c00b901200020043c00b801200020034238883c00b701200020034230883c00b601200020034228883c00b501200020034220883c00b401200020034218883c00b301200020034210883c00b201200020034208883c00b101200020033c00b001200041e0016a2000280268360200200041d8016a2000290360370300200020002903583703d001200041b0016a413420004190016a10838080800020004190016a20004190016a41201084808080002000290390012103200029039801210420002903a0012105200020002903a8013703a801200020053703a0012000200437039801200020033703900120004190016a200041b0016a10858080800020002903b001210320002903b801210420002903c0012105200020002903c80122064238883c00cf01200020064230883c00ce01200020064228883c00cd01200020064220883c00cc01200020064218883c00cb01200020064210883c00ca01200020064208883c00c901200020063c00c801200020054238883c00c701200020054230883c00c601200020054228883c00c501200020054220883c00c401200020054218883c00c301200020054210883c00c201200020054208883c00c101200020053c00c001200020044238883c00bf01200020044230883c00be01200020044228883c00bd01200020044220883c00bc01200020044218883c00bb01200020044210883c00ba01200020044208883c00b901200020043c00b801200020034238883c00b701200020034230883c00b601200020034228883c00b501200020034220883c00b401200020034218883c00b301200020034210883c00b201200020034208883c00b101200020033c00b001200041b0016a41201086808080000c0c0b0240200141b8a0cd8c054a0d00200141ddc5b5f703460d0720014195b1ef8c04460d020c0b0b200141b9a0cd8c05460d05200141b1f894bf06470d0a200041123a00b001200041b0016a41011086808080000c0b0b410021020240024041002d00a8888080004101710d00410041003602a0888080003f002101410041013602a8888080004100200141016a3602a4888080000c010b41002802a0888080002202418a807c6a2201418080046d2107200141808004480d00200740001a410041002802a48880800020076a3602a48880800041002802a08880800021020b41002002410a6a418080046f22013602a08880800020004280808080a0013702b401200020023602b00141002d00a8888080004101712107024002402002450d0020070d0041002101410041003602a0888080003f002102410041013602a8888080004100200241016a3602a4888080000c010b024020070d0041002101410041003602a0888080003f002102410041013602a8888080004100200241016a3602a4888080000c010b20014187807c6a2202418080046d2107200241808004480d00200740001a410041002802a48880800020076a3602a48880800041002802a08880800021010b4100200141076a418080046f3602a088808000200141ee003a0006200141efd2013b0004200020013602b001200141c2d2d19b0636000020004287808080f0003702b401200041b0016a108e808080000c0a0b410021020240024041002d00a8888080004101710d00410041003602a0888080003f002101410041013602a8888080004100200141016a3602a4888080000c010b41002802a0888080002202418a807c6a2201418080046d2107200141808004480d00200740001a410041002802a48880800020076a3602a48880800041002802a08880800021020b41002002410a6a418080046f22013602a08880800020004280808080a0013702b401200020023602b00141002d00a8888080004101712107024002402002450d0020070d0041002101410041003602a0888080003f002102410041013602a8888080004100200241016a3602a4888080000c010b024020070d0041002101410041003602a0888080003f002102410041013602a8888080004100200241016a3602a4888080000c010b20014183807c6a2202418080046d2107200241808004480d00200740001a410041002802a48880800020076a3602a48880800041002802a08880800021010b4100200141036a418080046f3602a088808000200020013602b001200141c3003a0002200141c2a8013b000020004283808080303702b401200041b0016a108e808080000c090b200041002903b08880800037039001200041002903b88880800037039801200041002903c0888080003703a001200041002903c8888080003703a80120004190016a200041b0016a10858080800020002903b001210320002903b801210420002903c0012105200020002903c80122064238883c003f200020064230883c003e200020064228883c003d200020064220883c003c200020064218883c003b200020064210883c003a200020064208883c0039200020063c0038200020054238883c0037200020054230883c0036200020054228883c0035200020054220883c0034200020054218883c0033200020054210883c0032200020054208883c0031200020053c0030200020044238883c002f200020044230883c002e200020044228883c002d200020044220883c002c200020044218883c002b200020044210883c002a200020044208883c0029200020043c0028200020034238883c0027200020034230883c0026200020034228883c0025200020034220883c0024200020034218883c0023200020034210883c0022200020034208883c0021200020033c0020200041206a41201086808080000c080b418380808000108b808080000c070b418480808000108b808080000c060b418580808000108b808080000c050b4186808080001093808080000c040b4187808080001095808080000c030b024020020e020100010b02401080808080004124460d0041061082808080000b41044124200041206a10818080800020002903382103200029033021042000290328210520002903202106200041b0016a108780808000200020002d00b0013a0078200020002800b101360079200020002900b50137007d200020002800bd0136008501200020002f00c1013b008901200020002d00c3013a008b0120002006370358200020053703602000200437036820002003370370200041186a200028028801360200200041106a20002903800137030020002000290378370308200041086a200041d8006a109480808000200041b0016a108780808000200020002d00b00122023a0040200020002800b101360041200020002900b501370045200020002800bd0136004d200020002f00c1013b0051200020002d00c3013a005341002101200041002903d08880800037039001200041002903d88880800037039801200041002903e0888080003703a001200041002903e8888080003703a8010240024041002d00a8888080004101710d00410041003602a0888080003f002107410041013602a8888080004100200741016a3602a4888080000c010b41002802a088808000220141a0807c6a2207418080046d2108200741808004480d00200840001a410041002802a48880800020086a3602a48880800041002802a08880800021010b4100200141206a418080046f3602a088808000200120023a0000200120002d00413a0001200120002d00423a0002200120002d00433a0003200120002d00443a0004200120002d00453a0005200120002d00463a0006200120002d00473a0007200120002d00483a0008200120002d00493a0009200120002d004a3a000a200120002d004b3a000b200120002d004c3a000c200120002d004d3a000d200120002d004e3a000e200120002d004f3a000f200120002d00503a0010200120002d00513a0011200120002d00523a0012200120002d00533a001320004190016a2001108880808000200041c8016a4200370300200041c0016a4200370300200041b8016a4200370300200042003703b0010240024002400240200029039001220342017c22042003540d00200020043703b00120002903980121030c010b200020043703b001200042013703b801200029039801220442017c220320045a0d00200020033703b801200042013703c00120002903a001220442017c220320045a0d01200020033703c001200042013703c80120002903a80142017c21030c020b200020033703b80120002903a00121030b200020033703c00120002903a80121030b20004190016a41186a200337030020004190016a41086a200041b0016a41086a220229030037030020004190016a41106a200041b0016a41106a2207290300370300200020002903b0013703900102402001450d0041002d00a8888080004101710d00410041003602a0888080003f002101410041013602a8888080004100200141016a3602a4888080000b200041b0016a41186a42003703002007420037030020024200370300200042003703b0012000419ed6f2d67b36029001200041b0016a20004190016a41041084808080000c020b41051082808080000c010b41051082808080000b200041f0016a2480808080000b900702017f077e2380808080004190016b2202248080808000200241f0006a108780808000200241246a20022903783702002002412c6a20022802800136020020022903702103200241086a41106a200041106a280000360200200241086a41086a200041086a2900003703002002200337021c20022000290000370308200241002903f088808000370350200241002903f88880800037035820024100290380898080003703602002410029038889808000370368200241f0006a200241d0006a200241086a109880808000200229037021032002290378210420022903800121052002200229038801370368200220053703602002200437035820022003370350200241d0006a200241f0006a1085808080002002200229037022033703302002200229037822063703382002200229038001220537034020022002290388012204370348200421072001290318220821090240024020042008520d0020052107200520012903102209520d0020062107200620012903082209520d0020032107200320012903002209520d00200421080c010b200720095a0d00410410828080800020012903182108200229034821042002290340210520022903382106200229033021030b20042008427f857c20052001290310427f857c220820055420062001290308427f857c2204200654200320012903002207427f857c2209200354220120042001ad7c2204507172220120082001ad7c2206507172ad7c21084200210502400240200320077d22032009540d00200621070c010b0240200442017c22072004540d0020072104200621070c010b200642017c2207200654ad2105420021040b2002200737034020022004370338200220033703302002200820057c370348200241f0006a108780808000200241246a20022903783702002002412c6a20022802800136020020022903702103200241086a41106a200041106a280000360200200241086a41086a200041086a2900003703002002200337021c20022000290000370308200241002903f088808000370350200241002903f88880800037035820024100290380898080003703602002410029038889808000370368200241f0006a200241d0006a200241086a1098808080002002290370210320022903782104200229038001210520022002290388013703880120022005370380012002200437037820022003370370200241f0006a200241306a10978080800020024190016a24808080800041010bea0102027f067e2380808080004190016b220124808080800002401080808080004138460d0041061082808080000b41044138200141206a108180808000200141186a20012802302202360200200141106a2001290328220337030020012001290320220437030820012903342105200129033c210620012903442107200129034c21082001200437037820012002360288012001200337038001200120083703702001200737036820012006370360200120053703582001200141086a200141d8006a2000118080808000003a008f012001418f016a410110868080800020014190016a2480808080000ba11202157f0e7e23808080800041d0016b2203248080808000200341c0006a10878080800020032d0040210420032d0041210520032d0042210620032d0043210720032d0044210820032d0045210920032d0046210a20032d0047210b20032d0048210c20032d0049210d20032d004a210e20032d004b210f20032d004c211020032d004d211120032d004e211220032d004f211320032d0050211420032d0051211520032d00522116200320032d005322173a0053200320163a0052200320153a0051200320143a0050200320133a004f200320123a004e200320113a004d200320103a004c2003200f3a004b2003200e3a004a2003200d3a00492003200c3a00482003200b3a00472003200a3a0046200320093a0045200320083a0044200320073a0043200320063a0042200320053a0041200320043a0040200341e4006a200041106a280000360200200341dc006a200041086a29000037020020032000290000370254200341002903f08880800037039001200341002903f8888080003703980120034100290380898080003703a00120034100290388898080003703a801200341b0016a20034190016a200341c0006a10988080800020032903b001211820032903b801211920032903c001211a200320032903c8013703a8012003201a3703a0012003201937039801200320183703900120034190016a200341b0016a108580808000200320032903b001370370200320032903b801370378200320032903c00137038001200320032903c8013703880120034100290380888080003703b00120034100290388888080003703b80120034100290390888080003703c00120034100290398888080003703c801200341c0006a200341b0016a200010968080800020032903402118200329034821192003290350211a200320032903583703582003201a3703502003201937034820032018370340200341c0006a200341b0016a108580808000200320032903b001370320200320032903b801370328200320032903c001370330200320032903c801221937033820034100290380888080003703b00120034100290388888080003703b80120034100290390888080003703c00120034100290398888080003703c801200341c0006a200341b0016a2001109680808000200329034021182003290348211a2003290350211b200320032903583703582003201b3703502003201a37034820032018370340200341c0006a200341b0016a108580808000200320032903b001370300200320032903b801370308200320032903c001370310200320032903c801370318024002400240200329038801221c20022903182218510d00201c211a2018211b0c010b200329038001221a2002290310221b520d002003290378221a2002290308221b520d002003290370221a2002290300221b520d00201c21180c010b201a201b5a0d00410410828080800020022903182118200329033821190b2018211a0240024020192018520d00200329033022192002290310221a520d00200329032822192002290308221a520d00200329032022192002290300221a510d010b2019201a5a0d004104108280808000200229031821180b2003290388012018427f85221d7c20032903800122192002290310221e427f85221f7c221c2019542003290378221920022903082220427f8522217c221a2019542003290370221b20022903002219427f8522227c2223201b542202201a2002ad7c221a5071722202201c2002ad7c2224507172ad7c21254200211c02400240201b20197d221b20235a0d000240201a42017c2223201a540d002023211a0c010b202442017c2223202454ad21244200211a0c010b20242123420021240b20032023370380012003201a3703782003201b3703702003202520247c370388012003290338201d7c2003290330221a201f7c2224201a542003290328221a20217c221d201a542003290320221b20227c221f201b542202201d2002ad7c221a507172220220242002ad7c2224507172ad7c211d02400240201b20197d221b201f540d002024211f0c010b0240201a42017c221f201a540d00201f211a2024211f0c010b202442017c221f202454ad211c4200211a0b2003201f3703302003201a3703282003201b3703202003201d201c7c3703382003290308211a20032003290300221b20197c22193703002003201a20207c221c2019201b542202ad7c221937030820032003290310221b201e7c2224201c201a54200220195071722202ad7c22193703102003200329031820187c2024201b5420022019507172ad7c370318200320173a0053200320163a0052200320153a0051200320143a0050200320133a004f200320123a004e200320113a004d200320103a004c2003200f3a004b2003200e3a004a2003200d3a00492003200c3a00482003200b3a00472003200a3a0046200320093a0045200320083a0044200320073a0043200320063a0042200320053a0041200320043a0040200341e4006a200041106a280000360200200341dc006a200041086a29000037020020032000290000370254200341002903f08880800037039001200341002903f8888080003703980120034100290380898080003703a00120034100290388898080003703a801200341b0016a20034190016a200341c0006a10988080800020032903b001211820032903b801211920032903c001211a200320032903c8013703c8012003201a3703c001200320193703b801200320183703b001200341b0016a200341f0006a10978080800020034100290380888080003703b00120034100290388888080003703b80120034100290390888080003703c00120034100290398888080003703c801200341c0006a200341b0016a200010968080800020032903402118200329034821192003290350211a200320032903583703582003201a3703502003201937034820032018370340200341c0006a200341206a10978080800020034100290380888080003703b00120034100290388888080003703b80120034100290390888080003703c00120034100290398888080003703c801200341c0006a200341b0016a200110968080800020032903402118200329034821192003290350211a200320032903583703582003201a3703502003201937034820032018370340200341c0006a2003109780808000200341d0016a24808080800041010bbf0204017f017e027f077e23808080800041d0016b2201248080808000024010808080800041cc00460d0041061082808080000b410441cc00200141306a108180808000200141186a41086a20012903382202370300200141186a41106a20012802402203360200200141106a20012802542204360200200141086a200129024c220537030020012001290330220637031820012001290244220737030020012903582108200129036021092001290368210a2001290370210b200120033602c801200120023703c001200120063703b801200120053703a801200120073703a001200120043602b0012001200b370398012001200a37039001200120093703880120012008370380012001200141186a200120014180016a2000118180808000003a00cf01200141cf016a4101108680808000200141d0016a2480808080000b830301057f20002802042101410021020240024041002d00a888808000410171450d0041002802a08880800021020c010b410041003602a0888080003f002103410041013602a8888080004100200341016a3602a4888080000b200141046a2104200120026a4184807c6a2203418080046d21050240200341808004480d00200540001a410041002802a48880800020056a3602a4888080002000280204210141002802a08880800021020b410021034100200220046a418080046f3602a088808000200220014118763a0003200220014110763a0002200220014108763a0001200220013a00000240024002402000280204450d00034002402003417f4a0d0041021082808080000b200220036a41046a200028020020036a2d00003a0000200341016a22032000280204490d000b200220041086808080000c010b200220041086808080002002450d010b41002d00a8888080004101710d00410041003602a0888080003f002103410041013602a8888080004100200341016a3602a4888080000b0bd80903017f077e017f23808080800041a0016b220224808080800020024180016a108780808000200220022d0080013a00482002200228008101360049200220022900850137004d2002200228008d01360055200220022f0091013b0059200220022d0093013a005b200241002903808880800037036020024100290388888080003703682002410029039088808000370370200241002903988880800037037820024180016a200241e0006a200241c8006a10968080800020022903800121032002290388012104200229039001210520022002290398013703980120022005370390012002200437038801200220033703800120024180016a200241e0006a108580808000200220022903602203370328200220022903682206370330200220022903702205370338200220022903782204370340200421072001290318220821090240024020042008520d0020052107200520012903102209520d0020062107200620012903082209520d0020032107200320012903002209520d00200421080c010b200720095a0d00410410828080800020012903182108200229034021042002290338210520022903302106200229032821030b20042008427f857c20052001290310427f857c220820055420062001290308427f857c2204200654200320012903002207427f857c2209200354220a2004200aad7c2204507172220a2008200aad7c2206507172ad7c21084200210502400240200320077d22032009540d00200621070c010b0240200442017c22072004540d0020072104200621070c010b200642017c2207200654ad2105420021040b2002200737033820022004370330200220033703282002200820057c370340200241002903808880800037036020024100290388888080003703682002410029039088808000370370200241002903988880800037037820024180016a200241e0006a200241c8006a10968080800020022903800121032002290388012104200229039001210520022002290398013703980120022005370390012002200437038801200220033703800120024180016a200241286a109780808000200241002903808880800037036020024100290388888080003703682002410029039088808000370370200241002903988880800037037820024180016a200241e0006a200010968080800020022903800121032002290388012104200229039001210520022002290398013703980120022005370390012002200437038801200220033703800120024180016a200241e0006a1085808080002002290378210420022903702105200229036821062001290308210320022001290300220820022903607c22073703082002200320067c22062007200854220aad7c220837031020022005200129031022077c22052006200354200a2008507172220aad7c22033703182002200420012903187c2005200754200a2003507172ad7c370320200241002903808880800037036020024100290388888080003703682002410029039088808000370370200241002903988880800037037820024180016a200241e0006a200010968080800020022903800121032002290388012104200229039001210520022002290398013703980120022005370390012002200437038801200220033703800120024180016a200241086a109780808000200241a0016a24808080800041010b9a0202017f037e23808080800041f0006b2202248080808000200241d0006a108780808000200241246a20022903583702002002412c6a200228026036020020022903502103200241086a41106a200041106a280000360200200241086a41086a200041086a2900003703002002200337021c20022000290000370308200241002903f088808000370330200241002903f88880800037033820024100290380898080003703402002410029038889808000370348200241d0006a200241306a200241086a10988080800020022903502103200229035821042002290360210520022002290368370368200220053703602002200437035820022003370350200241d0006a2001109780808000200241f0006a24808080800041010ba00505037f017e047f057e017f2380808080004190016b2202248080808000200241f0006a108780808000200241246a220320022903783702002002412c6a220420022802800136020020022903702105200241086a41106a2206200041106a2207280000360200200241086a41086a2208200041086a22092900003703002002200537021c20022000290000370308200241002903f088808000370350200241002903f88880800037035820024100290380898080003703602002410029038889808000370368200241f0006a200241d0006a200241086a109880808000200229037021052002290378210a200229038001210b20022002290388013703682002200b3703602002200a37035820022005370350200241d0006a200241f0006a108580808000200229038801210a200229038001210b2002290378210c2001290308210520022001290300220d20022903707c220e37033020022005200c7c220c200e200d54220fad7c220d3703382002200b2001290310220e7c220b200c200554200f200d507172220fad7c22053703402002200a20012903187c200b200e54200f2005507172ad7c370348200241f0006a1087808080002003200229037837020020042002280280013602002002290370210520062007280000360200200820092900003703002002200537021c20022000290000370308200241002903f088808000370350200241002903f88880800037035820024100290380898080003703602002410029038889808000370368200241f0006a200241d0006a200241086a109880808000200229037021052002290378210a200229038001210b2002200229038801370388012002200b370380012002200a37037820022005370370200241f0006a200241306a10978080800020024190016a24808080800041010bb90202017f037e23808080800041f0006b2203248080808000200341086a41106a200241106a280000360200200341086a41086a200241086a290000370300200341246a200141086a2900003702002003412c6a200141106a280000360200200320022900003703082003200129000037021c200341002903f088808000370330200341002903f88880800037033820034100290380898080003703402003410029038889808000370348200341d0006a200341306a200341086a10988080800020032903502104200329035821052003290360210620032003290368370348200320063703402003200537033820032004370330200341306a200341d0006a10858080800020002003290350370300200020032903583703082000200329036037031020002003290368370318200341f0006a2480808080000bf20202027f027e23808080800041d0016b22012480808080000240108080808000412c460d0041061082808080000b4104412c200141d0006a108180808000200128026021022001290358210320012903502104200120012d00643a003820012001290065370039200120012d006d3a00412001200128016e360142200120012f01723b0146200120012d00743a0048200120012d00753a0049200120012d00763a004a200120012d00773a004b2001200437037820012003370380012001200236028801200141206a41106a2002360200200141206a41086a200337030020012004370320200141086a41106a2001280248360200200141086a41086a20012903403703002001200129033837030820014190016a200141206a200141086a20001182808080000020012001290390013703b00120012001290398013703b801200120012903a0013703c001200120012903a8013703c801200141b0016a4120108680808000200141d0016a2480808080000bd50703017f067e017f23808080800041c0016b2202248080808000200241002903808880800037038001200241002903888880800037038801200241002903908880800037039001200241002903988880800037039801200241a0016a20024180016a200010968080800020022903a001210320022903a801210420022903b0012105200220022903b8013703b801200220053703b001200220043703a801200220033703a001200241a0016a20024180016a108580808000200229039801210420022903900121052002290388012106200129030821032002200129030022072002290380017c22083703602002200320067c220620082007542209ad7c220737036820022005200129031022087c22052006200354200920075071722209ad7c22033703702002200420012903187c200520085420092003507172ad7c370378200241d8006a4200370300200241d0006a4200370300200241c8006a420037030020024200370340200241002903808880800037038001200241002903888880800037038801200241002903908880800037039001200241002903988880800037039801200241a0016a20024180016a200010968080800020022903a001210320022903a801210420022903b0012105200220022903b8013703b801200220053703b001200220043703a801200220033703a001200241a0016a200241e0006a109780808000200241c0006a200241e0006a4120108480808000200241002903b0888080003703a001200241002903b8888080003703a801200241002903c0888080003703b001200241002903c8888080003703b801200241a0016a20024180016a108580808000200229039801210420022903900121052002290388012106200129030821032002200129030022072002290380017c22083703202002200320067c220620082007542200ad7c220737032820022005200129031022087c22052006200354200020075071722200ad7c22033703302002200420012903187c200520085420002003507172ad7c370338200241002903b0888080003703a001200241002903b8888080003703a801200241002903c0888080003703b001200241002903c8888080003703b801200241a0016a200241206a109780808000200241002903b0888080003703a001200241002903b8888080003703a801200241002903c0888080003703b001200241002903c8888080003703b801200241a0016a20024180016a1085808080002002200229038001370300200220022903880137030820022002290390013703102002200229039801370318200241c0006a20024120108480808000200241c0016a2480808080000bd60102027f067e2380808080004190016b220124808080800002401080808080004138460d0041061082808080000b41044138200141206a108180808000200141186a20012802302202360200200141106a2001290328220337030020012001290320220437030820012903342105200129033c210620012903442107200129034c2108200120043703782001200236028801200120033703800120012008370370200120073703682001200637036020012005370358200141086a200141d8006a20001183808080000020014190016a2480808080000bc90101017f23808080800041e0006b2203248080808000200320012903003703202003200129030837032820032001290310370330200320012903183703382003200229000037034020032002280008360248200320022f000c3b014c200320022d000e3a004e200320022d000f3a004f20032002280010360250200341206a4134200310838080800020032003412010848080800020002003290318370318200020032903103703102000200329030837030820002003290300370300200341e0006a2480808080000be00202037f027e410021020240024041002d00a8888080004101710d00410041003602a0888080003f002103410041013602a8888080004100200341016a3602a4888080000c010b41002802a088808000220241a0807c6a2203418080046d2104200341808004480d00200440001a410041002802a48880800020046a3602a48880800041002802a08880800021020b4100200241206a418080046f3602a088808000200220012903003700002002200129030837000820022001290310370010200220012903183700182000200210888080800020002000290300220542017c22063703002000200029030820062005542201ad7c2205370308200020002903102001200550712201ad7c220537031020002000290318200120055071ad7c37031802402002450d0041002d00a8888080004101710d00410041003602a0888080003f002100410041013602a8888080004100200041016a3602a4888080000b0b8b0201017f23808080800041f0006b2203248080808000200320012903003703202003200129030837032820032001290310370330200320012903183703382003200229001437034020032002411c6a2800003602482003200241206a2f00003b014c2003200241226a2d00003a004e2003200241236a2d00003a004f2003200241246a280000360250200320022d00003a0054200320022900013700552003200229000937005d200320022f00113b0065200320022d00133a0067200341206a41c800200310838080800020032003412010848080800020002003290318370318200020032903103703102000200329030837030820002003290300370300200341f0006a2480808080000b0b990102004180080b2c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041b0080b6001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000ea10046e616d6501e21019000d6765745f63616c6c5f73697a65010f636f70795f63616c6c5f76616c7565020b73797374656d5f68616c74031063727970746f5f6b656363616b323536040b77726974655f6576656e74050c6c6f61645f73746f72616765060a7365745f72657475726e070a6765745f73656e646572080c736176655f73746f72616765090573746172740a4d6465637265617365416c6c6f77616e6365286c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2c206c61636861696e3a3a75696e74323536290bac01766f6964206c61636861696e3a3a696e766f6b655f636f6e74726163745f6d6574686f643c626f6f6c2c206c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2c206c61636861696e3a3a75696e743235363e28626f6f6c20282a29286c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2c206c61636861696e3a3a75696e7432353629290c727472616e7366657246726f6d286c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2c206c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2c206c61636861696e3a3a75696e74323536290d8002766f6964206c61636861696e3a3a696e766f6b655f636f6e74726163745f6d6574686f643c626f6f6c2c206c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2c206c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2c206c61636861696e3a3a75696e743235363e28626f6f6c20282a29286c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2c206c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2c206c61636861696e3a3a75696e7432353629290e43766f6964206c61636861696e3a3a72657475726e5f76616c75653c6c61636861696e3a3a737472696e673e286c61636861696e3a3a737472696e6720636f6e737426290f447472616e73666572286c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2c206c61636861696e3a3a75696e74323536291043617070726f7665286c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2c206c61636861696e3a3a75696e7432353629114d696e637265617365416c6c6f77616e6365286c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2c206c61636861696e3a3a75696e7432353629125d616c6c6f77616e6365286c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2c206c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2913f501766f6964206c61636861696e3a3a696e766f6b655f636f6e74726163745f6d6574686f643c6c61636861696e3a3a75696e743235362c206c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2c206c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e203e286c61636861696e3a3a75696e7432353620282a29286c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2c206c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e292914406d696e74286c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2c206c61636861696e3a3a75696e743235362915ac01766f6964206c61636861696e3a3a696e766f6b655f636f6e74726163745f6d6574686f643c766f69642c206c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2c206c61636861696e3a3a75696e743235363e28766f696420282a29286c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2c206c61636861696e3a3a75696e7432353629291693016c61636861696e3a3a75696e74323536206c61636861696e3a3a6b65795f616464726573733c6c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e203e286c61636861696e3a3a75696e743235362c206c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e20636f6e73742629175a766f6964206c61636861696e3a3a736176655f746f5f73746f726167653c6c61636861696e3a3a75696e743235363e286c61636861696e3a3a75696e743235362c206c61636861696e3a3a75696e7432353620636f6e737426291889026c61636861696e3a3a75696e74323536206c61636861696e3a3a6b65795f616464726573733c6c61636861696e3a3a7475706c653c6c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2c206c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e203e203e286c61636861696e3a3a75696e743235362c206c61636861696e3a3a7475706c653c6c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e2c206c61636861696e3a3a66697865645f61727261793c756e7369676e656420636861722c203230753e203e20636f6e7374262900750970726f647563657273010c70726f6365737365642d62790105636c616e6755392e302e31202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a656374206331613061323133333738613435386662656131613563373762333135633764636530386664303529"
                .HexToBytes()
                           );

            if (!VirtualMachine.VerifyContract(contract.ByteCode, true))
            {
                throw new Exception("Unable to validate smart-contract code");
            }

            var snapshot = stateManager.NewSnapshot();

            snapshot.Contracts.AddContract(UInt160Utils.Zero, contract);
            stateManager.Approve();

            Console.WriteLine("Contract Hash: " + hash.ToHex());

            for (var i = 0; i < 1; ++i)
            {
                var currentTime     = TimeUtils.CurrentTimeMillis();
                var currentSnapshot = stateManager.NewSnapshot();

                var sender = "0x6bc32575acb8754886dc283c2c8ac54b1bd93195".HexToBytes().ToUInt160();
                var to     = "0xfd893ce89186fc6861d339cb6ab5d75458e3daf3".HexToBytes().ToUInt160();

                /* give to sender 1 token */
                var valueToTransfer = Money.Wei;
                stateManager.CurrentSnapshot.Storage.SetValue(contract.ContractAddress, sender.ToUInt256(),
                                                              (valueToTransfer * 3).ToUInt256());
                var context = new InvocationContext(sender, currentSnapshot, new TransactionReceipt());

                {
                    /* ERC-20: totalSupply (0x18160ddd) */
                    Console.WriteLine("\nERC-20: totalSupply()");
                    var input = ContractEncoder.Encode("totalSupply()");
                    // Console.WriteLine("ABI: " + input.ToHex());
                    var status = VirtualMachine.InvokeWasmContract(contract, context, input, 100_000_000_000_000UL);
                    if (status.Status != ExecutionStatus.Ok)
                    {
                        stateManager.Rollback();
                        Console.WriteLine("Contract execution failed: " + status);
                        return;
                    }

                    Console.WriteLine($"Result: {status.ReturnValue!.ToHex()}");
                }
                {
                    /* mint */
                    Console.WriteLine($"\nERC-20: mint({sender.ToHex()},{Money.FromDecimal(100)})");
                    var input = ContractEncoder.Encode("mint(address,uint256)", sender, Money.FromDecimal(100));
                    // Console.WriteLine("ABI: " + input.ToHex());
                    var status = VirtualMachine.InvokeWasmContract(contract, context, input, 100_000_000_000_000UL);
                    if (status.Status != ExecutionStatus.Ok)
                    {
                        stateManager.Rollback();
                        Console.WriteLine("Contract execution failed: " + status);
                        goto exit_mark;
                    }

                    Console.WriteLine($"Result: {status.ReturnValue!.ToHex()}");
                }
                {
                    /* ERC-20: totalSupply (0x18160ddd) */
                    Console.WriteLine("\nERC-20: totalSupply()");
                    var input = ContractEncoder.Encode("totalSupply()");
                    // Console.WriteLine("ABI: " + input.ToHex());
                    var status = VirtualMachine.InvokeWasmContract(contract, context, input, 100_000_000_000_000UL);
                    if (status.Status != ExecutionStatus.Ok)
                    {
                        stateManager.Rollback();
                        Console.WriteLine("Contract execution failed: " + status);
                        goto exit_mark;
                    }

                    Console.WriteLine($"Result: {status.ReturnValue!.ToHex()}");
                }
                {
                    /* ERC-20: balanceOf */
                    Console.WriteLine($"\nERC-20: balanceOf({sender.ToHex()}");
                    var input = ContractEncoder.Encode("balanceOf(address)", sender);
                    // Console.WriteLine("ABI: " + input.ToHex());
                    var status = VirtualMachine.InvokeWasmContract(contract, context, input, 100_000_000_000_000UL);
                    if (status.Status != ExecutionStatus.Ok)
                    {
                        stateManager.Rollback();
                        Console.WriteLine("Contract execution failed: " + status);
                        goto exit_mark;
                    }

                    Console.WriteLine($"Result: {status.ReturnValue!.ToHex()}");
                }
                {
                    /* ERC-20: transfer */
                    Console.WriteLine($"\nERC-20: transfer({to.ToHex()},{Money.FromDecimal(50)})");
                    var input = ContractEncoder.Encode("transfer(address,uint256)", to, Money.FromDecimal(50));
                    // Console.WriteLine($"ABI: {input.ToHex()}");
                    var status = VirtualMachine.InvokeWasmContract(contract, context, input, 100_000_000_000_000UL);
                    if (status.Status != ExecutionStatus.Ok)
                    {
                        stateManager.Rollback();
                        Console.WriteLine("Contract execution failed: " + status);
                        goto exit_mark;
                    }

                    Console.WriteLine($"Result: {status.ReturnValue!.ToHex()}");
                }
                {
                    /* ERC-20: balanceOf */
                    Console.WriteLine($"\nERC-20: balanceOf({sender.ToHex()}");
                    var input = ContractEncoder.Encode("balanceOf(address)", sender);
                    // Console.WriteLine("ABI: " + input.ToHex());
                    var status = VirtualMachine.InvokeWasmContract(contract, context, input, 100_000_000_000_000UL);
                    if (status.Status != ExecutionStatus.Ok)
                    {
                        stateManager.Rollback();
                        Console.WriteLine("Contract execution failed: " + status);
                        goto exit_mark;
                    }

                    Console.WriteLine($"Result: {status.ReturnValue!.ToHex()}");
                }
                {
                    /* ERC-20: balanceOf */
                    Console.WriteLine($"\nERC-20: balanceOf({to.ToHex()}");
                    var input = ContractEncoder.Encode("balanceOf(address)", to);
                    // Console.WriteLine("ABI: " + input.ToHex());
                    var status = VirtualMachine.InvokeWasmContract(contract, context, input, 100_000_000_000_000UL);
                    if (status.Status != ExecutionStatus.Ok)
                    {
                        stateManager.Rollback();
                        Console.WriteLine("Contract execution failed: " + status);
                        goto exit_mark;
                    }

                    Console.WriteLine($"Result: {status.ReturnValue!.ToHex()}");
                }
                {
                    /* ERC-20: approve */
                    Console.WriteLine($"\nERC-20: approve({to.ToHex()},{Money.FromDecimal(50)})");
                    var input = ContractEncoder.Encode("approve(address,uint256)", to, Money.FromDecimal(50));
                    // Console.WriteLine($"ABI: {input.ToHex()}");
                    var status = VirtualMachine.InvokeWasmContract(contract, context, input, 100_000_000_000_000UL);
                    if (status.Status != ExecutionStatus.Ok)
                    {
                        stateManager.Rollback();
                        Console.WriteLine("Contract execution failed: " + status);
                        goto exit_mark;
                    }

                    Console.WriteLine($"Result: {status.ReturnValue!.ToHex()}");
                }
                {
                    /* ERC-20: transferFrom */
                    Console.WriteLine($"\nERC-20: transferFrom({to.ToHex()},{Money.FromDecimal(50)})");
                    var input = ContractEncoder.Encode("transferFrom(address,address,uint256)", sender, to,
                                                       Money.FromDecimal(50));
                    // Console.WriteLine($"ABI: {input.ToHex()}");
                    var status = VirtualMachine.InvokeWasmContract(contract, context, input, 100_000_000_000_000UL);
                    if (status.Status != ExecutionStatus.Ok)
                    {
                        stateManager.Rollback();
                        Console.WriteLine("Contract execution failed: " + status);
                        goto exit_mark;
                    }

                    Console.WriteLine($"Result: {status.ReturnValue!.ToHex()}");
                }

                {
                    /* ERC-20: balanceOf */
                    Console.WriteLine($"\nERC-20: balanceOf({sender.ToHex()}");
                    var input = ContractEncoder.Encode("balanceOf(address)", sender);
                    // Console.WriteLine("ABI: " + input.ToHex());
                    var status = VirtualMachine.InvokeWasmContract(contract, context, input, 100_000_000_000_000UL);
                    if (status.Status != ExecutionStatus.Ok)
                    {
                        stateManager.Rollback();
                        Console.WriteLine("Contract execution failed: " + status);
                        goto exit_mark;
                    }

                    Console.WriteLine($"Result: {status.ReturnValue!.ToHex()}");
                }
                {
                    /* ERC-20: balanceOf */
                    Console.WriteLine($"\nERC-20: balanceOf({to.ToHex()}");
                    var input = ContractEncoder.Encode("balanceOf(address)", to);
                    // Console.WriteLine("ABI: " + input.ToHex());
                    var status = VirtualMachine.InvokeWasmContract(contract, context, input, 100_000_000_000_000UL);
                    if (status.Status != ExecutionStatus.Ok)
                    {
                        stateManager.Rollback();
                        Console.WriteLine("Contract execution failed: " + status);
                        goto exit_mark;
                    }

                    Console.WriteLine($"Result: {status.ReturnValue!.ToHex()}");
                }

                stateManager.Approve();
exit_mark:
                var elapsedTime = TimeUtils.CurrentTimeMillis() - currentTime;
                Console.WriteLine("Elapsed Time: " + elapsedTime + "ms");
            }
        }
 public BlockchainEventFilterParams(BlockchainEvent eventType, ulong lastSyncedBlock)
 {
     EventType       = eventType;
     LastSyncedBlock = lastSyncedBlock;
     PollingTime     = TimeUtils.CurrentTimeMillis();
 }