public static IServiceCollection UseTransactionsManager(this IServiceCollection services, IConfiguration Configuration, ILoggerFactory loggerFactory)
        {
            string eosNodeUrl       = Configuration.GetValue <string>("EosNodeUrl", "");
            var    abiService       = new ABIService(loggerFactory, eosNodeUrl + "/v1/chain/abi_bin_to_json", eosNodeUrl + "/v1/chain/get_info");
            string connectionString = Configuration.GetValue <string>("MongoClientConnectionString", "");

            if (string.IsNullOrEmpty(connectionString))
            {
                throw new ArgumentNullException("mongoClientConnectionString is required");
            }
            string databaseName = Configuration.GetValue <string>("MongoClientDatabaseName", "");
            string transactionCollectionName = Configuration.GetValue <string>("MongoClientTransactionsName", "");
            string transferCollectionName    = Configuration.GetValue <string>("MongoClientTransfersName", "");
            var    eosConfig = new EosConfigurator()
            {
                HttpEndpoint  = eosNodeUrl,
                ExpireSeconds = 60
            };

            AbiSerializationProvider.Prefix = "VHKD";
            TransactionsManager implementationInstance = new TransactionsManager(eosConfig, abiService, connectionString, databaseName, transactionCollectionName, transferCollectionName);

            services.AddSingleton <TransactionsManager>(implementationInstance);
            return(services);
        }
        static void Main(string[] args)
        {
            args = new[] { "61f57e03b30dd494c83272f1c19c6481d9e1593a138bff3e84e82ac6018bfe7f" };
            var loggerFactory = new LoggerFactory();

            loggerFactory.AddConsole();
            var logger = loggerFactory.CreateLogger("extool");

            if (args == null || args.Length == 0)
            {
                logger.LogInformation("please input block number");
                return;
            }
            var trxId = args[0].Trim();
            var configurationBuilder = new ConfigurationBuilder();

            configurationBuilder.AddJsonFile("appsettings.json");
            var configuration = configurationBuilder.Build();
            var settings      = new EXToolSettings();

            configuration.GetSection(nameof(EXToolSettings)).Bind(settings);

            var abiService = new ABIService(loggerFactory, settings.AbiBinToJsonUrl, settings.GetInfoUrl);
            IChainTrxRepository chainTrxRepository = new MongoChainTrxRepository(abiService,
                                                                                 settings.MongoClientConnectionString /*"mongodb://192.168.1.162:27017"*/,
                                                                                 settings.DatabaseName /*"EOSTEST"*/,
                                                                                 settings.TrxActionsCollectionName,
                                                                                 settings.AppliedTransactionCollectionName,
                                                                                 settings.AcceptTransactionCollectionName,
                                                                                 settings.Actionfilters);

            string message = JsonConvert.SerializeObject((object)settings);

            logger.LogInformation(message);
            logger.LogInformation("extool start ...");

            using (var httpClient = new HttpClient())
            {
                httpClient.DefaultRequestHeaders.Connection.Add("keep-alive");
                var httpResponseMessage = httpClient.PostAsync(settings.GetTransactionUrl,
                                                               ABIService.CreateStringContent(JsonConvert.SerializeObject((object)new
                {
                    id = trxId
                }))).Result;
                var responseString = httpResponseMessage.Content.ReadAsStringAsync().Result;
                logger.LogInformation(responseString);
                if (httpResponseMessage.IsSuccessStatusCode)
                {
                    chainTrxRepository.SetAppliedTransactionAsync(responseString).Wait();
                }
            }
        }
示例#3
0
 public TransactionsManager(
     EosConfigurator eosConfig,
     ABIService abiService,
     string connectionString,
     string databaseName,
     string transactionCollectionName,
     string transferCollectionName)
 {
     this.m_EosConfig                 = eosConfig;
     this.m_ABIService                = abiService;
     this.m_MongoClient               = (IMongoClient) new MongoClient(connectionString);
     this.m_MongoDatabase             = this.m_MongoClient.GetDatabase(databaseName, (MongoDatabaseSettings)null);
     this.m_TransactionCollectionName = transactionCollectionName;
     this.m_TransferCollectionName    = transferCollectionName;
     this.m_EosApi        = new EosApi(this.m_EosConfig, new HttpHandler());
     this.m_AbiSerializer = new core.Services.AbiSerializationProvider(this.m_EosApi);
 }
 public MongoChainTrxRepository(ABIService abiService,
                                string connectionString,
                                string databaseName,
                                string trxActionsCollectionName,
                                string appliedTransactionCollectionName,
                                string acceptTransactionCollectionName,
                                string actionFilters)
 {
     m_ABIService  = abiService;
     m_MongoClient = new MongoClient(connectionString);
     m_Database    = m_MongoClient.GetDatabase(databaseName);
     m_TrxActionsCollectionName         = trxActionsCollectionName;
     m_AppliedTransactionCollectionName = appliedTransactionCollectionName;
     m_AcceptTransactionCollectionName  = acceptTransactionCollectionName;
     m_ActionFilters = actionFilters.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                       .Select(m => m.Split(new char[] { ':' }, StringSplitOptions.None))
                       .Where(m => m.Length == 2).Select(m => new ActionFilter()
     {
         Account = m[0],
         Name    = m[1]
     }).ToArray <ActionFilter>();
 }
        static void Main(string[] args)
        {
            var loggerFactory = new LoggerFactory();

            loggerFactory.AddConsole();
            var logger = loggerFactory.CreateLogger("Eosio.KafkaClient");
            var configurationBuilder = new ConfigurationBuilder();

            configurationBuilder.AddJsonFile("appsettings.json");
            var configuration = configurationBuilder.Build();
            var settings      = new KafkaClientSettings();

            configuration.GetSection(nameof(KafkaClientSettings)).Bind(settings);

            var conf = new Dictionary <string, object>
            {
                { "group.id", settings.ConsumerGroupId /*"eos-consumer-group"*/ },
                { "bootstrap.servers", settings.ConsumerBootstrapServers /*"192.168.1.234:9092"*/ },
                { "auto.commit.interval.ms", settings.ConsumerCommitInterval /*5000*/ },
                { "auto.offset.reset", settings.ConsumerOffsetReset /*"earliest"*/ }
            };
            var abiService = new ABIService(loggerFactory, settings.AbiBinToJsonUrl, settings.GetInfoUrl);
            IChainTrxRepository chainTrxRepository = new MongoChainTrxRepository(abiService,
                                                                                 settings.MongoClientConnectionString /*"mongodb://192.168.1.162:27017"*/,
                                                                                 settings.DatabaseName /*"EOSTEST"*/,
                                                                                 settings.TrxActionsCollectionName,
                                                                                 settings.AppliedTransactionCollectionName,
                                                                                 settings.AcceptTransactionCollectionName,
                                                                                 settings.Actionfilters);
            Dictionary <string, Func <string, Task> > consumerActions = new Dictionary <string, Func <string, Task> >();

            consumerActions.Add(settings.ConsumerAcceptTopic, (Func <string, Task>)(msgValue => chainTrxRepository.SetAcceptTransactionAsync(msgValue)));
            consumerActions.Add(settings.ConsumerAppliedTopic, (Func <string, Task>)(msgValue => chainTrxRepository.SetAppliedTransactionAsync(msgValue)));

            string message = JsonConvert.SerializeObject((object)settings);

            logger.LogInformation(message);
            logger.LogInformation("Consumer start ...");
            Task.Run(() =>
            {
                Dictionary <string, Func <Task> > reSetFuncs = new Dictionary <string, Func <Task> >();
                reSetFuncs.Add(settings.ConsumerAcceptTopic, () => chainTrxRepository.ReSetAcceptTransactionsAsync());
                reSetFuncs.Add(settings.ConsumerAppliedTopic, () => chainTrxRepository.ReSetAppliedTransactionsAsync());
                while (true)
                {
                    try
                    {
                        reSetFuncs[settings.ConsumerSubscribeTopic]().Wait();
                    }
                    catch (Exception ex)
                    {
                        logger.LogError((EventId)0, ex, "ReSetError");
                    }
                    finally
                    {
                        Thread.Sleep(60000);
                    }
                }
            });
            using (Consumer <Null, string> consumer = new Consumer <Null, string>(conf, null, new StringDeserializer(Encoding.UTF8)))
            {
                consumer.OnMessage += (_, msg) =>
                {
                    consumerActions[settings.ConsumerSubscribeTopic](msg.Value).Wait();
                    logger.LogInformation(string.Format("Read '{0}-{1}' from: {2}", (object)msg.Topic, (object)msg.Timestamp.UtcDateTime.ToLongTimeString(), (object)msg.TopicPartitionOffset));
                };
                consumer.OnError        += (_, error) => logger.LogInformation(string.Format("Error: {0}", (object)error));
                consumer.OnConsumeError += (_, msg) => logger.LogInformation(string.Format("Consume error ({0}): {1}", (object)msg.TopicPartitionOffset, (object)msg.Error));
                consumer.Subscribe(settings.ConsumerSubscribeTopic);
                while (true)
                {
                    consumer.Poll(TimeSpan.FromMilliseconds(100.0));
                }
            }
        }