P5 、1-会说话的PPT,从开发者角度快速理解区块链
一、什么是区块链?
区块链(Block Chain):
a、是一种 分布式资料库
攻击成本高,超过节点数51%才可以修改数据,即少数服从多数原则
b、最初是广泛使用在 比特币(Bitcoin)
c、维护一份连续不断 的交易记录档,通过计算算出自己的余额
d、每一笔资料被称为一个 区块(Block)
e、每一个区块可以包含 一笔以上的交易
demo网址:https://anders.com/blockchain/block.html
Block:1(区块号)
Nonce:满足计算难度的值
Data:
Hash:包括 Block、Nonce、Data 的数据hash值
挖矿:就是计算出Nonce值的过程
难度4表示hash前面为0000(4个0)
f、每个区块都会与另一个区块 产生连接(Linking)
g、每个区块都会包含 上个区块的hash值
demo网址:https://anders.com/blockchain/hash.html
h、所有被连接在一起的区块被称为 链(Chain)
i、就是 由多个区块组成的链
二、区块链如何运作?
区块链
a、产生区块的过程会经过 复杂的密码学运算(Cryptography)
b、复杂的密码学运算可杜绝 记录篡改与修订
c、每个区块在成功产生之后 是无法修改的
d、产生区块的过程又称为 挖矿(Mining)
e、负责产生区块的人又称为 矿工(Miner)
f、负责产生区块的机器又称为 挖矿机
g、每一笔资料都可以通过连接找出 所有可靠的历史资料(溯源性)
h、由于是分布式数据库,所以 具有去(中心化)特性
i、(去中心化)意味着 资料会分布到多个节点
j、所有的节点会共同维护 整个分布式数据库
k、共同维护整份资料库意味着 没人可以说自己的区块才是合法有效的区块
l、共同维护整份资料库意味着 多数人验证后过的区块才是合法有效的区块
m、共同维护整份资料库意味着 超过50%的节点验证过的区块才是合法有效的区块
n、每个节点 必须存储所有区块(但有新的设计可让节点仅存储部分区块)
o、每一个节点都可以 协助验证区块的有效性
p、任何一笔资料被篡改 都将破坏区块的完整性
q、任何一笔资料被篡改的几率 微乎其微
r、由于是分布式数据库,所以 具有去(中心化)特性
s、的写作包含两种物件类型 (交易)与(区块)
t、解说情景 数字货币
u、交易物件就是 转账过程的完整内容
v、(区块物件)包含 一系列交易的集合
demo网址:https://anders.com/blockchain/blockchain.html
每个区块修改之后,往后所有的区块都需要重新挖矿!
分布式区块链demo网址:https://anders.com/blockchain/distributed.html
P6 、2-挖矿算法
demo网站:www.blockchaindemo.io
终端环境为:ubuntu 16.04 ,已经安装好了npm
(PS:如果还没安装,执行: apt-get install npm 安装就行!
安装完,查看版本: npm -v
版本为:3.5.2 )
打开终端,输入
代码语言:javascript复制npm install blockchain-cli -g
安装有点慢,
安装出错了!
node_modules安装问题,执行以下:
代码语言:javascript复制rm -rf node_modules
rm package-lock.json
npm cache clear --force
npm install
终端输入:
代码语言:javascript复制blockchain
区块(block)长什么样子?
在 blockchain -> 后面输入 blockchain 或者 bc 查看创世区块结构。
代码语言:javascript复制blockchain -> bc
- Index(Block #):第几个区块?(创世区块链的索引为0)
- Hash:当前区块的hash值
- Previous Hash:上一个区块的hash值
- Timestamp:当前区块创建时的时间戳
- Data:存储在当前区块上的交易信息
- Nonce:在找到有效区块之前,我们经历的迭代次数
挖矿:
代码语言:javascript复制blockchain -> mine test
blockchain -> 区块链部落
Hash值是怎么计算的?
Hash值是一个 十六进制 固定长度为 64位 的唯一的标识。
hash值是由 index,previous block hash,timestamp,block date 和 nonce 作为输入数据计算而得。
代码语言:javascript复制CryptoJS.SHA256(index previousHash timestamp data nonce)
你是否注意到哈希中的四个前导0?
四个前导0是有效散列的最低要求。所需的前导0 的数量称为 难度。
下面的方法验证hash难度是否有效。
代码语言:javascript复制function isValidHashDifficulty(hash,difficulty){
for(var i =0,b=hash.length; i<b; i ){
if(hash[i] !== '0'){
break;
}
}
return i>=difficulty;
}
这就是我们所熟知的工作量证明系统-Proof-of-work system。