我的区块链技术学习笔记(一):从区块谈起!

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

attachments-2018-01-ObgacY5Q5a621fdf31607.作者: Ivan Kuznetsov  吴寿鹤等

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

在区块链中,真正存储有效信息的是区块(block)。而在比特币中,真正有价值的信息就是交易(transaction)。实际上,交易信息是所有加密货币的价值所在。除此以外,区块还包含了一些技术实现的相关信息,比如版本,当前时间戳和前一个区块的哈希。

不过,我们要实现的是一个简化版的区块链,而不是一个像比特币技术规范所描述那样成熟完备的区块链。所以在我们目前的实现中,区块仅包含了部分关键信息,它的数据结构如下:

type Block struct {
    Timestamp     int64
    Data          []byte
    PrevBlockHash []byte
    Hash          []byte
}
Timestamp当前时间戳,也就是区块创建的时间
PrevBlockHash前一个块的哈希,即父哈希
Hash当前块的哈希
Data区块存储的实际有效信息,也就是交易

我们这里的 Timestamp,PrevBlockHash, Hash,在比特币技术规范中属于区块头(block header),区块头是一个单独的数据结构。 完整的 比特币的区块头(block header)结构 如下:


VersionBlock version numberYou upgrade the software and it specifies a new version4
hashPrevBlock256-bit hash of the previous block headerA new block comes in32
hashMerkleRoot256-bit hash based on all of the transactions in the blockA transaction is accepted32
TimeCurrent timestamp as seconds since 1970-01-01T00:00 UTCEvery few seconds4
BitsCurrent target in compact formatThe difficulty is adjusted4
Nonce32-bit number (starts at 0)A hash is tried (increments)4


下面是比特币的 golang 实现 btcd 的 BlockHeader 定义:

// BlockHeader defines information about a block and is used in the bitcoin
// block (MsgBlock) and headers (MsgHeaders) messages.
type BlockHeader struct {
    // Version of the block.  This is not the same as the protocol version.
    Version int32

    // 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.
    Bits uint32

    // Nonce used to generate the block.
    Nonce uint32
}

而我们的 Data, 在比特币中对应的是交易,是另一个单独的数据结构。为了简便起见,目前将这两个数据结构放在了一起。在真正的比特币中,区块的数据结构如下:


Magic novalue always 0xD9B4BEF94 bytes
Blocksizenumber of bytes following up to end of block4 bytes
Blockheaderconsists of 6 items80 bytes
Transaction counterpositive integer VI = VarInt1 - 9 bytes
transactionsthe (non empty) list of transactions-many transactions


attachments-2018-01-DtXCdOOs5a6221f785cc5.

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:

func NewBlock(data string, prevBlockHash []byte) *Block {
    block := &Block{time.Now().Unix(), []byte(data), prevBlockHash, []byte{}}
    block.SetHash()
    return block
}

这就是区块的全部内容了!在这里,我们需要了解区块的数据结构,如何计算 Hash。

上一篇:我的区块链技术学习笔记(零):引言

下一篇:我的区块链技术学习笔记(二):实现一个区块链

attachments-2018-01-KR3OuPgA5a62135b82784.jpg

  • 发表于 2018-01-20 01:08
  • 阅读 ( 3131 )
  • 分类:学习笔记

你可能感兴趣的文章

相关问题

5 条评论

请先 登录 后评论
不写代码的码农
吴寿鹤

36 篇文章

作家榜 »

  1. 社区运营-小以 562 文章
  2. 社区运营-小链 244 文章
  3. 于中阳Mercina-zy 79 文章
  4. 涂晶 75 文章
  5. 李晓琼 44 文章
  6. 兄弟连区块链培训 42 文章
  7. 吴寿鹤 36 文章
  8. John-smith 25 文章