首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深入详解区块链之一:从区块谈起!

关于区块链技术学习分享,我们首先从 “区块” 谈起。

在区块链中,真正存储有效信息的是区块(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。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180328G011RI00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券