public static LedgerMerkleRootHash GetMerkleRootHash(LedgerStateFinal ledgerState, ProtocolVersion version, ILogger logger)
        {
            // backward compatibility
            if (version == ProtocolVersion.InitialVersion)
            {
                return(new LedgerMerkleRoot(ledgerState.GetAccounts().Where(account => account.Balances.Any()), GetDeclarations(ledgerState), logger, HasherFactory.CreateHasher(version)).Hash);
            }

            return(ledgerState.GetHash());
        }
        private void InitializeLedger(SignedLedger lastLedger)
        {
            var accounts = new Trie <Account>(Address.RAW_SIZE);

            foreach (var account in LiveService.AccountManager.GetAccounts())
            {
                accounts.CreateOrUpdate(account.Key.ToRawBytes(), old =>
                {
                    if (old != null)
                    {
                        throw new Exception("The ledger's account states are duplicated !");
                    }
                    return(account.Value);
                });
            }
            // TODO compute hash
            accounts.ComputeHash(HasherFactory.CreateHasher(lastLedger.GetVersion()));

            LedgerState = new LedgerStateFinal(accounts);
            LastLedger  = lastLedger;
            // Debug.Assert(SignedLedgerValidator.Validate(this.lastLedger) == LedgerValidationStatus.Ok, "Last Ledger is not valid"); // Most likely not enough signatures (see quorum)
        }
 public LedgerMerkleRootHash GetMerkleRootHash(LedgerStateFinal ledgerState, ProtocolVersion version)
 {
     return(GetMerkleRootHash(ledgerState, version, merkleLogger));
 }
        private bool CheckMerkleRoot(LedgerStateFinal ledgerState, SignedLedger ledger)
        {
            var hash = GetMerkleRootHash(ledgerState, ledger.GetVersion());

            return(ledger.Ledger.MerkleHash.Equals(hash));
        }
 // for merkle root
 private static IEnumerable <TxDeclaration> GetDeclarations(LedgerStateFinal ledgerState)
 {
     return(ledgerState.GetAccounts().Where(account => account.Declaration != null).Select(account => (TxDeclaration)account.Declaration));
 }
Beispiel #6
0
 public PostStateHolder(LedgerStateFinal previous, long height)
 {
     PostState = new LedgerPostState(previous, height);
     Injector.Inject(this);
 }