什么是Blockchain(区块链)
在开始学习Dapp之前,个人应该要先稍稍认识一下何谓Blockchain(区块链),Ethereum(以太坊)和Smart Contract(智能合约)。Solidity是编写Smart Contract的语言,而Somart Contract又是在Ethereum网络上运行,Ethereum则是架构在Blcokchain基础上。于是在撰写Dapp之前,我们先来聊聊什么是Blockchain(区块链)。
双重支出
一切的起源来自于中本聪(Satoshi Nakamoto)在2008年发表了一篇论文:《比特币:一种点对点的电子现金系统》。 :双倍消费。
假设鲍勃用了这一枚硬币货币跟马克买了一个汉堡,之后又用了同一枚货币跟爱丽丝买了一杯其首要是在于虚拟世界中所有的资料(电子货币)都是可以轻易被完全复制(复制粘贴)。为了解决这一项问题,中本聪在论文中提出了一个方法,就是所谓的Blockchain(区块链)。
鲍勃只有一枚硬币却付给马克和爱丽丝
什么是Blockchain(区块链)
区块链特性:去中心化
那共享链本不是指其中本中央帐本让大家去查询,而是每个人电脑里面都有一个本帐本,而且每个人的区块链采用Pree-To-Peer网络架构,不需要中央处理器,任两台电脑皆可连接来同步帐本。这就是区块链去中心化特性。
区块链去中心化架构
区块链特性:透明性
共享的帐簿本纪录什么呢帐本主要记载了每一笔交易(交易)。帐本内页的格式会类似下面那张图。从图中的交易栏位纪录,我们可以知道Bob分别把10块和5块转给了Alice和Mark。Mark也转了2块给了Alice。每个人的帐本都是相同的内容,大家都可以自由查阅所有的交易纪录。这就是Blockchain的透明性。每个人都可以去查询每一笔交易而不需要任何人的允许,而且每一笔交易都会被公开明确记录在帐本中。
帐本纪录了交易讯息且任何人都可以去查验
透明性解决双重支出问题
利用一笔区块链的透明性特性可以解决双重支出问题。当一笔交易发起后,记帐人会根据转出帐户过往每一笔纪录来判断转出帐户是否有足够的余额使交易成立。假设帐本第一页纪录系统初始给了鲍勃一块钱。鲍勃想利用这一块钱跟马克买一个汉堡。我们去检查鲍勃帐户的交易记录会发现系统有给鲍勃一块钱,所以鲍勃有足够的钱可以跟马克进行交易。这笔交易Bob又想用一块钱跟Alice买一杯咖啡,我们再去检查Bob帐户的交易记录,发现系统一开始有给Bob一块钱,但第二页的交易记录显示他已经把这一块钱给了Mark,所以Bob的帐户目前是没有钱的状态,而跟Alice买咖啡的交易就会被视为无效的交易。
经过检查发现Bob的帐户有一块钱,判定是合法交易
经过Mark交易后Bob的帐户剩余0元,判定为无效交易
数字签名(数字签章)
如果有人发起了一个交易是将其他人的钱变成自己的帐户呢假设Mark没有经过Bob允许,那自己如何解决这个问题呢这里运用了一项技术叫做数字签名(数字签章)来解决。
给一个任意长度的字串keysize,通过generateKeys()计算后会产生出两个密钥,分别是公钥和秘密密钥。秘密密钥就是我们常说的私有密钥。使用秘密密钥和消息通过sign()计算可有人获得签名。此时这个签名是秘密密钥和消息通过加密计算得到的一个字串。不同的消息就会得到不同的签名。其他人把public,message和signature当成参数放进去verfiy()中作验证,判断消息与签名是否为合法。
区块链结合数字签名
建立帐户时必须先输入任意长度的字串。通过generateKeys()后会产生公用密钥和专用密钥。此时把公用密钥就是帐户的地址。当发起交易时,发起人必须附上由自己的专用密钥和交易内容(mesage)经sign()而得到的签名。记录帐本前先利用转出帐户的地址(公钥),签名和这笔交易内容(message)进行验证,检查这笔交易是否由转出帐户发起。Mark想要发起一笔由Bob要转100块给Mark的交易,但因为他不知道Bob的私有密钥,无法仿造出Bob的签名而宣告失败。纵使Mark利用了自己的私有密钥了签名,在验证签名时也会被检查出而宣告失败。数字签名确保了只能对自己的帐户发起交易。
数字签名跟帐本结合的方式
区块链特性:匿名性
Digital Signature的加入除确保每个人只能对自己的帐户发出交易外,利用公钥来当成地址,也使区块链有了一个主要特性:匿名性。在帐本中你可以查询每一笔交易纪录,但却无法知道这些帐户实际由谁持有。一个人可以简单的创造出数个帐户,因此很难追踪这些帐户为谁持有。加入了数字签名,帐本内页的格式会如下图所示。
会多一栏签名且帐户全都变成了地址难以追踪
哈希函数
大家可以发现帐本内页除唱片外。交易还有其他其他栏位。其中一些栏称为Hash。这里的Hash存放的是指经过Hash Function(哈希函数)计算后所得到的值。Hash在区块链是一个很核心的概念。
哈希函数H(x):
把任意长度的字串x当成参数 计算结果H(x)为固定长度的字串 在一定时序可以产生出结果
哈希函数安全特性:
无冲突:没有人能找到x和y使得x!= y但H(x)== H(y)。 隐藏:给定H(x),找到x是不可行的。 益智友好型:此处的益智友好型属性表示该益智没有解决策略,这比仅对H(k | x)== y尝试x的随机值要好得多。
哈希函数简单来说就是可以把任何长度的字串当成输入,并在一定的时间产生固定长度字串为输出。不同的输入产生的输出不相同,并且无法从输出推导出输入。唯一得知输入法的就是把所有可能的输入都拿来经过计算来比对是否等于输出。
任何长度的字串hash出来的结果长度都是一样,且不同的字串会得到不同的结果
块栏位说明
前面提到的Blockchain是一个共享帐本的技术,更广义一点可以说Blockchain是共享帐本。帐本的每一页就是一个Block。下面说明Block的栏位。
帐本的一页就是对应一个块 区块ID:这里的区块ID就是指页数。唱片这是帐本的第几页,区块链的第几个区块。 交易:每笔交易纪录,包含转出帐户的签名。 Nonce:一个由记帐者自由输入的数字,目的是为了使哈希哈希的值符合某个条件。下面会在详细说明。 上一个:前一个Block的Hash值。 哈希:将块ID,交易,Nonce和Prev当成输入传递哈希函数计算出来的值。
把这个区块链的资料做hash且存放到Hash栏位中
矿业(挖矿)
中本聪提出来的论文中,规定每一个区块的哈希值必须是0000000000开头(前10位数字必须是0),才被视为合法的区块而被允许放入区块链(账本)中。的值是由区块ID,交易,Nonce和Prev这四个值,通过哈希函数而产生。其中,区块ID,交易和Prev的值都是固定不可移动,唯一可以调整的就是Nonce。合法的区块的记帐者,系统会给予多个比特币作为奖励。记帐者就是所谓的miner(矿工)。根据哈希函数的特性,矿工只能不断更改Nonce的值来求得哈希值,看此哈希值是否符合0000000000开头的条件。这一过程就是所谓的mining(挖矿)。
不断尝试新的Nonce以得到合法的哈希值这一过程称为采矿
重新采矿(挖矿)
如果我们放置了块ID,交易,Nonce或Prev里面的记录。即使是一个位的移动也会得到一个完全之前之前的Hash值,必须重新mining来找寻适当的Nonce值以求得合法的哈希值。
只要修改了blockdata会造成哈希移动,需要重新采矿来获得新的合法哈希值
区块链特性:资料不可篡改
就像是一条链子把所有的Block给串连起来。这就是为什么叫Blockchain(区块链)的由来。每一个Block都有一个栏位Prev,存放上一个Block的Hash值。
Prev唱片前一个Block的Hash值,间接把Block串连起来
若有人涉嫌改改某人一个Block的交易资料,按照Hash Function的特性,会造成该Block的Hash值被更动。而且影响下一个Block Block Prev的值,导致下一个Block的Hash也被更动。因此要知道两个帐本(区块链)记录是否一样,只要比对最后一页(最后一个区块)的哈希值是否相同即可。当某一个帐本最后一页的Hash值与大部分帐本最后一页,Hash值不同时,就可以知道该帐本的资料有被篡改改过,不值得信任。除非可以一瞬之间同时修改了全世界51%的帐本,否则资料在区块链中根本不可能被篡改。这就是区块链的资料不可篡改。
在第16个区块修改了交易记录,导致最后一个区块的哈希值不相同
结尾
Blockchain更是一种通过由每个字节都存储相同的特殊结构(Block)的数据,并利用Hash特性来快速验证数据正确性,实现的。去中心化,透明性,匿名来自性状语从句:资料不可篡改性分散式储存架构。在这个架构下可以不须中介层(去中心化),我们就可以互相信任(资料不可篡改)并交换价值,解决了人与人互相信任的问题。
以上只是个人对于区块链的一些理解。我没有实际研究区块链的程序代码,所以有些名词也只是根据我的理解而命名。这里理解的比较偏向于观念的某些,当然实作上某种可能会不太这些理解若有错误的地方,也请各位大大可以纠正我,让我了解自己的错误。这是在开发Dapp之前的简单介绍,针对几个比较常见和核心的特性作说明。共识演算法等区块链较深入的技术这边没有提及,这部份就留给各位去讨论。如果之后有时间我也会再去深入研究,然后以更新介绍或另开文章来讨论。
声明:本站所提供的资讯信息不代表任何投资暗示, 本站所发布文章仅代表个人观点,仅供参考。