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); }
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)); }
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); }