0基础学java有多难?用Java怎么实现简单的比特币系统

原创 2018年04月17日 15:12:12

最近区块链技术突然爆火,身边做技术的朋友茶余饭后不谈点区块链什么的都被认为是跟不上时代了,为啥会这样了?

这其实跟比特币价格去年的突飞猛进是分不开的,比特币价格从去年初不到一千美金到今年初最高接近两万美金,赚钱效应已经足够博取大家眼球了,吃瓜群众对比特币价格一年上涨20倍早已目瞪狗呆,个个备足钱袋,跃跃欲试。

可是,细问一下这些朋友比特币到底是个什么东西,它是如何构造出来的,还真没几个能答得上来的,作为技术出身的我们今天就来带大家用Java语言实现一个简单比特币系统,以期让大家能对区块链与比特币的底层实现技术有一个入门性的认识。

区块链

比特币是构建在区块链技术之上的一个加密数字货币,区块链顾名思义即由很多区块组成的链条,可以把区块链简单比喻为一本账本,把区块比喻为账本的一页记录,账本的每一页里都记录了很多比特币的转账交易,那根据这个账本里的所有交易记录应该是能算出任何一个交易者的余额,我们先来构造一个区块的结构

publicclassBlock {/** * 区块索引号 */privateint index;/** * 当前区块的hash值,区块唯一标识 */private String hash;/** * 生成区块的时间戳 */privatelong timestamp;/** * 当前区块的交易集合 */private List transactions;/** * 工作量证明,计算正确hash值的次数 */privateint nonce;/** * 前一个区块的hash值 */private String previousHash;}

转账交易

转账交易即比特币的拥有方之间进行的相互转账行为,我们把这些比特币的拥有方暂时假设为比特币的钱包,钱包有对应的钱包地址,那这些转账交易实际上就是钱包地址之间的转账交易(类似于支付宝用户之间的转账,其实就是支付宝用户名之间的转账),这些转账交易需要被记录到账本里才算真正的生效。

由于比特币的转账交易设计比较复杂,我们今天暂时不深入讨论,所以这里我设计了一个简单的交易模型如下:

publicclassTransaction {/** * 交易唯一标识 */private String id;/** * 交易发送方钱包地址 */private String sender;/** * 交易接收方钱包地址 */private String recipient;/** * 交易金额 */privateint amount;}

挖矿

挖矿到底是怎么回事?

为什么那么多人吵着要去挖矿,梦想着一夜暴富?

我们可以简单的把挖矿比喻成矿工解一道数学难题的过程,只要解对了就能获取比特币系统奖励的一笔比特币,同时获取了区块链账本新区块的交易记账权,矿工会把比特币系统近期发生的转账交易记录到账本新的一页上,并获取交易的手续费,一旦交易被记录进了账本,交易就算完成了,接收方才能真正收到发送方转账的比特币。

那这道数学难题到底长什么样了?

我们看下这个数学难题的公式:

Hash = SHA-256(区块链的最后一个区块的Hash + 需记账交易记录信息 + 随机数)

这个公式已经很明白了,SHA-256是一种哈希加密算法,被加密的前两部分是固定不变的,我们只有依赖于随机数的不断变化计算出不同的hash结果,系统要求hash结果必须要以10个0开头,这个几率实在是太小太小,我们做测试可以简单一点。

比如:只要hash结果满足以4个0开头,我们就认为解题成功,即挖矿成功了,这时矿工就可以生成一个新的区块把需记账的交易记录全部记录进区块里去,同时再构造一笔系统奖励给自己的比特币的交易(发起方为系统,接收方为矿工,比特币金额假设为10个),将其也记录进账本,这样通过账本里的交易记录就会发现矿工的余额多了10个比特币了。

我们看下挖矿的代码:

/*** 挖矿* @param blockchain 整个区块链* @param txs 需记账交易记录,包含* @param address 矿工钱包地址 * @return*/privatestaticvoidmineBlock(List blockchain, List txs, String address) {//加入系统奖励的交易 Transaction sysTx = new Transaction(CryptoUtil.UUID(), "", address, 10); txs.add(sysTx);//获取当前区块链里的最后一个区块 Block latestBlock = blockchain.get(blockchain.size() - 1);//随机数int nonce = 1; String hash = "";while(true){ hash = CryptoUtil.SHA256(latestBlock.getHash() + JSON.toJSONString(txs) + nonce);if (hash.startsWith("0000")) { System.out.println("=====计算结果正确,计算次数为:" +nonce+ ",hash:" + hash);break; } nonce++; System.out.println("计算错误,hash:" + hash); }//解出难题,可以构造新区块并加入进区块链里 Block newBlock = new Block(latestBlock.getIndex() + 1, System.currentTimeMillis(), txs, nonce, latestBlock.getHash(), hash); blockchain.add(newBlock); System.out.println("挖矿后的区块链:" + JSON.toJSONString(blockchain));}

余额

计算某个钱包地址的余额其实就是从区块链账本里找出所有该地址作为接收方的交易记录,将这些交易记录的发生金额累加就得到该地址收到的所有比特币金额了,然后找出所有该地址作为发送方的交易记录再次累加则得到该地址发送出去的所有比特币金额了,用收到的比特币金额之和减去发送出去的比特币金额之和就得到该地址真正的比特币余额了。

具体我们看下代码:

/*** 查询余额* @param blockchain* @param address* @return*/publicstaticintgetWalletBalance(Listblockchain, String address) {int balance = 0;for (Block block : blockchain) { Listtransactions = block.getTransactions();for (Transaction transaction : transactions) {if (address.equals(transaction.getRecipient())) { balance += transaction.getAmount(); }if (address.equals(transaction.getSender())) { balance -= transaction.getAmount(); } } }return balance;}

至此,我们就用java基于区块链账本技术实现了一个简单的比特币系统了,包含区块链功能,挖矿产生新比特币功能,转账交易功能,查询余额功能,完整的代码找小助手领取。

最后,想学java的话就来湖南卓越新腾吧

微信公众号:fcjyzyxt

不要用自己的懒惰说java有多难

Java学习之路:不走弯路,就是捷径 0.引言 软件开发之路是充满荆棘与挑战之路,也是充满希望之路。Java学习也是如此,没有捷径可走。梦想像《天龙八部》中虚竹一样被无崖子醍醐灌顶而轻松获得一甲子...
  • rds_java
  • rds_java
  • 2017-06-26 18:58:40
  • 330

零基础如何学习JAVA编程开发

Java如今已经是全球编程语言排民第一的语言,运用广泛,前景广阔,现在学习java,将来就业,升职加薪都会有保障。那 么如何学习java,想要学习java,java的入门方法是什么? 入...
  • zyhlala
  • zyhlala
  • 2016-06-18 09:56:34
  • 174

Java实现一个简单的比特币系统

最近区块链技术突然爆火,身边做技术的朋友茶余饭后无不谈点区块链或比特币的,为啥会这样了?这其实跟比特币价格去年的突飞猛涨是分不开的,比特币价格从去年初不到一千美金到今年初最高接近两万美金,赚钱效应已经...
  • u011418530
  • u011418530
  • 2018-04-10 08:54:03
  • 66

用Java实现简单的比特币系统

最近区块链技术突然爆火,身边做技术的朋友茶余饭后不谈点区块链什么的都被认为是跟不上时代了,为啥会这样了?这其实跟比特币价格去年的突飞猛进是分不开的,比特币价格从去年初不到一千美金到今年初最高接近两万美...
  • bjweimengshu
  • bjweimengshu
  • 2018-04-04 00:00:00
  • 420

一个零基础的新手应该如何系统的学习java开发

一个零基础的小白,应该如何系统化的学习JAVA编程语言,然后找到工作,在学习的过程中不浪费时间少走弯路。  第一,必须有一个老师给自己讲解,带着学习,这样首先是可以少走很多的弯路,不至于一个...
  • Annie6510
  • Annie6510
  • 2017-12-25 10:42:59
  • 423

零基础的人怎么学习Java

编程语言Java,已经21岁了。从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的。Java应用的广泛已...
  • xiaoye142034
  • xiaoye142034
  • 2017-10-07 15:43:33
  • 2323

完全零基础开始学习iOS开发(1)

看OC的教程已经有几天时间了,昨天到现在也看了两集的Stanford University的iOS7的开发课程了。跟着老师的思路发现跟上有点难,所以也会边看边百度(google被封,无法上)各种自己觉...
  • FollowTheLight
  • FollowTheLight
  • 2014-12-12 15:14:29
  • 328

零基础没有学历可以学好java专业吗…

学习兴趣最重要,学习技术一开始就是理论很难让我有兴趣,师傅领进门,领字非常重要,潭州学院学习java是从web前端开始学习,首先先学会做网页前端的html代码,每节课一个月就可以做一个效果,这样就引起...
  • iaoyou
  • iaoyou
  • 2015-05-27 15:56:44
  • 2875

用java实现一个简单的学生管理系统

用Java如何实现一个用数组作为存储结构的简易的学生管理系统?首先,我们定义一个student类,在其中添加私有化的成员变量,通过getter和setter方法进行调用public class Stu...
  • qq_39984761
  • qq_39984761
  • 2017-11-26 17:37:31
  • 1590

Java版本的比特币源代码bitcoinj

  • 2018年02月28日 11:04
  • 21.36MB
  • 下载
收藏助手
不良信息举报
您举报文章:0基础学java有多难?用Java怎么实现简单的比特币系统
举报原因:
原因补充:

(最多只允许输入30个字)