예제 #1
0
        public static LedgerAnchorWorker CreateLedgerAnchorWorker(IServiceProvider serviceProvider)
        {
            IConfiguration configuration = serviceProvider.GetService <IConfiguration>();
            IConfiguration anchoring     = configuration.GetSection("anchoring");
            ILogger        logger        = serviceProvider.GetService <ILogger>();

            IAnchorRecorder recorder = null;

            switch (anchoring["type"])
            {
            case "blockchain":
                string anchorKey = anchoring["key"];
                if (!string.IsNullOrEmpty(anchorKey))
                {
                    NBitcoin.Key     key     = NBitcoin.Key.Parse(anchorKey);
                    NBitcoin.Network network = NBitcoin.Network.GetNetworks()
                                               .First(item => item.GetVersionBytes(NBitcoin.Base58Type.PUBKEY_ADDRESS)[0] == byte.Parse(anchoring["network_byte"]));

                    logger.LogInformation($"Starting Blockchain anchor (address: {key.PubKey.GetAddress(network).ToString()})");
                    recorder = new BlockchainAnchorRecorder(new Uri(anchoring["bitcoin_api_url"]), key, network, long.Parse(anchoring["fees"]));
                }
                break;
            }

            if (recorder != null)
            {
                return(new LedgerAnchorWorker(serviceProvider.GetRequiredService <IAnchorBuilder>(), recorder, serviceProvider.GetRequiredService <ILogger>()));
            }
            else
            {
                return(null);
            }
        }
예제 #2
0
        public async Task Run(CancellationToken cancel)
        {
            IServiceScopeFactory scopeFactory = services.GetService <IServiceScopeFactory>();
            ILogger logger = services.GetRequiredService <ILogger>();

            while (!cancel.IsCancellationRequested)
            {
                using (IServiceScope scope = scopeFactory.CreateScope())
                {
                    IAnchorRecorder anchorRecorder = scope.ServiceProvider.GetService <IAnchorRecorder>();
                    IAnchorState    anchorState    = scope.ServiceProvider.GetService <IAnchorState>();

                    if (anchorRecorder == null || anchorState == null)
                    {
                        logger.LogInformation("Anchoring disabled");
                        return;
                    }

                    IStorageEngine storageEngine = scope.ServiceProvider.GetRequiredService <IStorageEngine>();

                    try
                    {
                        await storageEngine.Initialize();

                        await anchorState.Initialize();

                        AnchorBuilder anchorBuilder = new AnchorBuilder(storageEngine, anchorRecorder, anchorState);

                        while (!cancel.IsCancellationRequested)
                        {
                            LedgerAnchor anchor = await anchorBuilder.RecordAnchor();

                            if (anchor != null)
                            {
                                logger.LogInformation($"Recorded an anchor for {anchor.TransactionCount} transactions: {anchor.FullStoreHash.ToString()}");
                            }

                            await Task.Delay(TimeSpan.FromSeconds(10), cancel);
                        }
                    }
                    catch (Exception exception)
                    {
                        logger.LogError($"Error in the anchor worker:\r\n{exception}");

                        // Wait longer if an error occurred
                        await Task.Delay(TimeSpan.FromMinutes(1), cancel);
                    }
                }
            }
        }
예제 #3
0
 public AnchorBuilder(IStorageEngine storageEngine, IAnchorRecorder anchorRecorder, IAnchorState anchorState)
 {
     this.storageEngine  = storageEngine;
     this.anchorRecorder = anchorRecorder;
     this.anchorState    = anchorState;
 }
예제 #4
0
 public LedgerAnchorWorker(IAnchorBuilder anchorBuilder, IAnchorRecorder anchorRecorder, ILogger logger)
 {
     this.anchorBuilder = anchorBuilder;
     this.anchorRecorder = anchorRecorder;
     this.logger = logger;
 }
예제 #5
0
 public AnchorBuilder(IStorageEngine storageEngine, IAnchorRecorder anchorRecorder, IAnchorState anchorState)
 {
     this.storageEngine = storageEngine;
     this.anchorRecorder = anchorRecorder;
     this.anchorState = anchorState;
 }
예제 #6
0
 public LedgerAnchorWorker(IAnchorBuilder anchorBuilder, IAnchorRecorder anchorRecorder, ILogger logger)
 {
     this.anchorBuilder  = anchorBuilder;
     this.anchorRecorder = anchorRecorder;
     this.logger         = logger;
 }