使用Node.js 发展区块链的下一个动作,就是建立Genesis Block。

Step 1:定义区块资料结构

区块的资料结构包含 4 个栏位如下:

hash:区块的 hash ID previousHash:纪录前一个区块的 hash ID timestamp:区块建立的时间 merkleRoot:区块的 merkle tree

以 Node.js 来实作此资料结构,方式是以 function 关键字来定义 Block 类别(Class):

function Block(block) { this.hash = block.hash || ''; this.previousHash = block.previousHash || ''; this.timestamp = block.timestamp || new Date(); this.merkleRoot = block.merkleRoot || {}; }

Step 2:生成 Hash ID

每个Block 都有一个独一无二(uniquely)的编号,这个编号是使用SHA256 算法产生,称之为Block Hash(即Block Hash ID)。

Genesis block 的hash ID 要如何生成呢原则上是使用SHA256 算法来产生,当然开发者也能自行定义Block Hash 的生成方式。在这篇教学里,笔者打算根据Merkle tree 的算法来生成Hash ID。

Merkle tree 同样是使用SHA256 算法来产生Hash ID,标准的Merkle tree 会使用二次的SHA256 来计算出hash ID,这样的做法也称为double SHA256。本文的Block Hash 就以double SHA256 来产生。

Node.js 内建的 crypto 模组,就提供了 SHA256 算法函数。先引入 crypto 模组:

var crypto = require('crypto');

使用 createHmac 函数,计算出第 1 个 hash 值,用法如下:

第1 个参数,填写sha256 第2 个参数,填写secret:任意一段句子即可

执行后,createHmac 会建立 Hmac 的实例化(instance),再呼叫 Hmac 物件的 update 函数,并传入一段本文来进行 sha256 编码运算。完成后,呼叫 digest 将结果转为 hex 格式。

完整范例:

var secret = 'blockchain developer'; var hash1 = crypto.createHmac('sha256', secret) .update('created by jollen') .digest('hex');

得到第1 个的hash 值。接着,使用这个hash 值做为新的secret,进行第2 次的hash 运算:

var hash2 = crypto.createHmac('sha256', hash1) .update('powered by flowchain') .digest('hex'); console.log(hash2);

输出结果:

dd0e2b79d79be0dfca96b4ad9ac85600097506f06f52bb74f769e02fcc66dec6

这就是genesis block 的hash ID 了。

Step 3:定义Genesis Block

建立 genesis block 最简单的方式,就是直接「定义」它。建立一个名为 config.js 的档案,并且直接定义好 genesis block 的栏位资讯:

// Filename: config.js 'use strict'; exports.genesis = { hash: 'dd0e2b79d79be0dfca96b4ad9ac85600097506f06f52bb74f769e02fcc66dec6', prevHash: '0000000000000000000000000000000000000000000000000000000000000000', timestamp: new Date(), merkleRoot: {} };

Step 4:建立 Genesis Block

终于来到历史性的一刻了。先引入事先准备好的genesis block 定义:

var config = require('../config.js');

接著,再实例化 Block,得到的物件,就是 Genesis Block 了。

// Filename: index.js var genesis = new Block(config.genesis);

后续可以将 genesis 物件,储存在 NoSQL 资料库里。

小结

创建出Genesis Block 后,下一个步骤就是帮它加入一个空的merkle tree。