说起区块链最被人所熟知的还是 比特币。比特币是一种去中心化的P2P(Point to Point)形式的数字货币。
在公元前3000年,两河流域的苏美尔人,在波斯湾沿岸有着很广阔的贸易,当时的交易方式是物物交换,用自己已有的物资去交换自己需要的物资,比如一只羊换一把石斧。而原始实物货币可谓五花八门,贝壳、羽毛、布料、盐和牲畜都曾是交换工具。古埃及甚至以土地或奴隶作为士兵的薪饷。古罗马士兵得到的军饷曾经有食用盐。拉丁文Sal的意思就是“盐”,英文工资“Salary”一词就是从Sal演变而来的。到了20世纪,在一些发展滞后的国家和地区,还有用特殊形状的羽毛、矿石和金属制品作为货币的现象。
中国也有以贝壳做交易的历史。商朝中期以后,当时流通最广泛的贝币,由于来源不稳定致使交易发生不便,人们才寻找更适宜的货币材料来替代,有人制作玉贝、石贝、木贝、骨贝以及蚌贝,以补充天然海贝的不足。那时低面值的“贝币”在市场交换中的麻烦是显而易见的。例如,为了买一头牛,要背上成袋的“贝币”或者“仿贝”到市场上去,支付时的计算也很费事。而购买更贵重的商品时,携带的“贝币”恐怕要斗量车载了。
黄金之所以天然是货币,除了其天生无可比拟的物理属性之外,黄金和人类交织的历史几乎和人类的历史一样古老,人类对黄金达成的共识,在人类历史的发展进程中自然形成,对黄金的信任和偏好深入骨髓,就差写入基因了。人们乐意用黄金来衡量财富,也放心的让自己的财富映射到黄金,当然也欣然接受用黄金作为媒介进行交易。
法币之所成为货币,是人为刻意的让法币拥有了货币的属性,比如:一定的稀缺性,稳定易保存,可分割可组合,但更重要的是国家政府作为信用背书,强制的让人们形成共识,给法币赋值,形成货币。然而,在法币一统天下的今天,各国央行都还在大量的储备黄金,民间个人也会配备黄金用来避险,可见自然形成的共识基础远比人为强制达成的更加的稳固。
货币之所以成为货币,其本身具有的货币属性仅仅是必要条件,还有需要另外一个充分条件:达成共识。
区块链本质其实是一个分布在全球各地、能够协同运转的数据库存储系统,区别于传统数据库运作——读写权限掌握在一个公司或者一个集权手上(中心化的特征),区块链认为,任何有能力架设服务器节点的人都可以参与其中。来自全球各地的掘金者在当地部署了自己的节点,并连接到区块链网络中,成为这个分布式数据库存储系统中的一个节点;一旦加入,该节点享有同其他所有节点完全一样的权利与义务(去中心化、分布式的特征)。与此同时,对于在区块链上开展服务的人,可以往这个系统中的任意的节点进行读写操作,最后全世界所有节点会根据某种机制的完成一次又依次的同步,从而实现在区块链网络中所有节点的数据完全一致。
这里主要还是讲区块链的知识比特币稍微了解下就好了。
视频链接
区块链的核心是 去中心化 想想一下 如上图 有一个中心的账本 比如支付宝他记录着 你花费了多少钱 给谁 谁每月花费了多少钱给其他人 但是在某些情况下 你没法保证中心账本 不会被篡改 丢失 。
工作量证明(POW,Proof-of-Work)是一个用于阻止拒绝服务攻击和类似垃圾邮件等服务错误问题的协议,它在 1993 年被 Cynthia Dwork 和 Moni Naor 提出。
那么什么是工作量证明呢?其实很简单,就是找到一个符合某一规定的Hash值。例如我们规定区块的Hash值的前 20 个位必须为 0,要符合这样的区块才能添加到区块链中,那么工作量证明就是要找到符合这样规定的Hash值。
由于找到这样的Hash值是非常困难的,所以会给予找到合适Hash值的人相应奖励(比特币),找到符合规定Hash值的过程被称为“挖矿”,而挖矿的机器被称为“矿工”。
1976年,美国学者Dime和Henman为解决信息公开传送和密钥管理问题,提出一种新的密钥交换协议,允许在不安全的媒体上的通讯双方交换信息,安全地达成一致的密钥,这就是“公开密钥系统”。
即
1.A要向B发送信息,A和B都要产生一对用于加密和解密的公钥和私钥
2.A的私钥保密,A的公钥告诉B;B的私钥保密,B的公钥告诉A。
3.A要给B发送信息时,A用B的公钥加密信息,因为A知道B的公钥。
4.A将这个消息发给B(已经用B的公钥加密消息)。
5.B收到这个消息后,B用自己的私钥解密A的消息。其他所有收到这个报文的人都无法解密,因为只有B才有B的私钥。
如果你想加入区块链的世界 你会经历什么? 首先你会被分配到一个账本 一个收音机 发报机 化身为记账员的身份 上面可能已经 琳琅满目的写满了 前人 性辛耕作争得头 破血流 的一页页账单 但是你不好奇世界上 世界上第一个区块链区块链是什么样的吗 第一个区块链是被写在客户端里面的 通常 叫做创世区块。
创世区块包含一个隐藏的信息,在Coinbase交易的输入中包含这样一句话“The Times 03/Jan/2009 Chancellor on brink of second bailout forbanks.” 这句话是泰晤士报当天的头版文章标题,引用这句话,既是对该区块产生时间的说明,也可视为半开玩笑地提醒人们一个独立的货币制度的重要性,同时告诉人们随着比特币的发展,一场前所未有的世界性货币革命将要发生。该消息是由比特币的创立者中本聪写入创世区块中
账本是区块链的基础的核心 形象的说就像一页页账单(一个个区块 其实就是数据结构里面的数组)串成 了一个本子 记作 账簿 你要做的就是打开你的收音机 调好频道 这时频道里传来了 浑厚低沉的嗓音 现在播报最新消息:李某某 向 王某某 转账 10元 交易密码是:111111 你马上拿起了笔在你的账单上 开始 忽想起刚才所听到的这一切 用笔在账单上写了下来 还没等你有丝毫 歇息的时刻 收音机里 又传来了熟悉的声音 你下意识的 拿起了笔 又开始记录起来了 你心想:不就是听写吗 这还难得到我吗 慢慢的你熟悉了这里的工作变得游刃有余 等你窸窸窣窣 写完了 这一张纸 然后 突然收音机里的声音 停止了 虽然已是停止但那个声音在你脑袋里 盘旋盘旋 很久不能离去 你还在纳闷发生了什么 转念一想 得亏停止了要不然这一页我就写不下了 此时你一数账单上的交易记录 哎呀 又数错了 虽然没有精确的数量 但大概不差得有2000多条 就在这时 收音机突然 发出 呲呲呲 的声音 抖得一下 突然思绪被打断了 不一会儿 收音机里又传来了 一个女性的声音 这个声音 又跟刚才的声音有很大的不同 这声音一听 便能让你脑中出现这样一幅画面 有一个 英姿飒爽的女士 站在你面前 带着班主任般的恶狠狠眼神 看着你 光顾着走神 就错过了收音机内 的内容 了 好在 她 又重复了一遍 :说道 请按照上一张 账单的 编号 加上 这一张账单的前3个最大值和 和 前三个 最小值 每个数的立方 再加上一个数(工作量证明) 使得 算出来的数 前3位都是1。 听到这个我顿时就一头雾水 ,不过好在咱数学也不差 就拿起笔来 涂鸦了。
时间过得很快,虽然你拿着草稿 在上面画了各种 花花草草 森林树木 牛鬼蛇神 但是你依然还是没有解出来。但就在你想要放弃的时候 一个电灯泡在你脑中出现 你突然有了想法。于是你奋书疾笔 噌噌噌 的就写完了这道题 算出了那个数(工作量证明) 说时迟那时快 你 拿起了你的发报机 把你的账单编程摩斯密码 发了出去 虽然你还在好奇 为什么 你会发电报 但这不是重点 等你发完了电报 收音机里传来了 嘈杂的声音 仔细一听 请全体记账人员注意 XXX某 谜题已解出 内容是。。。。。 请大家传抄验证。 此时收音机的另一头 无数的记账人员内心Mind:咋地 连个新人都能 能给咱…咱抢了蛤 这咋整 呀。 要不去揍他一顿 可是咱又 不知道人家是谁 那能怎么招呢,只能认了。
各大记账员 纷纷表现出一副不情愿的 怀疑的态度 但是收音机的广播咱还是得记啊,不能坏了规矩。但是记账员还是表示怀疑 除非下一个有能力解出谜题来的人也站在 这个新人的一边 。 当你得知其他记账人员已经把你的账本传抄下来了 你得到了奖励 你并以此表现的非常嘚瑟但 事实是你还 图样图森破 且听下面分析 (终)
(以上只是帮助大家建立个概念 可能细节上有瑕疵 只当科普来看就好 )
解谜是全网记账员的集体行为,所有记账员都在解谜,有没有可能多名记账员同时挖解出谜题的可能呢?
这是有可能的(概率很小)。如果出现多名记账员同时解出谜题的情况,那奖励该给谁呢?取舍标准是什么呢?今天我们就来解答这些问题。
记账员解出谜题后,会第一时间将新的账单发布出去,新账单经其他其他验证合法(比如账单 交易记录的签名是否正确 接触的谜题是否正确)后,就会接受该账单,并在该账单的基础下解下一页账单 因为 下一页账单的内容里 有上一页账单 的 解除的谜题的答案 作为谜题的一部分 所以他们之间是相互关联的。
我们假设有两名记账员A和B同时解出谜题,这时区块链就形成了一个短暂的分叉,并假设A记账员记的分支账本称A账本,B记账员的分支账本称B账本。记账员A和B都会将自己的账单到广播出去,其他记账员节点可能先收到A记账员发布的新账单,也可能收到B记账员发布的新账单,然后,他们将分别在各自接收到的新区块后延伸区账单 此时记账员队伍 就变成了2个分支 一个拿着分支账本A 一个队伍拿着分支账本和B分支账本 如下图。
假设后来A分支账本上的记账员队伍里有人先解出第N+1个谜题,这时该记账员会向全网广播第N+1账单的信息,其他不管是队伍A 和B 会监测到有新的账单出来了 ,就会停止继续解出N+1个账单(无论之前他是在A分支账本上解谜 还是在B分支账本上解谜),会选择在这个最新的分支账本A上继续解第(N+2)个账单区块,这也就意味着A分支账本胜出,第N个账本的奖励归记账员A所有(严格地说,记账员B也得到了奖励,但是因为在竞争中自己的账本分支B 账单的页数 比不上A的了 没有A的厚 此时A 有2页 他就只有1页 谁的账本厚就相信谁的账本是有效的 ,所以原来B自己的账本上那 系统给自己的那笔奖励 的也就会失效了,因为别人相信了A的账本 B账本写什么 都没什么用了 因为没人再关注B账本了 )。
反之,如果第N+1个账单在B分支账单上先被解出,那么所有的记账员都会在B分支账本上继续解谜,第N个账单的奖励归记账员B所有。
为什么会这样呢?因为区块链的机制规定,只认最长的账单,这也是所有记账员的共识,所以当一个合法的账单被解决后,所有记账员将在此账单的基础上解谜下一个账单,因为这对所有记账员而言,都是最经济、利益最大化的选择,而另外另一个账本分支被丢弃,被丢弃的账本区块也称为孤块。
但话有说过来 如果要黑掉比特币 按照上面的原理 只要你创造出一本 比当前所有除了 创世区块(写死在代码里了 改不了) 都要厚的账本 那 人家就会相信你的账本 那之前 所有人的挖的矿 就全部 没得咯 。当然要做到这点 除非 只能信仰量子力学了。当然其实你不用覆盖全部区块链 只要你解谜能力 超过一半 现在 全世界的计算机 那你也就能 控制区块链。
补充下 一般 比特币 一枚需要10分钟 所以一般转账的话 至少要等到 第二块 比特币 挖出来 才能确认第一块是不是伪造的 这样的话 转账至少要20分钟左右 每一个区块 大概能记录2400多条交易记录。当币被挖完了到时后挖矿就只能 收到手续费了 不会有系统的奖励了。
区块链的应用场景:
使用工具 | 软件环境 |
---|---|
IDEA | Java,netty,fastjson |
电脑一台 | SpringBoot |
双手 眼睛 大脑 |
以下使用java 实现 当然用其他语言也是可以的 比如python写起来方便但是 阅读起来就不像 编译型语言结构清晰 语言 看起来 代码读起来就不那么清晰明了。
区块链 是 数组结构的 数据结构如下
Block 需要用到的字段
//当前区块索引
public String index;//
//记录上一个区块的hash值
public String previousHash;
//时间戳
public long timestamp;
//区块链 存放交易的数据信息
public List<Transaction> data;
//当前 区块的Hash值
public String hash;
//挖矿的工作量证明
public Integer nonce;
Transaction 主要用来记录 区块链 之间 交易的信息 并且 会写在 每个 Block 区块里 如果你向 某人发起一笔转账 那么 这条信息 就会生成一条 Transaction UTXO模型
public class Transaction {
//交易的id
private String id;
//交易 输入信息
public TransactionInput txIn;
//交易的 输出信息
public TransactionOutput txOut;
//转账的数量
public BigDecimal amount;
}
上面就是比特币钱包的转账功能 填入 要转账的人 金额 这样就会通过P2P 网络将这条转账消息 给发送出去。
List<Block> bs1= new ArrayList<Block>();
//创世区块
Block bx =new Block("1","1" , new ArrayList<Transaction>() ,"1",1);
bs1.add(bx);
List<Transaction> trades =new ArrayList<Transaction>();
//随机生生几笔交易 一般是通过p2p网络获取 这里只是演示 p2p网络到后面再实现
Transaction deal01 = new Transaction();
Transaction deal02 = new Transaction();
Transaction deal03 = new Transaction();
//把订单加入区块链
trades.add(deal01);
trades.add(deal02);
trades.add(deal03);
//系统创建的用于奖励的交易记录
Transaction systemDeal = new Transaction();
//把交易加入账单
trades.add(systemDeal);
//获取当前区块链的最后一个区块
Block lastBlock = bs1.get(bs1.size() -1);
//随机数
int nonce = 1;
// 通过 将 前一个区块链 和 当前区块的json格式化字符串 和 一个随机数(工作证明) 拼接起来计算hash
while(true){
String hash = Sha256.getSHA256(lastBlock.hash + JSON.toJSONString(trades) + nonce);
System.out.println("hash:" +hash);
//以 2个0开头的hash 算出来正确的话 那恭喜你可能挖到矿了
//为什么说可能 因为即便你娃出来了 同时 还有人挖出来的话 可能会被别人的覆盖掉的可能 //00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048 这是第一块区块链的hash值
// 大概有8个0 但现在要挖矿的话就可能达到20个0了 随着0的数量越来越多 每次瞎猜你能挖到的概率也是越来越低
if(hash.startsWith("00")){
System.out.println("=======计算结果正确,计算了" + nonce+"次 计算出hash值为:" + hash );
break;
}
nonce ++;
}
但是 比特币的 挖矿代码 是经过优化的能在GPU上进行多核运算。
这上面 代码呈现出来的就是挖矿和 核心逻辑了 也就是矿工的日常了。
[{
"data": [],
"hash": "fa3fb989d06aa5b5afe74ea599b4af3d20a4f8b798799ef59d15b276ce082d7e",
"index": 1,
"nonce": 1,
"previousHash": "b128bd865fafcb0ae7cce77535700520021ef1fef20d12fbde9a4ac95e750233"
}, {
"data": [{
}, {
}, {
}, {
"Sender": "System",#系统给的奖励
"amount": 666, #奖励金额
"recipient": "caomaoboy" ##奖励给XXX
}],
"hash": "0000ef8f8b4b9bcd92b4067820094d654d9cbd8fc98ce18663216fd96a85439d", #算出来的前4位为0的hash
"index": 2,
"nonce": 5845, #工作量证明 就是你瞎猜了几次猜中的
"previousHash": "fa3fb989d06aa5b5afe74ea599b4af3d20a4f8b798799ef59d15b276ce082d7e"
}]
这是我挖了一个矿后 区块链的内容。