关于区块链技术学习分享,我们首先从 “区块” 谈起。
在区块链中,真正存储有效信息的是区块(block)。而在比特币中,真正有价值的信息就是交易(transaction)。实际上,交易信息是所有加密货币的价值所在。除此以外,区块还包含了一些技术实现的相关信息,比如版本,当前时间戳和前一个区块的哈希。
不过,我们要实现的是一个简化版的区块链,而不是一个像比特币技术规范所描述那样成熟完备的区块链。所以在我们目前的实现中,区块仅包含了部分关键信息,它的数据结构如下:
typeBlockstruct{Timestampint64Data[]bytePrevBlockHash[]byteHash[]byte}
我们这里的Timestamp,PrevBlockHash,Hash,在比特币技术规范中属于区块头(block header),区块头是一个单独的数据结构。 完整的比特币的区块头(block header)结构如下:
下面是比特币的 golang 实现 btcd 的BlockHeader定义:
// BlockHeader defines information about a block and is used in the bitcoin// block (MsgBlock) and headers (MsgHeaders) messages.typeBlockHeaderstruct{// Version of the block. This is not the same as the protocol version.Versionint32// Hash of the previous block in the block chain.PrevBlock chainhash.Hash// Merkle tree reference to hash of all transactions for the block.MerkleRoot chainhash.Hash// Time the block was created. This is, unfortunately, encoded as a// uint32 on the wire and therefore is limited to 2106.Timestamp time.Time// Difficulty target for the block.Bitsuint32// Nonce used to generate the block.Nonceuint32}
而我们的 Data, 在比特币中对应的是交易,是另一个单独的数据结构。为了简便起见,目前将这两个数据结构放在了一起。在真正的比特币中,区块的数据结构如下:
Hash = SHA256(PrevBlockHash + Timestamp + Data)
在SetHash方法中完成这些操作:
func(b*Block)SetHash(){timestamp:=[]byte(strconv.FormatInt(b.Timestamp,10))headers:=bytes.Join([][]byte{b.PrevBlockHash,b.Data,timestamp},[]byte{})hash:=sha256.Sum256(headers)b.Hash=hash[:]}
接下来,按照 Golang 的惯例,我们会实现一个用于简化创建区块的函数NewBlock:
funcNewBlock(datastring,prevBlockHash[]byte)*Block{block:=&Block{time.Now().Unix(),[]byte(data),prevBlockHash,[]byte{}}block.SetHash()returnblock}
这就是区块的全部内容了!在这里,我们需要了解区块的数据结构,如何计算Hash。
领取专属 10元无门槛券
私享最新 技术干货