区块链技术并不是什么高级概念,它并不比量子力学、泡利不相容原则、哥德巴赫猜想更难以理解,但却也不是什么类似“时间就是金钱”这种妇孺皆知的浅显道理。区块链其实是一套统筹组织记录的方法论,或者说的更准确一些,一种“去中心化”的组织架构系统。

去中心化

众所周知,任何一个公司、组织、或者是机构,都遵循同一套组织架构原则,那就是“下级服从上级、少数服从多数”原则。而对于区块链技术来说,只遵循这个原则的后半句,那就是“少数服从多数”,不存在“下级服从上级”。

进而言之,在区块链中,根本就没有什么所谓“上级”的概念。

什么是“上级”?

一艘在大海中航行的货船上,一定会有一位船长,游荡在非洲大草原上的狮群里,一定会有一个狮王,同样的,群狼之首,是为头狼,群猴之首,是为猴王。在地球上生活着的群居动物中,你很难找出一种群体是没有“首领”或者是“上级”的。

这就是最朴素的“中心化”概念,绝对中心化系统负责制定系统规则,负责监控系统运作,负责系统未来走向,中心化系统可以是一个个体,也可以由多个个体组成的小群体,中心化系统以外的个体,则没有中心化本身的权力。

换句话说,绝对中心化系统往往会带来一个负面,那就是:信息不对等(asymmetric information)。指在中心化群体中,中心化主体掌握的信息比较充分,往往处于比较有利的地位,而其他信息贫乏的个体,则处于比较不利的地位。

去中心化,就是把绝对中心化这一套拿掉,所有个体都是平等的,所有行为都记录在数据区块中,行为的合法性遵循“少数服从多数”原则。

说白了,就是一个班级里,没有了“老师”的概念,大家都是学生,或者说,大家也都可以是“老师”,每个人都有主导个体行为的能力,而行为的合法性需要所有个体“投票”决定,这就是所谓的去中心化。

区块链(BlockChain)

区块链本质上就是实现上面去中心化组织架构系统的一种容器,或者说的更准确一些,区块链是一种特殊的数据结构。

一个区块链,就和其他基于数组的数据结构一样,由一个一个的区块构成,它可以存储一个数据集,以及一些把区块合并在一起的机制。

区块链有一个显著的特性,就是有序:

下标	区块
0 第一个区块
1 第二个区块
2 第三个区块

但是区块链本身是可变的,所以多个区块的逻辑连接成一个序列,通常可以采用指针的形式,指向存储器中前一个区块和后一个区块的网络地址:

下标	区块	上一个下标	下一个下标
0 第一个区块 - 1
1 第二个区块 0 2

除此之外,每一个区块还存储前一个区块的 Hash。不连续和随机离散的 Hash 非常适合检查数据的完整性,因为如果输入的数据有哪怕一位字符的变化,它产生的 Hash 也将明显不同。说白了就是把具体数据通过哈希算法散列成对应的字符串,这些字符串可以验证区块的合法性:

下标  上一个区块的 Hash 内容  上一个区块   下一个区块
0 创世块 第一个区块 - 1
1 哈希 第二个区块 0 2
2 哈希 第三个区块 2 3

需要注意的是,第一个区块是没有上一个区块的Hash值的,也被称之为“创世区块”,这个区块是唯一的,所有通过合法性验证的区块往回追溯,一定可以追溯至创世区块的位置。

也就是说,所有在回溯路线上的区块,都是合法的,没有被篡改过的区块。

具体实现

根据区跨链特点,我们应该先实现区块链中的区块:

type Block struct {
Data string
Hash string
PrevBlockHash string
}

这里定义一个结构体,字段有三个,分别存储区块数据,当前区块数据散列后的哈希以及上一个区块数据的哈希。

随后定义加密算法函数:

func Sha256(src string) string {
m := sha256.New()
m.Write([]byte(src))
res := hex.EncodeToString(m.Sum(nil))
return res
}

该函数可以将具体数据散列成为hash

接着定义创世区块函数:

func InitBlock(data string) *Block {
block := &Block{data, Sha256(data), ""} return block
}

创世区块并不存储上一个区块的hash,因为它是开风气之先的区块。

随后声明创建普通区块函数:

func NodeBlock(data string, prevhash string) *Block {
block := &Block{data, Sha256(data), prevhash} return block
}

该函数负责生成创世区块其后的区块,将会存储之前一个区块的数据hash。

开始创建创世区块:

newblock := InitBlock("创世区块数据")  

fmt.Println(newblock)

数据返回:

&{创世区块数据 62a034a244fbffbffda75fbe9c0ca7b86e40ce5329c957c180847ed210e1225a }

接着声明区块链对象:

blockchain := []*Block{}

这里我们使用切片,切片的每一个元素是区块结构体指针。

将创世区块添加到区块链中:

newblock := InitBlock("创世区块数据")  

fmt.Println(newblock)  

blockchain := []*Block{}  

blockchain = append(blockchain, newblock)  

fmt.Println(blockchain)

程序返回:

&{创世区块数据 62a034a244fbffbffda75fbe9c0ca7b86e40ce5329c957c180847ed210e1225a }
[0x14000114180]

如此,创世区块就“上链”了,接着添加普通区块:

block2 := NodeBlock("第二个区块数据", blockchain[len(blockchain)-1].Hash)  

blockchain = append(blockchain, block2)  

block3 := NodeBlock("第三个区块数据", blockchain[len(blockchain)-1].Hash)  

blockchain = append(blockchain, block3)  

fmt.Println(blockchain)

每一个普通区块都会存储上一个区块的数据hash,程序返回:

&{创世区块数据 62a034a244fbffbffda75fbe9c0ca7b86e40ce5329c957c180847ed210e1225a }
[0x1400006e180]
[0x1400006e180 0x1400006e1e0 0x1400006e210]

完整流程:

package main  

import (
"crypto/sha256"
"encoding/hex"
"fmt"
) type Block struct {
Data string
Hash string
PrevBlockHash string
} func Sha256(src string) string {
m := sha256.New()
m.Write([]byte(src))
res := hex.EncodeToString(m.Sum(nil))
return res
} func InitBlock(data string) *Block {
block := &Block{data, Sha256(data), ""} return block
} func NodeBlock(data string, prevhash string) *Block {
block := &Block{data, Sha256(data), prevhash} return block
} func main() { newblock := InitBlock("创世区块数据") fmt.Println(newblock) blockchain := []*Block{} blockchain = append(blockchain, newblock) fmt.Println(blockchain) block2 := NodeBlock("第二个区块数据", blockchain[len(blockchain)-1].Hash) blockchain = append(blockchain, block2) block3 := NodeBlock("第三个区块数据", blockchain[len(blockchain)-1].Hash) blockchain = append(blockchain, block3) fmt.Println(blockchain)
}

至此,一个完整的区块链实体结构就完成了。

结语

通过golang实现具体的区块链结构,我们可以看出来,所谓的“去中心化”,并不是字面意义上的去掉中心,而是中心的多元化,任何节点都可以成为中心,任何中心也都不是持久化的,中心对每个节点不具备强制作用,只需要达成“少数服从多数”的共识即可。

区块链,中心去,何曾着眼看君王?用Go语言实现区块链技术,通过Golang秒懂区块链的更多相关文章

  1. PP.io的三个阶段,“强中心”——“弱中心”——“去中心”

    什么是PP.io? PP.io是我和Bill发起的存储项目,目的在于为开发者提供一个去中心化的存储和分发平台,能做到更便宜,更高速,更隐私. 当然做去中心化存储的项目也有好几个,FileCoin,Si ...

  2. NGK Global技术开源,开启跨链全生态

    消息显示,新兴公链项目NGK Global已经完成了自己的开源计划,基于自己创新性的跨链通讯交互方案,开源后的NGK Global将面向全生态节点,提供高效.自由.无边界的公链生态系统. 目前,大家对 ...

  3. 技术沙龙|京东云区块链进校园-京东云&深圳大学线下沙龙分享回顾

    在刚刚结束的京东云&深圳大学技术沙龙活动中,多位京东云的技术大咖针对京东云BDS产品技术细节.开源计划,与深圳大学的同学和参会者进行了深入探讨,干货满满反响深刻,获得了在场同学与参会者的一致好 ...

  4. 1--面试总结-js深入理解,对象,原型链,构造函数,执行上下文堆栈,执行上下文,变量对象,活动对象,作用域链,闭包,This

    参考一手资料:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/中文翻译版本:https://zhuanlan.zhihu.com/p ...

  5. NGK公链:去中心化交易+挖矿生态体系共舞

    NGK生态公链是一个安全.透明.专业的去中心化商业应用平台.作为一条具有技术信任甚至是公众信任的公链,NGK以区块链技术为支撑,利用区块链透明.公正.公开.数据不可篡改.分布式存储.可追溯等技术优势, ...

  6. 数据结构算法C语言实现(十一)--- 3.4队列的链式表示和实现

    一.简介 FIFO. 二.头文件 //3_4_part1.h /** author:zhaoyu email:zhaoyu1995.com@gmail.com date:2016-6-9 note:r ...

  7. js语言评价--js 基于哈希表、原型链、作用域、属性类型可配置的多范式编程语言

    js 基于哈希表.原型链.作用域.属性类型可配置的多范式编程语言 值类型.引用类型.直接赋值: 原型是以对象形式存在的类型信息. ECMA-262把对象定义为:无序属性的集合,其属性可以包含基本值,对 ...

  8. BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)

    前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...

  9. 算法精解:DAG有向无环图

    DAG是公认的下一代区块链的标志.本文从算法基础去研究分析DAG算法,以及它是如何运用到区块链中,解决了当前区块链的哪些问题. 关键字:DAG,有向无环图,算法,背包,深度优先搜索,栈,BlockCh ...

  10. Cardano(ADA), EOS, RChain(RHOC), Aeternity(AE) 都是极其好的币

    从区块链的基础知识出发,研究ETH和EOS的区别 免责声明:EOS目前还在开发中,我们对此项目的一些理解可能会改变.而且,我并不是以太坊开发者,而只是一个喜欢区块链的爱好者.请牢记这两点,请把下面的内 ...

随机推荐

  1. 「Tubian」Tubian0.4!完全开源!

    Tubian是我自己维护的Linux发行版.Tubian基于Debian,提供了开箱既用的Wine和Waydroid,装好就有对Android应用和Windows程序的兼容. Sourceforge. ...

  2. Qemu/Limbo/KVM镜像 最精简Linux+Wine,可运行Windows软件,内存占用不到70M,存储占用500M

    镜像特征: Alpine Edge系统 内置Wine 7.8,可运行大量Windows 软件 高度精简,内存占用仅68MB,存储占用仅500MB 完全开源 镜像说明: 用户名为root,密码为空格. ...

  3. 二叉树及其三种遍历方式的实现(基于Java)

    二叉树概念: 二叉树是每个节点的度均不超过2的有序树,因此二叉树中每个节点的孩子只能是0,1或者2个,并且每个孩子都有左右之分. 位于左边的孩子称为左孩子,位于右边的孩子成为右孩子:以左孩子为根节点的 ...

  4. MISC 网刃杯2022

    ​ MISC 玩坏的winxp 难度系数:4.0 题目描述:小敏的电脑Windows XP Professional不小心被玩坏了,里边有重要的东西,你能帮帮她吗? 利用whihex挂载 查看分区1 ...

  5. java集合框架复习----(1)

    文章目录 1 .集合框架思维导图 一.什么是集合 二.collection接口 1 .集合框架思维导图 一.什么是集合 存放在java.util.*.是一个存放对象的容器. 存放的是对象的引用,不是对 ...

  6. echarts的使用 超好用的报表制作、数据的图形化展示

    地址链接:https://echarts.apache.org/zh/index.html 1.图形选择 2.对应的js代码

  7. python实现多接口翻译软件

    本实验用pyqt5做了一个小软件,里面使用了市面上主流的6种翻译软件接口:谷歌.百度.有道.金山词霸.腾讯.必应,界面如图所示: 以下是程序代码: import time,sys,os,hashlib ...

  8. Python基础部分:7、 垃圾回收机制和流程控制

    目录 一.垃圾回收机制 1.引用计数 2.标记清除 3.分类代收 二.流程控制 1.理论 2.必备知识 3.分支结构 4.循环结构 一.垃圾回收机制 垃圾回收机制,简称GC,是python解释器自带的 ...

  9. CF240F (26颗线段树计数)

    题目链接:Topcoder----洛谷 题目大意: 给定一个长为n的由a到z组成的字符串,有m次操作,每次操作将[l,r]这些位置的字符进行重排,得到字典序最小的回文字符串,如果无法操作就不进行. 思 ...

  10. Python中Print方法

    1 number1 = int(input("请输入第一个数:")) 2 number2 = int(input("请输入第二个数:")) 3 4 # 方法一: ...