Beispiel #1
0
 private void AddAccount(UserWalletAccount account, bool is_import)
 {
     lock (accounts)
     {
         if (accounts.TryGetValue(account.ScriptHash, out UserWalletAccount account_old))
         {
             if (account.Contract == null)
             {
                 account.Contract = account_old.Contract;
             }
         }
         else
         {
             WalletIndexer.RegisterAccounts(new[] { account.ScriptHash }, is_import ? 0 : Blockchain.Default?.Height ?? 0);
         }
         accounts[account.ScriptHash] = account;
     }
     using (WalletDataContext ctx = new WalletDataContext(path))
     {
         if (account.HasKey)
         {
             byte[] decryptedPrivateKey = new byte[96];
             Buffer.BlockCopy(account.Key.PublicKey.EncodePoint(false), 1, decryptedPrivateKey, 0, 64);
             using (account.Key.Decrypt())
             {
                 Buffer.BlockCopy(account.Key.PrivateKey, 0, decryptedPrivateKey, 64, 32);
             }
             byte[] encryptedPrivateKey = EncryptPrivateKey(decryptedPrivateKey);
             Array.Clear(decryptedPrivateKey, 0, decryptedPrivateKey.Length);
             Account db_account = ctx.Accounts.FirstOrDefault(p => p.PublicKeyHash.SequenceEqual(account.Key.PublicKeyHash.ToArray()));
             if (db_account == null)
             {
                 db_account = ctx.Accounts.Add(new Account
                 {
                     PrivateKeyEncrypted = encryptedPrivateKey,
                     PublicKeyHash       = account.Key.PublicKeyHash.ToArray()
                 }).Entity;
             }
             else
             {
                 db_account.PrivateKeyEncrypted = encryptedPrivateKey;
             }
         }
         if (account.Contract != null)
         {
             Contract db_contract = ctx.Contracts.FirstOrDefault(p => p.ScriptHash.SequenceEqual(account.Contract.ScriptHash.ToArray()));
             if (db_contract != null)
             {
                 db_contract.PublicKeyHash = account.Key.PublicKeyHash.ToArray();
             }
             else
             {
                 ctx.Contracts.Add(new Contract
                 {
                     RawData       = ((VerificationContract)account.Contract).ToArray(),
                     ScriptHash    = account.Contract.ScriptHash.ToArray(),
                     PublicKeyHash = account.Key.PublicKeyHash.ToArray()
                 });
             }
         }
         //add address
         {
             Address db_address = ctx.Addresses.FirstOrDefault(p => p.ScriptHash.SequenceEqual(account.Contract.ScriptHash.ToArray()));
             if (db_address == null)
             {
                 ctx.Addresses.Add(new Address
                 {
                     ScriptHash = account.Contract.ScriptHash.ToArray()
                 });
             }
         }
         ctx.SaveChanges();
     }
 }