Ejemplo n.º 1
0
        public Protocol.Block Build(Block block)
        {
            var header           = block.Header;
            var protoBlockHeader = new Protocol.BlockHeader
            {
                PrevBlockHash  = ByteString.CopyFrom(header.PrevBlockHash.GetBytes()),
                MerkleRootHash = ByteString.CopyFrom(header.MerkleRootHash.GetBytes()),
                Timestamp      = header.Timestamp,
                Bits           = header.Bits,
                Nonce          = header.Nonce
            };

            var protoBlock = new Protocol.Block
            {
                BlockHeader = protoBlockHeader,
                Hash        = ByteString.CopyFrom(block.Hash.GetBytes()),
                VoteCounter = block.VoteCounter,
                Votes       = { }
            };

            var protoVotes = block.MerkleTree.Votes.Select(x => this.protoVoteFactory.Build(x));

            protoBlock.Votes.AddRange(protoVotes);

            return(protoBlock);
        }
Ejemplo n.º 2
0
        public Block Build(Protocol.Block protoBlock)
        {
            var votes       = protoBlock.Votes.Select(x => new Vote(x)).ToList();
            var merkleTree  = this.merkleTreeFactory.BuildMerkleTree(votes);
            var blockHeader = new BlockHeader(protoBlock.BlockHeader);

            return(new Block(blockHeader, merkleTree, protoBlock.MinerId));
        }
Ejemplo n.º 3
0
        public bool TryGetValidatedBlock(Protocol.Block protoBlock, out Block reconstructedBlock)
        {
            reconstructedBlock = this.blockFactory.Build(protoBlock);
            var givenHash   = new Hash(protoBlock.Hash);
            var hashesMatch = reconstructedBlock.Hash.Equals(givenHash);

            if (!hashesMatch)
            {
                return(false);
            }

            foreach (var vote in reconstructedBlock.MerkleTree.Votes)
            {
                if (!this.voteValidator.IsValid(vote))
                {
                    return(false);
                }
            }

            return(true);
        }