Пример #1
0
        public async Task CreateWalletForUserAsync(ApplicationUser user, string seed = null, bool isDefault = false)
        {
            var    walletName = Guid.NewGuid().ToString();
            Wallet wallet     = null;

            try
            {
                await Wallet.CreateWalletAsync(_configuration.GetValue("Indy.PoolName", "indy_pool"), walletName, null, null, null);

                wallet = await Wallet.OpenWalletAsync(walletName, null, null);

                var seedString = string.IsNullOrEmpty(seed) ? "{}" : DidJson.GetJson(seed);
                var didResult  = await Did.CreateAndStoreMyDidAsync(wallet, seedString);
                await SaveWalletData(walletName, user.Id, didResult.Did, didResult.VerKey, true);
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                await CloseWalletAsync(wallet);
            }
        }
Пример #2
0
        public async Task CreateWalletAsync(ApplicationUser user, bool isTrustAnchor, string stewardId = null, string seed = null)
        {
            WalletData stewardWalletData = null;
            Wallet     stewardWallet     = null;

            if (!string.IsNullOrEmpty(stewardId))
            {
                stewardWalletData = await _dbContext.WalletDatas.FirstOrDefaultAsync(p => p.UserId == stewardId);

                if (stewardWalletData == null)
                {
                    throw new Exception("Agent Wallet not found.");
                }

                stewardWallet = await Wallet.OpenWalletAsync(stewardWalletData.Name, null, null);
            }

            var    walletName = $"{user.Id}";
            Wallet wallet     = null;

            try
            {
                await Wallet.CreateWalletAsync(_configuration.GetValue("Indy.PoolName", "indy_pool"), walletName, null, null, null);

                wallet = await Wallet.OpenWalletAsync(walletName, null, null);

                var didJson = "{}";
                if (!string.IsNullOrEmpty(seed))
                {
                    didJson = DidJson.GetJson(seed);
                }

                var didResult = await Did.CreateAndStoreMyDidAsync(wallet, didJson);

                var walletData = new WalletData
                {
                    UserId      = user.Id,
                    TimeCreated = DateTime.UtcNow,
                    Did         = didResult.Did,
                    Name        = walletName,
                    VerKey      = didResult.VerKey
                };

                _dbContext.WalletDatas.Add(walletData);

                if (stewardWalletData != null)
                {
                    if (isTrustAnchor)
                    {
                        var stewardAgentDidResult = await Did.CreateAndStoreMyDidAsync(stewardWallet, "{}");

                        var nymRequest = await Ledger.BuildNymRequestAsync(stewardWalletData.Did, stewardAgentDidResult.Did, stewardAgentDidResult.VerKey, null, "TRUST_ANCHOR");

                        using (var pool = await PoolUtils.CreateAndOpenPoolLedgerAsync())
                        {
                            var res = await Ledger.SignAndSubmitRequestAsync(pool, stewardWallet, stewardWalletData.Did, nymRequest);

                            var stewardAgentVerKey = await Did.KeyForDidAsync(pool, wallet, stewardAgentDidResult.Did);

                            var connectionResponse            = JsonConvert.SerializeObject(new { did = stewardAgentDidResult.Did, verkey = stewardAgentVerKey, nonce = 21314123141 });
                            var anoncryptedConnectionResponse = await Crypto.AnonCryptAsync(stewardAgentVerKey, Encoding.UTF8.GetBytes(connectionResponse));

                            var decryptedConnectionResponse = Encoding.UTF8.GetString(await Crypto.AnonDecryptAsync(stewardWallet, stewardAgentDidResult.VerKey, anoncryptedConnectionResponse));
                            var connectionResponseObj       = JObject.Parse(decryptedConnectionResponse);
                            nymRequest = await Ledger.BuildNymRequestAsync(stewardWalletData.Did, connectionResponseObj.Value <string>("did"), connectionResponseObj.Value <string>("verkey"), null, "TRUST_ANCHOR");

                            var signAndSubmitRequestResult = await Ledger.SignAndSubmitRequestAsync(pool, stewardWallet, stewardWalletData.Did, nymRequest);

                            // getting verinym
                        }
                    }
                }

                await _dbContext.SaveChangesAsync();
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                await CloseWalletAsync(wallet);
                await CloseWalletAsync(stewardWallet);
            }
        }