2.创建区块链并创建创世区块

上篇教程我们讲到了如何去创建一个区块,当然。真正项目中的区块属性就不像我们上篇文章讲到的那么简单了。但是依然不妨碍我们学习。

我们一直说的是区块链,区块链就是由若干个区块去构成的一个链条,并且当前区块和前一个区块都有一定的联系。这样就做到了,如果修改了其中的一个区块。那么在这个区块之后的区块就都不会验证通过了。

1. 构造区块链的结构体

//创建区块链
type BlockChain struct {
    Block []*Block
}

不难发现,这个区块链就是保存由若干个区块组成的数组


2. 创建区块链并创建创世区块

func CreateGenesisBlockWithChain(data string) *BlockChain {
    blockChain := &BlockChain{[]*Block{ CreateGenesisBlock(data) }}
    return blockChain
}

此函数创建一个区块链,并将创世区块添加到这个链中。返回一个区块链对象


3. 创建创世区块的方法

func CreateGenesisBlock(data string) *Block {
    height := 1
    currentData := data
    prevhash := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}

    block := NewBlock(
        int64(height),
        []byte(currentData),
        prevhash,
    )

    return block
}

通过main函数构造区块链对象

//创建区块链并创建创世区块
blockChain := BlockChain.CreateGenesisBlockWithChain("Genesis block")

运行代码:

区块的高度:1
交易数据:Genesis block
时间戳:2018-07-05 06:29:00 PM
上一个区块的哈希:0000000000000000000000000000000000000000000000000000000000000000
Hash:7e98d58b3d620da554f5787c6fce48655b047653cf609fb1ba6ce8b0fc7212ec

为了更加好玩一点,我们继续创建一个往区块链中添加区块的方法

func (blc *BlockChain) AddBlockToBlockChain(height int64, data string, prev []byte) *BlockChain {
    newBlock := NewBlock(height, []byte(data), prev)
    blc.Block = append(blc.Block, newBlock)
    return blc
}

通过main方法往链中添加区块

//添加区块1
    blockChain.AddBlockToBlockChain(
        //区块高度
        int64(len(blockChain.Block)) + 1,
        //交易数据
        "Second block",
        //上一个区块的哈希
        blockChain.Block[len(blockChain.Block) - 1].Hash,
    )

    //添加区块2
    blockChain.AddBlockToBlockChain(
        //区块高度
        int64(len(blockChain.Block)) + 1,
        //交易数据
        "Thred block",
        //上一个区块的哈希
        blockChain.Block[len(blockChain.Block) - 1].Hash,
    )

    //遍历输出区块信息
    for _,block := range blockChain.Block {
        fmt.Printf("区块的高度:%d\n", block.Height)
        fmt.Printf("交易数据:%s\n", block.Data)
        fmt.Printf("时间戳:%s\n", time.Unix(block.Timestamp, 0).Format("2006-01-02 03:04:05 PM"))
        fmt.Printf("上一个区块的哈希:%x\n", block.PrevHash)
        fmt.Printf("Hash:%x\n", block.Hash)
        fmt.Println("-------------------------------")
    }

我们在创世块后追加了两个区块,那么现在我们运行看下输出信息

区块的高度:1
交易数据:Genesis block
时间戳:2018-07-05 06:29:00 PM
上一个区块的哈希:0000000000000000000000000000000000000000000000000000000000000000
Hash:7e98d58b3d620da554f5787c6fce48655b047653cf609fb1ba6ce8b0fc7212ec
-------------------------------
区块的高度:2
交易数据:Second block
时间戳:2018-07-05 06:29:00 PM
上一个区块的哈希:7e98d58b3d620da554f5787c6fce48655b047653cf609fb1ba6ce8b0fc7212ec
Hash:cb9b4e766cae61b5c190517c878e0579619da864e8ee6649b9fbd1b0851f24f0
-------------------------------
区块的高度:3
交易数据:Thred block
时间戳:2018-07-05 06:29:00 PM
上一个区块的哈希:cb9b4e766cae61b5c190517c878e0579619da864e8ee6649b9fbd1b0851f24f0
Hash:8de86e78b0099b8ffb96b6fbe801125588f70515d8bc0a47b095e57ff848ffba
-------------------------------

好了,到此为止。你学会了吗?如果不懂你可以查看下方的源码,对照着源码去理解。下节我们将会学习鼎鼎大名的POW(工作量证明)算法,并应用到我们的案例中。

源码:https://gitee.com/itgjz/blockchain_learn/tree/master/block_chain_learn2

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容