搭建自己的区块链,人人能写区块链

如何实现自己的区块链? 人人能写区块链?能做到吗?
写一个自己的区块链,不是让程序员凭空想象,而是使用已经的开源平台,通过学习理念、工具、通过编写简答的函数即可以实现自己的区块链。
人人能写区块链吗?
目前比较著名的项目Ethereum,你可以在Ethereum这个平台上实现自己的区块链。 关于Ethereum项目,所有的资料、文档、代码、开发技巧都是开放的,参考网站: https://github.com/ethereum,只要你懂一门编程语言,就可以实践自己的区块链,只要具备C++,go,JavaScript,Python 任何一门语言即可,因为编程语言的原理是相通的。
区块链是什么?
区块链英文名Blockchain,本质是保存持续增长的记录的分布式数据库。最奇妙的是区块链把分布式数据在技术上只保留了Insert、Query两个操作。
如何才能实现这样一个系统呢?那么我们需要回答几个核心问题。
如何保存数据?保存数据的困难有哪些?
数据逐渐增加,如何应对?
如何对之前的数据进行修改?
解决方案 :
如同数据结构的链表+结构体组合,不断的记录新的数据,然后将这些数据连接起来
一个区块如何描述,其实就是LinkedList
ClassDataBlock{ getData(); setData(); getPre(); getNext();}
数据能否被修改呢?因为如果支持修改,可能引发很多的同步问题。那么能否不支持修改呢?实际上,GFS的整体架构就是构建在不可修改的数据结构之上。
于是,我们推论出构建不可修改的串联的数据块。但是我们要注意的是虽然底层数据不能修改,但是上层的数据视图是可以修改的。
如何让很多人都对数据有信心,相信是真实的,不能被篡改呢?每个人都保存一份同样的数据。
如何添加数据呢
我们添加的每一份数据都需要按照同样的方式添加到每个人保存的副本中。
我们能否具有计算能力呢?为什么需要计算能力?
我们从此可以得到一个通用的计算机,也把数据的修改模型更加地简化和通用化。
我们如何定义计算能力呢?
要回答这个问题,我们首先要想的是这个分布式的计算机的各个部分是如何构成的。
谁来构成整个存储空间?每一个具体的地址。每一个地址保存了什么?数据。如何才能对地址计算呢?我们可以把对数据的处理逻辑也放入这个地址。那么一个地址到底需要什么呢?地址信息、财富信息、数据信息、代码。
于是,所谓的状态就是指系统中每一个地址和地址对应的状态的集合。我们通过一个一个的交易来进入新的状态。
接着, 我们可以把状态转移的过程也记录下来,这个就是记录transaction的block。这些block连接在一起,形成blockchain。
如何应对同时写入的混乱
如何防止很多人一起写造成的混乱呢?大家同时解决一个难题,谁先解出来,谁就能够写入。
如何防止有人同时解出来?这个有可能,但是连续多次都是同时有人解出来的概率较低,于是选择链最长的那一个。
具备以上基本概念,让我们在这里通过实际的代码进一步实战,实现一个支持Token的BlockChain。参考:Naivecoin: a tutorial for building a cryptocurrency
官方网站:https://lhartikk.github.io( 具备基本的编程基础)
如何保存数据
区块链的基本概念是:保存持续增长的有序数据的分布式数据库。要实现自己的区块链,需要满足以下功能:
定义数据块
定义数据块之间的关系
添加数据块的功能
节点之间的通讯
节点之间同步数据
对节点的控制能力
区块的结构
因为区块链中的数据是相互连接的数据块,因此我们需要创建LinkedList来实现这样的场景。
如上图所示,我们可以看到以下核心元素:
index:区块的递增编号
data:该区块所保存的数据
timestamp:时间戳
hash:通过SHA256算法对该区块进行的签名
previousHash:前一个数据块的hash值,从而将区块串联了起来
我们可以得到对应的代码:
classBlock{
publicindex:number;
publichash:string;
publicpreviousHash:string;
publictimestamp:number;
publicdata:string;
constructor(index:number,hash:string,previousHash:string,timestamp:number,data:string) {
this.index=index;
this.previousHash=previousHash;
this.timestamp=timestamp;
this.data=data;
this.hash=hash; }
如何保证数据不被篡改
在计算机的世界中,一切都是用数学来解释,用数学来证明。对于一个数据块,我们计算出它的摘要。只要保证数据有变化,必然会引发摘要变化即可。在这里我们使用的是SHA256的Hash算法。从这个角度来说,Hash也可以被看成这块数据的DNA。
具体的Hash的过程如下,
constcalculateHash=(index:number,previousHash:string,timestamp:number,data:string):string=>CryptoJS.SHA256(index+previousHash+timestamp+data).toString();
聪明的读者可能会发现,这个简单的方法并不能防范更加复杂的黑客攻击。因此,我们会不断的改进我们的代码,以抵挡这个世界的某些恶意。
但是现在的我们至少能够通过Hash来唯一的验证一个区块链的结构了。
为什么?
因为我们在做Hash的时候,也把这个区块对应的上一个区块的Hash放了进来,因此如果有人想要篡改整个区块链上的任何一个区块,都会产生蝴蝶效应,后续的区块都会为止失效。
如上图所示,如果我们把区块44的数据从TREE改为STREET,那么它自身的Hash结果会改变,接着区块45中的previousHash也会发生改变,于是区块45的Hash也会改变,以此类推。因此,越早的区块发生异常,那么带来的影响就会越大。
如何创建第一个区块
第一个数据块的难点在哪里?它没有previousHash!因此,我们直接硬编码即可。
constgenesisBlock:Block=newBlock(
,‘816534932c2b7154836da6afc367695e6337db8a921823784c14378abed4f7d7’,
null,1465154705,‘my genesis block!!’);如何创建新的区块
创建区块如同炒菜,需要备好所有的原料。如同以下的代码所示,我们需要找到最后一个有效的区块,推理出下一个区块的index,得到当前的时间戳,再结合上一个区块的hash和当前的数据,也就能知道当前区块的hash,从而创建出新的区块。
constgenerateNextBlock=(blockData:str

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值