コード例 #1
0
ファイル: BaseTest.cs プロジェクト: ssshuler/Ditch
        public BaseTest()
        {
            Login = new Dictionary <string, string>()
            {
                { "Steem", "UserLogin" },
                { "Golos", "UserLogin" }
            };

            UserPrivateKeys = new Dictionary <string, List <byte[]> >()
            {
                { "Steem", new List <byte[]> {
                      Base58.TryGetBytes("5**************************************************")
                  } },
                { "Golos", new List <byte[]> {
                      Base58.TryGetBytes("5**************************************************")
                  } }
            };

            Chain = new Dictionary <string, ChainInfo>();

            var steemChainInfo = ChainManager.GetChainInfo(KnownChains.Steem);

            Chain.Add("Steem", steemChainInfo);
            Steem = new OperationManager(steemChainInfo.Url, steemChainInfo.ChainId);

            var golosChainInfo = ChainManager.GetChainInfo(KnownChains.Golos);

            Chain.Add("Golos", golosChainInfo);
            Golos = new OperationManager(golosChainInfo.Url, golosChainInfo.ChainId);
        }
コード例 #2
0
        public OperationManagerTest()
        {
            _login = new Dictionary <string, string>()
            {
                { "Steem", "Test Login" },
                { "Golos", Constants.GolosUser }
            };
            _userPrivateKeys = new Dictionary <string, List <byte[]> >()
            {
                { "Steem", new List <byte[]> {
                      Base58.GetBytes(Constants.SteemPostingKey)
                  } },
                { "Golos", new List <byte[]> {
                      Base58.GetBytes(Constants.GolosPostingKey)
                  } }
            };
            _chain = new Dictionary <string, ChainInfo>();

            var steemChainInfo = ChainManager.GetChainInfo(KnownChains.Steem);

            _chain.Add("Steem", steemChainInfo);
            _steem = new OperationManager(steemChainInfo.Url, steemChainInfo.ChainId);

            var golosChainInfo = ChainManager.GetChainInfo(KnownChains.Golos);

            _chain.Add("Golos", golosChainInfo);
            _golos = new OperationManager(golosChainInfo.Url, golosChainInfo.ChainId);
        }
コード例 #3
0
 public BlockController(ChainManager chainManager, Miner miner, ContactLedger contactLedger, HttpProvider httpProvider)
 {
     _chainManager  = chainManager;
     _miner         = miner;
     _contactLedger = contactLedger;
     _httpProvider  = httpProvider;
 }
コード例 #4
0
        public void FollowOperation()
        {
            Login = new Dictionary <string, string>()
            {
                { "Steem", txtUsername.Text }
            };

            UserPrivateKeys = new Dictionary <string, List <byte[]> >()
            {
                { "Steem", new List <byte[]> {
                      Base58.GetBytes(txtPassword.Text)
                  } }
            };

            Chain = new Dictionary <string, ChainInfo>();

            var steemChainInfo = ChainManager.GetChainInfo(KnownChains.Steem);

            Chain.Add("Steem", steemChainInfo);
            Steem = new OperationManager(steemChainInfo.Url, steemChainInfo.ChainId);


            var op    = new UnFollowOperation(txtUsername.Text, txtFollower.Text, FollowType.blog, txtUsername.Text);
            var prop  = Manager("Steem").VerifyAuthority(UserPrivateKeys["Steem"], op);
            var propa = Manager("Steem").BroadcastOperations(UserPrivateKeys["Steem"], op);

            if (propa.Error == null)
            {
                lblStatus.Text = "Follow user '" + txtFollower.Text + "' transaction successfully completed!";
            }
            else
            {
                lblStatus.Text = "Error follow user: " + propa.Error.Message.ToString();
            }
        }
コード例 #5
0
        //责任链
        //用于多个处理对象和处理数据的解耦
        //新增加处理对象的时候,只需要添加新的处理对象即可。
        static void Main(string[] args)
        {
            Console.WriteLine(MethodBase.GetCurrentMethod().DeclaringType.Namespace);

            IHandler leader   = new Leader();
            IHandler manager  = new Manager();
            IHandler director = new Director();

            //Method B
            ChainManager mgrChain = new ChainManager();

            mgrChain.Add(leader);
            mgrChain.Add(manager);
            mgrChain.Add(director);

            mgrChain.Handle(500);
            mgrChain.Handle(1500);
            mgrChain.Handle(15000);

            //Method A
            leader.Next  = manager;
            manager.Next = director;

            leader.Handle(500);
            leader.Handle(1500);
            leader.Handle(15000);


            Console.ReadKey();
        }
コード例 #6
0
    private void LateUpdate()
    {
        if (applyTransforms)
        {
            if (target == null)
            {
                return;
            }

            // Get the chain and assert that it is not broken
            Chain c = ChainManager.BuildChain(root);
            Debug.Assert(!c.IsBroken());

            List <Joint> joints = new List <Joint>();
            for (int i = 0; i < c.BoneCount; i++)
            {
                joints.Add(c.GetBone(i).Base);
            }
            joints.Add(c.EndEffector);

            Chain_FABRIK.Solve(c, target);
            ChainManager.ApplyJointTransforms(root, joints);

            visualizer.Show();
            visualizer.SetChain(c);
        }
    }
コード例 #7
0
    //

    private void Start()
    {
        if (root == null)
        {
            root = transform;
        }

        visualizer = new ChainManager(transform);
    }
コード例 #8
0
    void LateUpdate()
    {
        if (runIK)
        {
            runIK = false;
            if (Target == null)
            {
                return;
            }

            // Get the chain and assert that it is not broken
            Chain chain = ChainManager.BuildChain(ChainRoot);
            Debug.Assert(!chain.IsBroken());

            var chainCopy = chain.Copy();
            chainCopy.Destroy();

            chain.Restore();
            Chain_FABRIK.Solve(chain, Target);
            ChainManager.ApplyJointTransforms(ChainRoot, chain.GetJoints());

            chain = ChainManager.BuildChain(ChainRoot);
            ConstraintsUtil.Constrain(chain, Target);
            ChainManager.ApplyJointTransforms(ChainRoot, chain.GetJoints());
        }

        if (Input.GetKeyDown(KeyCode.I))
        {
            runIK = false;
            Chain chain = ChainManager.BuildChain(ChainRoot);
            chain.Restore();
            Chain_FABRIK.Solve(chain, Target);
            ChainManager.ApplyJointTransforms(ChainRoot, chain.GetJoints());
        }

        if (Input.GetKeyDown(KeyCode.R))
        {
            runIK = false;
            Chain chain = ChainManager.BuildChain(ChainRoot);
            chain.Restore();
            ChainManager.ApplyJointTransforms(ChainRoot, chain.GetJoints());
        }

        if (Input.GetKeyDown(KeyCode.C))
        {
            Chain chain = ChainManager.BuildChain(ChainRoot);
            ConstraintsUtil.Constrain(chain, Target);
            ChainManager.ApplyJointTransforms(ChainRoot, chain.GetJoints());
        }

        if (Input.GetKeyDown(KeyCode.D))
        {
            Chain chain = ChainManager.BuildChain(ChainRoot);
            DisplayChainInfo(chain);
        }
    }
コード例 #9
0
        public TextSampleForm()
        {
            InitializeComponent();

            m_recorder = new TextEditor(textBox1);

            ChainManager.IniParams iniParams = new ChainManager.IniParams();
            iniParams.RecordCollection.Add(m_recorder);
            iniParams.DontRecordWhenStatusError = true;
            m_chainManager = new ChainManager(iniParams);
        }
コード例 #10
0
        public ClientServer(Node.Node node)
        {
            _chainManager       = node.ChainManager;
            _configuration      = node.NodeConfiguration;
            _attachementManager = node.AttachementManager;
            _transactionManager = node.TransactionManager;
            _pubsub             = node.PubSub;

            _pubsub.Subscribe <BlockEvent <CoreBlock> >(this, NewCoreBlock);
            _pubsub.Subscribe <BlockEvent <ServiceBlock> >(this, NewServiceBlock);
            _pubsub.Subscribe <BlockEvent <DataBlock> >(this, NewDataBlock);
        }
コード例 #11
0
    // Use this for initialization
    void Start()
    {
        turnManager  = this.gameObject.GetComponent <TurnManager>();
        chainManager = this.gameObject.GetComponent <ChainManager>();
        scoreManager = this.gameObject.GetComponent <ScoreManager>();
        stage        = new GameObject[StageSize, StageSize];
        deleteTable  = new bool[StageSize, StageSize];
        spawner      = new Spawner(ref blocks, StageSize, this.SpawnProbWeight);
        spawner.InitStage(ref stage);
#if DEBUG
        TotalNum  = spawner.BlockInfoProp.GetTotalNum;
        blockNums = spawner.BlockInfoProp.GetBlockNums;
#endif
    }
コード例 #12
0
        /// <summary> Raises the chain geometry event. </summary>
        ///
        /// <param name="sender"> Source of the event. </param>
        /// <param name="e">      Event information to send to registered event handlers. </param>
        private void OnChainGeometry(object sender, EventArgs e)
        {
            UtilityService.Initialize();

            var chains = ChainManager.ChainGeometry(UtilityService.DrawRectangle());

            if (!chains.Any())
            {
                UtilityService.ShowMessage("No chains returned");
                return;
            }

            if (this.Contour(chains))
            {
                UtilityService.FitScreen();
            }
        }
コード例 #13
0
ファイル: Node.cs プロジェクト: HeleusCore/Heleus.Node
        public async Task <int> Run()
        {
            if (_quitToken.IsCancellationRequested)
            {
                return(0);
            }

            await Kademlia.Start();

            TransactionManager.Start();
            await CouncilManager.Start();

            await NodeServer.Start();

            await ClientServer.Start();

            if (ServiceServer != null)
            {
                await ServiceServer.Start();
            }

            await _quitToken.WaitAsync();

            await PubSub.PublishAsync(new QuitEvent());

            await NodeServer.Stop();

            await ClientServer.Stop();

            await CouncilManager.Stop();

            TransactionManager.Stop();
            await Kademlia.Stop();

            await ChainManager.Stop();

            if (ServiceServer != null)
            {
                await ServiceServer.Stop();
            }

            await(Host as Host).Stop();

            return(0);
        }
コード例 #14
0
        public Daemon(Mutex chainMutex, ChainManager chainManager, App.ILogger logger, App.IInventoryNotifier inventoryNotifier, CancellationToken cancellationToken)
        {
            this.chainMutex        = chainMutex;
            this.chainManager      = chainManager;
            this.logger            = logger;
            this.inventoryNotifier = inventoryNotifier;
            this.cancellationToken = cancellationToken;

            nodeNonce = createNodeNonce();

            peers = new List <Context>();

            ibd = new InitialBlockDownload();

            houseKeepingLock = new object();

            runHouseKeeping();
        }
コード例 #15
0
        public MultiActorSampleForm()
        {
            InitializeComponent();

            m_textEdiorRecorder1 = new TextEditor(textBox1);
            m_textEdiorRecorder2 = new TextEditor(textBox2);

            ChainManager.IniParams param = new ChainManager.IniParams()
            {
                DontRecordWhenStatusError = true,
            };

            param.RecordCollection.Add(m_textEdiorRecorder1);
            param.RecordCollection.Add(m_textEdiorRecorder2);

            m_chainManager = new ChainManager(param);
            CheckUndoRedoStatus();
        }
コード例 #16
0
ファイル: Startup.cs プロジェクト: Simonzicek/pancoin-node
        public void ConfigureServices(IServiceCollection services)
        {
            var mvcCore = services.AddMvcCore();

            mvcCore.AddJsonFormatters(options => options.ContractResolver = new CamelCasePropertyNamesContractResolver());

            services.AddSingleton(services);

            var httpProvider = new HttpProvider();

            services.AddSingleton(httpProvider);

            services.AddSingleton(new ContactLedger(httpProvider));

            var balanceLedger = new BalanceLedger();

            services.AddSingleton(balanceLedger);

            var chainManager = new ChainManager(balanceLedger);

            services.AddSingleton(chainManager);

            var txPool = new TransactionPool(balanceLedger);

            services.AddSingleton(txPool);

            services.AddSingleton(new Miner(balanceLedger, txPool, chainManager));

            var jobs = new List <Tuple <Type, string> >()
            {
                new Tuple <Type, string>(typeof(FetchContactsJob), everyMinuteCron),
                new Tuple <Type, string>(typeof(FetchBlocksJob), everyMinuteCron),
                new Tuple <Type, string>(typeof(TransactionPoolUpdateJob), everyMinuteCron),
            };

            var serviceProvider = services.BuildServiceProvider();

            ScheduleJobs(jobs, serviceProvider);

            if (Program.Settings.mine)
            {
                Program.MinerTask = Task.Run(() => StartMiner(serviceProvider));
            }
        }
コード例 #17
0
        /// <summary> Raises the chain level event. </summary>
        ///
        /// <param name="sender"> Source of the event. </param>
        /// <param name="e">      Event information to send to registered event handlers. </param>
        private void OnChainLevel(object sender, EventArgs e)
        {
            const int Level = 5;

            UtilityService.Initialize();

            UtilityService.DrawBlock(new Point3D(0, 0, 0), new Point3D(10, 10, 0), -0.5, Level);

            var chains = ChainManager.ChainAll(true, false, ViewManager.CPlane, ChainDirectionType.Clockwise, Level);

            if (!chains.Any())
            {
                UtilityService.ShowMessage("No chains returned");
            }

            if (this.Contour(chains))
            {
                UtilityService.FitScreen();
            }
        }
コード例 #18
0
        /// <summary> Raises the chain all selected event. </summary>
        ///
        /// <param name="sender"> Source of the event. </param>
        /// <param name="e">      Event information to send to registered event handlers. </param>
        private void OnChainAllSelected(object sender, EventArgs e)
        {
            UtilityService.Initialize();

            UtilityService.DrawPolygon();

            SelectionManager.SelectAllGeometry();

            var chains = ChainManager.ChainAllSelected(true);

            if (!chains.Any())
            {
                UtilityService.ShowMessage("No chains returned");
                return;
            }

            if (this.Contour(chains))
            {
                UtilityService.FitScreen();
            }
        }
コード例 #19
0
        /// <summary> Creates contour operation. </summary>
        ///
        /// <param name="tool">   The tool. </param>
        /// <param name="chains"> The chains. </param>
        ///
        /// <returns> The new contour operation. </returns>
        internal static ContourOperation CreateContourOperation(EndMillFlatTool tool, Chain[] chains)
        {
            // Throw a contour around the chains
            var contourOp = new ContourOperation
            {
                OperationTool = tool,

                CutterComp =
                {
                    Direction   = CutterCompDir.CutterCompLeft,
                    RollCorners = CutterCompRoll.CutterCompRollAll
                },

                Linking =
                {
                    Depth     = -.25,
                    Retract   =    1,
                    RetractOn = true,
                    TopStock  = 0
                },

                SpindleSpeed = 2500,
                FeedRate     = 12,
                NCIName      = "Contour #1",
                Name         = "Contour operation created via API"
            };

            ChainManager.StartChainAtLongest(chains);
            ChainManager.SortChains(chains, ChainManager.SortType.Area, ChainManager.SortOrder.Ascending);

            contourOp.SetChainArray(chains);
            if (!contourOp.Commit())
            {
                return(null);
            }

            contourOp.Regenerate();

            return(contourOp);
        }
コード例 #20
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            string eosNodeUrl = this.Configuration.GetValue <string>("EosNodeUrl", "");
            var    eosConfig  = new EosConfigurator()
            {
                HttpEndpoint  = eosNodeUrl,
                ExpireSeconds = 60
            };
            var chainManager = new ChainManager(eosConfig);

            services.AddSingleton <ChainManager>(chainManager);

            services.UseTransactionsManager(this.Configuration, this.m_LoggerFactory);

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            // In production, the React files will be served from this directory
            services.AddSpaStaticFiles(configuration =>
            {
                configuration.RootPath = "ClientApp/build";
            });
        }
コード例 #21
0
        public void PostDataToSteemWithUpvote()
        {
            Login = new Dictionary <string, string>()
            {
                { "Steem", txtUsername.Text }
            };

            UserPrivateKeys = new Dictionary <string, List <byte[]> >()
            {
                { "Steem", new List <byte[]> {
                      Base58.GetBytes(txtPassword.Text)
                  } }
            };

            Chain = new Dictionary <string, ChainInfo>();

            var steemChainInfo = ChainManager.GetChainInfo(KnownChains.Steem);

            Chain.Add("Steem", steemChainInfo);
            Steem = new OperationManager(steemChainInfo.Url, steemChainInfo.ChainId);

            var op    = new PostOperation(txtTag1.Text, txtUsername.Text, txtTitle.Text, txtResponse.Text, "{\"app\": \"steemit/0.1\", \"tags\": [\"" + txtTag2.Text + "\",\"" + txtTag3.Text + "\",\"" + txtTag4.Text + "\",\"" + txtTag5.Text + "\"]}");
            var prop  = Manager("Steem").VerifyAuthority(UserPrivateKeys["Steem"], op);
            var propa = Manager("Steem").BroadcastOperations(UserPrivateKeys["Steem"], op);

            if (propa.Error == null)
            {
                lblStatus.Text = "'Post to STEEM' transaction successfully completed!";

                var up     = new UpVoteOperation(txtUsername.Text, txtUsername.Text, op.Permlink);
                var uprop  = Manager("Steem").VerifyAuthority(UserPrivateKeys["Steem"], up);
                var upropa = Manager("Steem").BroadcastOperations(UserPrivateKeys["Steem"], up);
            }
            else
            {
                lblStatus.Text = "Error posting on STEEM: " + propa.Error.Message.ToString();
            }
        }
コード例 #22
0
        public void PostDataToSteem()
        {
            Login = new Dictionary <string, string>()
            {
                { "Steem", txtUsername.Text }
            };

            UserPrivateKeys = new Dictionary <string, List <byte[]> >()
            {
                { "Steem", new List <byte[]> {
                      Base58.GetBytes(txtPassword.Text)
                  } }
            };

            Chain = new Dictionary <string, ChainInfo>();

            var steemChainInfo = ChainManager.GetChainInfo(KnownChains.Steem);

            Chain.Add("Steem", steemChainInfo);
            Steem = new OperationManager(steemChainInfo.Url, steemChainInfo.ChainId);

            var op   = new PostOperation(txtTag1.Text, txtUsername.Text, txtTitle.Text, txtResponse.Text, "{\"app\": \"steemit/0.1\", \"tags\": [\"" + txtTag2.Text + "\",\"" + txtTag3.Text + "\",\"" + txtTag4.Text + "\",\"" + txtTag5.Text + "\"]}");
            var prop = Manager("Steem").VerifyAuthority(UserPrivateKeys["Steem"], op);
            var resp = Manager("Steem").GetAccountBandwidth(txtUsername.Text, BandwidthType.Post);
            var Text = JsonConvert.SerializeObject(resp.Result);

            var propa = Manager("Steem").BroadcastOperations(UserPrivateKeys["Steem"], op);

            if (propa.Error == null)
            {
                lblStatus.Text = "Posted to STEEM blockchain, finished";
            }
            else
            {
                lblStatus.Text = propa.Error.Message.ToString();
            }
        }
コード例 #23
0
ファイル: NodeServer.cs プロジェクト: HeleusCore/Heleus.Node
        public NodeServer(Node.Node node, int maxIncomingConnections, int maxOutgoingConnections)
        {
            _kademlia           = node.Kademlia;
            _chainManager       = node.ChainManager;
            _transactionManager = node.TransactionManager;
            _node = node;

            _maxIncomingConnections = maxIncomingConnections;
            _maxOutgoingConnections = maxOutgoingConnections;

            _connections.Add(_pendingConnections);
            _connections.Add(_incomingConnections);
            _connections.Add(_outgoingConnections);

            foreach (var ac in node.NodeConfiguration.AutoConnectNodes)
            {
                _autoConnect.Add(new NodeAutoConnect(ac));
            }

            foreach (var id in node.NodeConfiguration.TrustedNodeIds)
            {
                _trustedNodeIds.Add(id);
            }
        }
コード例 #24
0
ファイル: TouchManager.cs プロジェクト: Mordokay/ShapeFrenzy
    void Start()
    {
        chainManager = this.GetComponent <ChainManager>();

        mobileJoystickOriginalPos               = mobileJoystick.transform.position;
        mobileJoystickBackroundOriginalPos      = mobileJoystickBackround.transform.position;
        mobileChainJoystickOriginalPos          = mobileChainJoystick.transform.position;
        mobileChainJoystickBackroundOriginalPos = mobileChainJoystickBackround.transform.position;

        if (freeTouchMovement)
        {
            mobileJoystick.SetActive(false);
            mobileJoystickBackround.SetActive(false);
            mobileChainJoystick.SetActive(false);
            mobileChainJoystickBackround.SetActive(false);
        }
        else
        {
            mobileJoystick.SetActive(true);
            mobileJoystickBackround.SetActive(true);
            mobileChainJoystick.SetActive(true);
            mobileChainJoystickBackround.SetActive(true);
        }
    }
コード例 #25
0
ファイル: Chain.cs プロジェクト: Mordokay/The4000
 // Use this for initialization
 void Start()
 {
     chainManager = GameObject.Find("GameManager").GetComponent <ChainManager>();
 }
コード例 #26
0
 void Start()
 {
     chainManager = new ChainManager(ChainRoot);
 }
コード例 #27
0
 public ChainController(ChainManager chainManager, TransactionsManager transactionsManager)
 {
     m_ChainManager        = chainManager;
     m_TransactionsManager = transactionsManager;
 }
コード例 #28
0
ファイル: Node.cs プロジェクト: HeleusCore/Heleus.Node
        public async Task <bool> Start(string[] args, CancellationTokenSource quiteToken)
        {
            _quitToken = quiteToken;

            if (_quitToken.IsCancellationRequested)
            {
                return(false);
            }

            var dataPath = "heleusdata";

            var genesis        = false;
            var sync           = false;
            var run            = false;
            var init           = false;
            var newChainConfig = false;

            if (args.Length == 1)
            {
                dataPath = args[0];
                run      = true;
            }
            else if (args.Length == 2)
            {
                dataPath = args[0];
                var cmd = args[1];

                if (cmd == "init")
                {
                    init = true;
                }
                else if (cmd == "run")
                {
                    run = true;
                }
                else if (cmd == "sync")
                {
                    sync = true;
                }
                else if (cmd == "chainconfig")
                {
                    newChainConfig = true;
                }
                else if (cmd == "genesis")
                {
                    genesis = true;
                }
                else
                {
                    Usage();
                    return(false);
                }
            }
            else
            {
                Usage();
                return(false);
            }

            if ((run || sync) && !File.Exists(Path.Combine(dataPath, $"{nameof(NodeConfig).ToLower()}.txt")))
            {
                Usage();
                var dp = new DirectoryInfo(dataPath);
                Log.Error($"Data path {dp.FullName} not initalized.", this);
                return(false);
            }

            Storage = new Storage(dataPath);
            if (!Storage.IsWriteable)
            {
                Log.Fatal($"Data path {Storage.Root} is not writeable!", this);
                return(false);
            }

            if (genesis)
            {
                Storage.DeleteDirectory("cache");
                Storage.DeleteDirectory("chains");
            }

            PubSub = Log.PubSub = new PubSub();

            Log.Write($"Starting Heleus Node (Version {Program.Version}).");
            Log.Trace($"PID {System.Diagnostics.Process.GetCurrentProcess().Id}");

            Log.Write($"Data path is '{Storage.Root.FullName}'.");

            var config = Config.Load <NodeConfig>(Storage);

            Log.AddIgnoreList(config.LogIgnore);
            Log.LogLevel = config.LogLevel;

            if (Program.IsDebugging)
            {
                Log.LogLevel = LogLevels.Trace;
            }

            if (newChainConfig)
            {
                var chainConfig = Config.Load <ChainConfig>(Storage, true);
                //if (chainConfig.Chains.Count == 0)
                {
                    Log.Write("Chain config generated.");

                    chainConfig.Chains.Add(new ChainConfig.ChainInfo {
                        ChainKeys = new List <ChainConfig.ChainKeyInfo> {
                            new ChainConfig.ChainKeyInfo {
                                ChainKey = string.Empty, ChainKeyPassword = string.Empty, AttachementKey = -1
                            }
                        }
                    });
                    Config.Save(chainConfig);
                }

                return(false);
            }

            if (init)
            {
                Log.Write("Config file generated.");
                return(false);
            }

            if (!genesis)
            {
                if (config.NetworkPublicKey.IsNullOrEmpty())
                {
                    Log.Write("Network key not set. Querying beacon nodes.");
                    var beacons = config.BeaconNodes;
                    foreach (var beacon in beacons)
                    {
                        Log.Write($"Querying beacon node {beacon}.");
                        var client   = new NodeClient(new Uri(beacon));
                        var nodeInfo = (await client.DownloadNodeInfo()).Data;
                        if (nodeInfo != null)
                        {
                            config.NetworkPublicKey = nodeInfo.NetworkKey.HexString;
                            Config.Save(config);
                            Log.Write($"Network key set to {config.NetworkPublicKey}.");
                            break;
                        }
                    }
                }

                if (config.NetworkPublicKey.IsNullOrEmpty())
                {
                    Log.Write("No valid network key found or set.", this);
                    return(false);
                }
            }

            NodeConfiguration = new NodeConfiguration(config, Config.Load <CoreKeyConfig>(Storage, false), Config.Load <ChainConfig>(Storage, false));
            Host = new Host(config);
            AttachementManager = new AttachementManager(this);
            ChainManager       = new ChainManager(this);
            if (!await ChainManager.Initalize())
            {
                return(false);
            }

            if (genesis)
            {
                var result = GenesisBlock.Generate(Storage);

                var blockData = new BlockData <CoreBlock>(result.Block, result.Signature);
                await ChainManager.Start(false);

                await ChainManager.CoreChain.BlockStorage.StoreBlock(blockData);

                ChainManager.ConsumeBlockData(blockData);

                Log.Write($"Genesis block and keys generated. Network public key: {result.NetworkPublicKey.HexString}.");

                var coreKeyConfig = Config.Load <CoreKeyConfig>(Storage);
                coreKeyConfig.Key      = result.NetworkVoteKey.HexString;
                coreKeyConfig.Password = result.NetworkVotePassword;

                config.NetworkPublicKey = result.NetworkPublicKey.HexString;

                Config.Save(config);
                Config.Save(coreKeyConfig);

                await ChainManager.Stop();

                await ChainManager.Start(true);

                if (result.ServiceTransactions.Count > 0)
                {
                    foreach (var serviceTransactions in result.ServiceTransactions)
                    {
                        var chainId      = serviceTransactions.Key;
                        var transactions = serviceTransactions.Value;

                        var serviceChain  = ChainManager.GetServiceChain(chainId);
                        var maintainChain = ChainManager.GetMaintainChain(chainId);
                        if (serviceChain != null)
                        {
                            var generator = new ServiceBlockGenerator(ChainManager.CoreChain, serviceChain, maintainChain, null);
                            foreach (var transaction in transactions)
                            {
                                generator.ConsumeTransaction(transaction);
                            }

                            var serviceBlock     = generator.GenerateBlock(0, 0);
                            var serviceBlockData = new BlockData <ServiceBlock>(serviceBlock, new BlockSignatures(serviceBlock));
                            await serviceChain.BlockStorage.StoreBlock(serviceBlockData);

                            serviceChain.ConsumeBlockData(serviceBlockData);
                        }
                    }
                }

                await ChainManager.Stop();

                return(false);
            }

            SyncManager = new SyncManager(this);
            await SyncManager.Start();

            //if (!await SyncManager.Start())
            //    return false;

            if (sync)
            {
                Log.Write("Sync done.");
                return(false);
            }

            AttachementManager.Start();

            Kademlia           = new Kademlia(Storage, this);
            TransactionManager = new TransactionManager(this);
            CouncilManager     = new CouncilManager(this);

            NodeServer   = new NodeServer(this, config.MaxIncomingConnections, config.MaxOutgoingConnectoins);
            ClientServer = new ClientServer(this);

            if (Host.EnableRemoteServices)
            {
                ServiceServer = new ServiceServer();
            }

            await(Host as Host).Start(this);
            return(true);
        }
コード例 #29
0
        /// <summary>
        /// Processes a message sent from a peer node.
        /// </summary>
        /// <param name="ctx">Context of the sender.</param>
        /// <param name="msg">Message to process.</param>
        private void onMessageReceived(Context ctx, Message msg)
        {
            if (!Message.VerifyChecksum(msg))
            {
                return;
            }

            if (msg.Type == MessageType.Version)
            {
                if (ctx.HasHandshake && ctx.Version > 0)
                {
                    // Version should be the first message a peer sends
                    // and it should be sent only once.
                    ctx.ShouldDisconnect = true;
                    return;
                }

                var md = MessageData.FromJson <MDVersion>(msg.Data);
                if (md == null)
                {
                    ctx.ShouldDisconnect = true;
                    return;
                }

                // The node is connecting to itself.
                if (md.Nonce == nodeNonce)
                {
                    ctx.ShouldDisconnect = true;
                    return;
                }

                // Currently we decide to reject all nodes having lower version number.
                if (md.Version < Config.Version)
                {
                    ctx.ShouldDisconnect = true;
                    return;
                }

                if (ctx.HasHandshake is false)
                {
                    logger.Log(App.LogLevel.Info, $"{ctx.ClientEndPoint} version 0x{md.Version:x8} height {md.Height}.");

                    ctx.Version = md.Version;
                    ctx.UpdateHeightIfHigher(md.Height);

                    if (ctx.IsOutbound)
                    {
                        sendVersionMessage(ctx);
                    }
                    else
                    {
                        sendVersionAckMessage(ctx);
                    }
                }
                return;
            }

            // At this point, a Version message should have been sent by the peer.
            // Otherwise it is not behaving properly.
            if (ctx.Version == 0)
            {
                ctx.ShouldDisconnect = true;
                return;
            }

            if (msg.Type == MessageType.VersionAck)
            {
                var md = MessageData.FromJson <MDVersion>(msg.Data);
                if (md == null)
                {
                    ctx.ShouldDisconnect = true;
                    return;
                }

                if (ctx.HasHandshake is false)
                {
                    ctx.HasHandshake = true;
                    sendVersionAckMessage(ctx);

                    if (ctx.IsOutbound is false)
                    {
                        logger.Log(App.LogLevel.Info, $"Successful handshake with {ctx.ClientEndPoint}. Sending GetLatestBlock.");

                        ibd.MarkPeerReady(ctx);
                        ibd.MarkRequestTime(ctx);
                        sendGetLatestBlockMessage(ctx);
                    }
                }
                return;
            }

            if (ctx.HasHandshake is false)
            {
                logger.Log(App.LogLevel.Warning, $"{ctx.ClientEndPoint} sent something before ver/verack. Marked for disconnection.");
                ctx.ShouldDisconnect = true;
                return;
            }

            if (msg.Type == MessageType.GetLatestBlock)
            {
                // Ignore this when IBD is not done
                if (ibd.IsDone is false)
                {
                    return;
                }

                var md = MessageData.FromJson <MDGetLatestBlock>(msg.Data);
                if (md == null)
                {
                    ctx.ShouldDisconnect = true;
                    return;
                }

                if (chainMutex.WaitOne(millisecondsTimeout: 3000) is false)
                {
                    logger.Log(App.LogLevel.Warning, "chainMutex was held too long.");
                    return;
                }

                logger.Log(App.LogLevel.Info, $"{ctx.ClientEndPoint} sent GetLatestBlock. Responding.");

                sendLatestBlockMessage(ctx, chainManager.LatestBlock);
                chainMutex.ReleaseMutex();

                return;
            }

            if (msg.Type == MessageType.LatestBlock)
            {
                var md = MessageData.FromJson <MDLatestBlock>(msg.Data);
                if (md == null)
                {
                    ctx.ShouldDisconnect = true;
                    return;
                }

                if (md.Block == null)
                {
                    ctx.ShouldDisconnect = true;
                    return;
                }

                if (!ChainManager.ValidateBlockSanity(md.Block))
                {
                    ctx.ShouldDisconnect = true;
                    return;
                }

                logger.Log(App.LogLevel.Info, $"{ctx.ClientEndPoint} sent LatestBlock.");

                if (ibd.CurrentPhase == InitialBlockDownload.Phase.Preparing)
                {
                    ibd.ReceiveLatestBlock(ctx, md.Block);

                    // If all peers have sent LatestBlock, we'll proceed IBD
                    if (ibd.AllPeersResponded() is true)
                    {
                        logger.Log(App.LogLevel.Info, "All connected peers have sent latest blocks. Starting IBD.");

                        startIbd();
                    }
                }
                else
                {
                    var blocksToAdd = ctx.GetStoredAndNewBlocks(md.Block);
                    ctx.UpdateHeightIfHigher(blocksToAdd[^ 1].Index);
コード例 #30
0
        public void ProcessTransactions()
        {
            Program.CheckFolderStructure();
            Program.Settings = new Settings("settings.json");

            if (File.Exists("balance"))
            {
                File.Delete("balance");
            }
            if (File.Exists("nonces"))
            {
                File.Delete("nonces");
            }

            foreach (var file in Directory.GetFiles("chains"))
            {
                File.Delete(file);
            }

            foreach (var file in Directory.GetFiles("tables"))
            {
                File.Delete(file);
            }

            var walletA = new Wallet();
            var walletB = new Wallet();
            var walletC = new Wallet();
            var walletD = new Wallet();
            var walletE = new Wallet();
            var walletF = new Wallet();

            var walletM = new Wallet(); //miner

            var balanceLedger = new BalanceLedger();
            var manager       = new ChainManager(balanceLedger);
            var contacts      = new ContactLedger(new HttpProvider());

            //generate first blocks

            var minedBlocks = new List <Block>();

            minedBlocks.Add(CreateNextBlock(Block.Genesis, null, walletA.PublicKey));
            minedBlocks.Add(CreateNextBlock(minedBlocks[0], null, walletA.PublicKey));
            minedBlocks.Add(CreateNextBlock(minedBlocks[1], null, walletA.PublicKey));

            minedBlocks.Add(CreateNextBlock(minedBlocks[2], null, walletB.PublicKey));
            minedBlocks.Add(CreateNextBlock(minedBlocks[3], null, walletB.PublicKey));
            minedBlocks.Add(CreateNextBlock(minedBlocks[4], null, walletB.PublicKey));
            minedBlocks.Add(CreateNextBlock(minedBlocks[5], null, walletB.PublicKey));

            manager.ProcessBlocks(minedBlocks);

            var transactions = new List <Transaction>()
            {
                CreateTransaction(walletA, walletD, 100, 0),
                CreateTransaction(walletB, walletF, 200, 0),
                CreateTransaction(walletA, walletB, 400, 1),
                CreateTransaction(walletB, walletD, 800, 1),
                CreateTransaction(walletA, walletD, 1600, 2)
            };

            var txBlock = CreateNextBlock(minedBlocks[minedBlocks.Count - 1], transactions);

            manager.ProcessBlocks(new List <Block>()
            {
                txBlock
            });

            Assert.IsTrue(manager.GetBalance(walletA.PublicKey) == (Program.MinerReward * 3 - 100 - 400 - 1600 - 60));
            Assert.IsTrue(manager.GetBalance(walletB.PublicKey) == (Program.MinerReward * 4 - 200 - 800 - 40 + 400));

            Assert.IsTrue(manager.GetTransactionCount(walletA.PublicKey) == 3);
            Assert.IsTrue(manager.GetTransactionCount(walletB.PublicKey) == 2);

            var paddingBlocks = new List <Block>();

            paddingBlocks.Add(CreateNextBlock(txBlock, new List <Transaction>()
            {
                CreateTransaction(walletB, walletF, 3200, 2)
            }, walletA.PublicKey));

            paddingBlocks.Add(CreateNextBlock(paddingBlocks[0], new List <Transaction>()
            {
                CreateTransaction(walletA, walletE, 6400, 3)
            }, walletA.PublicKey));

            paddingBlocks.Add(CreateNextBlock(paddingBlocks[1], new List <Transaction>()
            {
                CreateTransaction(walletA, walletB, 12800, 4),
                CreateTransaction(walletD, walletC, 2400, 0)
            }, walletA.PublicKey));

            manager.ProcessBlocks(paddingBlocks);

            Assert.IsTrue(manager.GetBalance(walletA.PublicKey) == (Program.MinerReward * 6 - 100 - 400 - 1600 - 6400 - 12800 - 100));
            Assert.IsTrue(manager.GetBalance(walletB.PublicKey) == (Program.MinerReward * 4 - 200 - 800 - 3200 - 60 + 400 + 12800));
            Assert.IsTrue(manager.GetBalance(walletC.PublicKey) == 2400);
            Assert.IsTrue(manager.GetBalance(walletD.PublicKey) == 100 + 800 + 1600 - 2400 - 20);
            Assert.IsTrue(manager.GetBalance(walletE.PublicKey) == 6400);
            Assert.IsTrue(manager.GetBalance(walletF.PublicKey) == 200 + 3200);

            var forkBlocks = new List <Block>();

            forkBlocks.Add(CreateNextBlock(paddingBlocks[0], new List <Transaction>()
            {
                CreateTransaction(walletA, walletB, 2400, 3),
                CreateTransaction(walletD, walletC, 1200, 0)
            }, walletE.PublicKey));

            forkBlocks.Add(CreateNextBlock(forkBlocks[0], new List <Transaction>(), walletE.PublicKey));
            forkBlocks.Add(CreateNextBlock(forkBlocks[1], new List <Transaction>(), walletE.PublicKey));
            forkBlocks.Add(CreateNextBlock(forkBlocks[2], new List <Transaction>(), walletE.PublicKey));

            manager.ProcessBlocks(forkBlocks);

            Assert.IsTrue(manager.GetBalance(walletA.PublicKey) == (Program.MinerReward * 4 - 100 - 400 - 1600 - 2400 - 80));
            Assert.IsTrue(manager.GetBalance(walletB.PublicKey) == (Program.MinerReward * 4 - 200 - 800 - 3200 - 60 + 400 + 2400));
            Assert.IsTrue(manager.GetBalance(walletC.PublicKey) == 1200);
            Assert.IsTrue(manager.GetBalance(walletD.PublicKey) == 100 + 800 + 1600 - 20 - 1200);
            Assert.IsTrue(manager.GetBalance(walletE.PublicKey) == Program.MinerReward * 4);
            Assert.IsTrue(manager.GetBalance(walletF.PublicKey) == 3400);

            var lowerNonceBlock = CreateNextBlock(forkBlocks.Last(), new List <Transaction>()
            {
                CreateTransaction(walletA, walletB, 2000, 2)
            });

            manager.ProcessBlocks(new List <Block>()
            {
                lowerNonceBlock
            });

            Assert.IsTrue(manager.Height == 13);

            var higherNonceBlock = CreateNextBlock(forkBlocks.Last(), new List <Transaction>()
            {
                CreateTransaction(walletA, walletB, 2000, 5)
            });

            manager.ProcessBlocks(new List <Block>()
            {
                higherNonceBlock
            });

            Assert.IsTrue(manager.Height == 13);

            var overBalanceBlock = CreateNextBlock(forkBlocks.Last(), new List <Transaction>()
            {
                CreateTransaction(walletF, walletB, 10000, 0)
            });

            manager.ProcessBlocks(new List <Block>()
            {
                overBalanceBlock
            });

            Assert.IsTrue(manager.Height == 13);

            var noBalanceBlock = CreateNextBlock(forkBlocks.Last(), new List <Transaction>()
            {
                CreateTransaction(new Wallet(), walletB, 10000, 0)
            });

            manager.ProcessBlocks(new List <Block>()
            {
                noBalanceBlock
            });

            Assert.IsTrue(manager.Height == 13);

            //persistency check
            manager.Dispose();

            balanceLedger = new BalanceLedger();
            manager       = new ChainManager(balanceLedger);

            Assert.IsTrue(manager.GetBalance(walletA.PublicKey) == (Program.MinerReward * 4 - 100 - 400 - 1600 - 2400 - 80));
            Assert.IsTrue(manager.GetBalance(walletB.PublicKey) == (Program.MinerReward * 4 - 200 - 800 - 3200 - 60 + 400 + 2400));
            Assert.IsTrue(manager.GetBalance(walletC.PublicKey) == 1200);
            Assert.IsTrue(manager.GetBalance(walletD.PublicKey) == 100 + 800 + 1600 - 20 - 1200);
            Assert.IsTrue(manager.GetBalance(walletE.PublicKey) == Program.MinerReward * 4);
            Assert.IsTrue(manager.GetBalance(walletF.PublicKey) == 3400);

            //miner test
            var txPool = new TransactionPool(balanceLedger);

            Program.Settings.minerAddr = HexConverter.ToPrefixString(walletM.PublicKey);
            var miner = new Miner(balanceLedger, txPool, manager);

            for (int i = 0; i < 187; i++)
            {
                miner.UpdateParameters();
                while (miner.MineRound().Result == null)
                {
                    ;
                }
            }

            miner.UpdateParameters();
            var ret = miner.MineRound().Result;

            Assert.IsTrue(manager.Height == 201);

            //tx pool test

            txPool.AddTransactions(new List <Transaction>()
            {
                CreateTransaction(walletA, walletF, 5000, manager.GetTransactionCount(walletA.PublicKey)),
                CreateTransaction(walletA, walletB, 5000, 5),
                CreateTransaction(walletA, walletB, 5000, 8)
            });

            var mineableTxs = txPool.GetMineableTransactions();
        }
コード例 #31
0
 public void Initialize(BuildingManager buildingManager, ChainManager chainManager)
 {
     BuildingManager = buildingManager;
     ChainManager    = chainManager;
 }
コード例 #32
0
 void Start()
 {
     leftTouchPad.SetActive(false);
     rightTouchPad.SetActive(false);
     chainManager = this.GetComponent <ChainManager>();
 }
コード例 #33
0
        public void TestChainManager()
        {
            List<int> lst = new List<int>();

            RecorderTester trr = new RecorderTester(lst);
            ChainManager.IniParams p = new ChainManager.IniParams();
            p.RecordCollection.Add(trr);
            ChainManager cm = new ChainManager(p);

            // Start End Test
            cm.StartRecord();

            trr.Add(1);
            trr.Add(2);

            cm.EndRecord();

            List<int> result1 = new List<int> { 1, 2 };

            if (result1.SequenceEqual(lst) == false)
            {
                throw new NotImplementedException();
            }

            cm.StartRecord();

            trr.Add(3);
            trr.Add(4);

            cm.EndRecord();

            List<int> result2 = new List<int> { 1, 2, 3, 4 };

            if (result2.SequenceEqual(lst) == false)
            {
                throw new NotImplementedException();
            }

            // Undo Test
            cm.Undo();

            if (result1.SequenceEqual(lst) == false)
            {
                throw new NotImplementedException();
            }

            // Redo Test
            cm.Redo();

            if (result2.SequenceEqual(lst) == false)
            {
                throw new NotImplementedException();
            }

            // Cut Test
            cm.StartRecord();

            trr.Add(3);
            trr.Add(4);

            cm.CutRecord();

            if (result2.SequenceEqual(lst) == false)
            {
                throw new NotImplementedException();
            }

            // Rollback Test
            cm.Rollback();

            if (result1.SequenceEqual(lst) == false)
            {
                throw new NotImplementedException();
            }
        }