从零开始的java区块链之路(一) 什么是区块链?

说起区块链最被人所熟知的还是 比特币。比特币是一种去中心化的P2P(Point to Point)形式的数字货币。

货币的起源

    在公元前3000年,两河流域的苏美尔人,在波斯湾沿岸有着很广阔的贸易,当时的交易方式是物物交换,用自己已有的物资去交换自己需要的物资,比如一只羊换一把石斧。而原始实物货币可谓五花八门,贝壳、羽毛、布料、盐和牲畜都曾是交换工具。古埃及甚至以土地或奴隶作为士兵的薪饷。古罗马士兵得到的军饷曾经有食用盐。拉丁文Sal的意思就是“盐”,英文工资“Salary”一词就是从Sal演变而来的。到了20世纪,在一些发展滞后的国家和地区,还有用特殊形状的羽毛、矿石和金属制品作为货币的现象。
    中国也有以贝壳做交易的历史。商朝中期以后,当时流通最广泛的贝币,由于来源不稳定致使交易发生不便,人们才寻找更适宜的货币材料来替代,有人制作玉贝、石贝、木贝、骨贝以及蚌贝,以补充天然海贝的不足。那时低面值的“贝币”在市场交换中的麻烦是显而易见的。例如,为了买一头牛,要背上成袋的“贝币”或者“仿贝”到市场上去,支付时的计算也很费事。而购买更贵重的商品时,携带的“贝币”恐怕要斗量车载了。

货币属性

    黄金之所以天然是货币,除了其天生无可比拟的物理属性之外,黄金和人类交织的历史几乎和人类的历史一样古老,人类对黄金达成的共识,在人类历史的发展进程中自然形成,对黄金的信任和偏好深入骨髓,就差写入基因了。人们乐意用黄金来衡量财富,也放心的让自己的财富映射到黄金,当然也欣然接受用黄金作为媒介进行交易。

    法币之所成为货币,是人为刻意的让法币拥有了货币的属性,比如:一定的稀缺性,稳定易保存,可分割可组合,但更重要的是国家政府作为信用背书,强制的让人们形成共识,给法币赋值,形成货币。然而,在法币一统天下的今天,各国央行都还在大量的储备黄金,民间个人也会配备黄金用来避险,可见自然形成的共识基础远比人为强制达成的更加的稳固。

    货币之所以成为货币,其本身具有的货币属性仅仅是必要条件,还有需要另外一个充分条件:达成共识。

区块链起源:

  1. 2008年11月,一个名为中本聪的作者发布了一遍叫 B i t c o i n : A   p e e r − t o − p e e r   E l e c t r o n i c   C a s h S y s t e m Bitcoin:A\ peer-to-peer\ Electronic \ Cash System Bitcoin:A peertopeer Electronic CashSystem的论文,国内译作《比特币:一种点对点的电子现金系统》,后来也称为比特币白皮书。该文阐述了这种加密货币的理念
    ,它不由中央银行或权利机构来发行,而是允许两个匿名之间直接进行交易。
  2. 2009年1月,中本聪用最初版本的比特币创建了创世区块,标志着比特币系统的正式上线。一周后,中本聪发送了10比特币给密码学专家哈尔芬妮,这是比特币的第一笔正式交易。
  3. 2010年5月,一位昵称叫Laszlo的程序员在论坛上发帖,想出售10000个比特币,要价50美元,最终被人以25美元的披萨优惠券换取。这诞生了比特币的第一个公允汇率,也标志着比特币具有了流通的性质。此后几年,比特币价格一路飞涨。

比特币价值

  1. 供需决定价值:当所有人认为 某样东西之前 那么他就值钱了 比如曾经的"郁金香泡沫"
  2. 数量稳定:只有2100万个 货币的另一个属性是稀有性 如果黄金 钻石 都是无限的 那他们就不值钱了 另外提一点 但其实钻石 是人为的控制了稀缺性 基本上资源被垄断了 单在前苏联发现的一座钻石矿场 平均给70亿人的话 每人可得143克拉 。
  3. 支付方便,透明中立:每个账户知识一串特殊数字 没有人可以追踪到 每个账户是谁在使用 所以很多洗钱都用它。

比特币与区块链的关系

区块链本质其实是一个分布在全球各地、能够协同运转的数据库存储系统,区别于传统数据库运作——读写权限掌握在一个公司或者一个集权手上(中心化的特征),区块链认为,任何有能力架设服务器节点的人都可以参与其中。来自全球各地的掘金者在当地部署了自己的节点,并连接到区块链网络中,成为这个分布式数据库存储系统中的一个节点;一旦加入,该节点享有同其他所有节点完全一样的权利与义务(去中心化、分布式的特征)。与此同时,对于在区块链上开展服务的人,可以往这个系统中的任意的节点进行读写操作,最后全世界所有节点会根据某种机制的完成一次又依次的同步,从而实现在区块链网络中所有节点的数据完全一致。

这里主要还是讲区块链的知识比特币稍微了解下就好了。


视频链接

区块链的核心是 去中心化 想想一下 如上图 有一个中心的账本 比如支付宝他记录着 你花费了多少钱 给谁 谁每月花费了多少钱给其他人 但是在某些情况下 你没法保证中心账本 不会被篡改 丢失 。
从零开始的java区块链之路(一) 什么是区块链?_第1张图片

工作量证明

工作量证明(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.” 这句话是泰晤士报当天的头版文章标题,引用这句话,既是对该区块产生时间的说明,也可视为半开玩笑地提醒人们一个独立的货币制度的重要性,同时告诉人们随着比特币的发展,一场前所未有的世界性货币革命将要发生。该消息是由比特币的创立者中本聪写入创世区块中

从零开始的java区块链之路(一) 什么是区块链?_第2张图片
账本是区块链的基础的核心 形象的说就像一页页账单(一个个区块 其实就是数据结构里面的数组)串成 了一个本子 记作 账簿 你要做的就是打开你的收音机 调好频道 这时频道里传来了 浑厚低沉的嗓音 现在播报最新消息:李某某 向 王某某 转账 10元 交易密码是:111111 你马上拿起了笔在你的账单上 开始 忽想起刚才所听到的这一切 用笔在账单上写了下来 还没等你有丝毫 歇息的时刻 收音机里 又传来了熟悉的声音 你下意识的 拿起了笔 又开始记录起来了 你心想:不就是听写吗 这还难得到我吗 慢慢的你熟悉了这里的工作变得游刃有余 等你窸窸窣窣 写完了 这一张纸 然后 突然收音机里的声音 停止了 虽然已是停止但那个声音在你脑袋里 盘旋盘旋 很久不能离去 你还在纳闷发生了什么 转念一想 得亏停止了要不然这一页我就写不下了 此时你一数账单上的交易记录 哎呀 又数错了 虽然没有精确的数量 但大概不差得有2000多条 就在这时 收音机突然 发出 呲呲呲 的声音 抖得一下 突然思绪被打断了 不一会儿 收音机里又传来了 一个女性的声音 这个声音 又跟刚才的声音有很大的不同 这声音一听 便能让你脑中出现这样一幅画面 有一个 英姿飒爽的女士 站在你面前 带着班主任般的恶狠狠眼神 看着你 光顾着走神 就错过了收音机内 的内容 了 好在 她 又重复了一遍 :说道 请按照上一张 账单的 编号 加上 这一张账单的前3个最大值和 和 前三个 最小值 每个数的立方 再加上一个数(工作量证明) 使得 算出来的数 前3位都是1。 听到这个我顿时就一头雾水 ,不过好在咱数学也不差 就拿起笔来 涂鸦了。
从零开始的java区块链之路(一) 什么是区块链?_第3张图片
时间过得很快,虽然你拿着草稿 在上面画了各种 花花草草 森林树木 牛鬼蛇神 但是你依然还是没有解出来。但就在你想要放弃的时候 一个电灯泡在你脑中出现 你突然有了想法。于是你奋书疾笔 噌噌噌 的就写完了这道题 算出了那个数(工作量证明) 说时迟那时快 你 拿起了你的发报机 把你的账单编程摩斯密码 发了出去 虽然你还在好奇 为什么 你会发电报 但这不是重点 等你发完了电报 收音机里传来了 嘈杂的声音 仔细一听 请全体记账人员注意 XXX某 谜题已解出 内容是。。。。。 请大家传抄验证。 此时收音机的另一头 无数的记账人员内心Mind:咋地 连个新人都能 能给咱…咱抢了蛤 这咋整 呀。 要不去揍他一顿 可是咱又 不知道人家是谁 那能怎么招呢,只能认了。
各大记账员 纷纷表现出一副不情愿的 怀疑的态度 但是收音机的广播咱还是得记啊,不能坏了规矩。但是记账员还是表示怀疑 除非下一个有能力解出谜题来的人也站在 这个新人的一边 。 当你得知其他记账人员已经把你的账本传抄下来了 你得到了奖励 你并以此表现的非常嘚瑟但 事实是你还 图样图森破 且听下面分析 (终)
(以上只是帮助大家建立个概念 可能细节上有瑕疵 只当科普来看就好 )

2个人同时解出账单 可能吗?

解谜是全网记账员的集体行为,所有记账员都在解谜,有没有可能多名记账员同时挖解出谜题的可能呢?
这是有可能的(概率很小)。如果出现多名记账员同时解出谜题的情况,那奖励该给谁呢?取舍标准是什么呢?今天我们就来解答这些问题。
记账员解出谜题后,会第一时间将新的账单发布出去,新账单经其他其他验证合法(比如账单 交易记录的签名是否正确 接触的谜题是否正确)后,就会接受该账单,并在该账单的基础下解下一页账单 因为 下一页账单的内容里 有上一页账单 的 解除的谜题的答案 作为谜题的一部分 所以他们之间是相互关联的。

“奖励”的归属

我们假设有两名记账员A和B同时解出谜题,这时区块链就形成了一个短暂的分叉,并假设A记账员记的分支账本称A账本,B记账员的分支账本称B账本。记账员A和B都会将自己的账单到广播出去,其他记账员节点可能先收到A记账员发布的新账单,也可能收到B记账员发布的新账单,然后,他们将分别在各自接收到的新区块后延伸区账单 此时记账员队伍 就变成了2个分支 一个拿着分支账本A 一个队伍拿着分支账本和B分支账本 如下图。
从零开始的java区块链之路(一) 什么是区块链?_第4张图片
假设后来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多条交易记录。当币被挖完了到时后挖矿就只能 收到手续费了 不会有系统的奖励了。

区块链的应用场景:

  1. 银行支付系统:有人说区块链是把互联网银行做成了数字银行的形式区块链可以为全世界树十亿人提供金融服务 甚至包括一些在第三世界国家(排除中国)无法使用传统银行服务的人民,比特币可以让任何人以极低的费用无延时的把钱寄往全世界。
  2. 商品来源可追溯:假如你卖了一个苹果,在区块链技术下,你可以知道从果农的生产到流通环节的全过程。在这其中有镇府的监管信息、有专业的检测数据、有企业的质量检测数据等。
  3. 分析预测:区块链将改变一些行业中研究 咨询 分析和预测的方法。
  4. 网络与物联网:物联网设备体量巨大 对于中心设备的耗能和成本压力巨大 中心化存储数据隐私得不到保证等等
  5. 保险业:全球保险业基础是信用管理 区块链是一种全新的信用管理方式可用于验证保险合同中的多种数据。通过将现实中的真实数据与区块链智能契约集成在一起 对于依赖现实中真实数据有很大的作用。
  6. 旅行消费更便捷:我们经常会用某些app来寻找酒店和其他服务,各个平台从中获得提成。区块链的应用正式除去中间商,并为服务提供商和客户创建安全、分散的方式、达到直接进行连接和交易的目的。
  7. 云存储:现有的集中式服务器数据存储很容易遭受到黑客的攻击 数据丢失和人为失误 而区块链可以让 云存储变得更加安全和坚不可摧。
  8. 慈善事业:在慈善领域经常会有一些问题包括效率低下和腐败这使得资金无法到达那些真正需要帮助的人手中。使用区块链技术就可以追踪欠款。确保捐助人的捐款,到达捐款人的手里。
  9. 投票选举:另一个区块链将颠覆的重要社会领域将会是投票选举。通过选民登记和身份核查可以确保选举知计算合法选票,从而避免篡改和丢失。
  10. 政府管理系统:政府管理往往不够透明,而且容易滋生腐败实行基于区块链技术的系统,可以显著减少官僚作风,提高政府运行的安全性 效率 以及政府的透明度(这一条不一定适用于天朝)。
  11. 医疗保健:医院面临的挑战之一是缺乏用于存储和共享数据的安全平台并且 容易遭到黑客攻击区块链技术可以让病人安全的存储数据 这些数据诸如医疗文书等。这样能提高数据的安全性通过不同医院之间同一个区块链上这样 病人的数据就可以被共享省去了重复检查的开销和时间。
  12. 版权保护:创作者把作品放在区块链上,一旦有人使用了他的作品。他立刻就能知道。相应的版税也会自动支付给创作者。区块链技术既保护了版权,也有助于创作者更好更直接地向消费者售卖作品。
  13. 零售行业:当你购物时你要相信商店或市场的零售系统(没有宰你) 而采用分布式区块链技术的零售机构的工作方式与此不同他们会把买家和卖家直接联系在一起 没有中间商赚差价
  14. 房地产:在房地产买卖中由于官僚机构缺乏透明度 欺诈 和人为失误 而出现一些问题 使用区块链的公共记录通过减少对纸张的依赖加快事务的处理速度它还可以追踪所有权归属确保文档的准确性和财产转让的效力。
  15. 众筹:众筹已经成为创业公司和创业项目流行的筹款方式众筹平台的存在是为了在创业者和众筹支持者之间建立信任 但同时平台也会收取高额费用 基于区块链的众筹信托机构是通过创建智能契约和在线信证系统来消除对中间人的需要 一个众筹项目可以通过展示自己的信誉值进行项目的虚拟货币筹集,而这些虚拟货币可以在之后兑换成产品 服务或现金 许多区块链项目现在已经通过这种形式众筹。
  16. 其他:你所在的行业 有任何类型的数据记录或交易记录处理那他很可能是下一个被区块链颠覆的行业。
使用工具 软件环境
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;
    }

从零开始的java区块链之路(一) 什么是区块链?_第5张图片
上面就是比特币钱包的转账功能 填入 要转账的人 金额 这样就会通过P2P 网络将这条转账消息 给发送出去。

从零开始的java区块链之路(一) 什么是区块链?_第6张图片

 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上进行多核运算。
这上面 代码呈现出来的就是挖矿和 核心逻辑了 也就是矿工的日常了。

那启动下 我们第一个 挖矿程序 看看吧。从零开始的java区块链之路(一) 什么是区块链?_第7张图片

[{
     
	"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"
}]

这是我挖了一个矿后 区块链的内容。

你可能感兴趣的:(java,区块链,区块链,java)