主页 > imtoken安卓官方下载 > 用 Java 实现的简单比特币系统
用 Java 实现的简单比特币系统
最近比特币分佣系统,区块链技术突然爆发。身边做技术的朋友,饭后不谈区块链,被认为跟不上时代。为什么会这样?
这其实和去年比特币价格的飞速进步是分不开的。比特币价格从去年初的不到1000美元涨到了今年年初的近20000美元的高位。盈利的效果足以吸引大家的眼球。比特币价格一年涨了20倍,大家准备试试。
但是,如果你问这些朋友什么是比特币以及它是如何构建的,他们中很少有人能回答。作为技术背景,我们今天将向您展示如何在 Java 中实现一个。简单的比特币系统,为了让大家对区块链和比特币的底层实现技术有一个初步的了解。
区块链
比特币是一种基于区块链技术的加密数字货币。区块链,顾名思义,就是由很多块组成的链。区块链可以简单的比作一个账本,区块到账本的一页,账本的每一页记录了很多比特币转账交易,那么根据这个账本中的所有交易记录,任何交易者的余额应该可以计算,我们先构造一个块。结构
公共类块{
/**
* 区块索引号
*/
私有 int 索引;
/**
* 当前区块的哈希值,区块的唯一标识
*/
私有字符串哈希;
/**
* 区块生成时的时间戳
*/
私人长时间戳;
/**
* 当前区块的交易集
*/
私有列表交易;
/**
* 工作量证明,计算正确哈希值的次数
*/private int nonce;
/**
* 上一个区块的哈希值
*/
私有字符串previousHash;
}
交易
转账交易是比特币所有者之间的相互转账。我们暂时假设这些比特币的所有者是比特币钱包。钱包有相应的钱包地址。那么这些转账交易实际上就是钱包。地址之间的转账交易(类似于支付宝用户之间的转账,其实就是支付宝用户名之间的转账),这些转账交易需要记入账本才能真正生效。
由于比特币转账交易设计比较复杂,今天不深入讨论比特币分佣系统,所以这里我设计了一个简单的交易模型如下:
公共类交易{
/**
* 交易唯一 ID
*/
私有字符串id;
/**
* 交易发送者钱包地址
*/
私有字符串发送者;
/**
* 交易收款人钱包地址
*/
私人字符串接收者;
/**
* 交易金额
*/
私人整数;
}
挖矿
挖矿到底是怎么回事?
为什么那么多人叫嚣着去挖矿,梦想一夜暴富?
我们可以简单地将挖矿比作矿工解决数学问题的过程。只要正确解决,就可以获得比特币系统奖励的比特币,同时获得区块链账本新区块的交易记账。对了,矿工会在新的账本页面上记录比特币系统最近的转账交易,并获得交易手续费。一旦交易记录在账本中,交易就完成了,接收方才能真正接收到发送方。比特币转移。
那么这个数学谜题是什么样子的呢?
让我们看看这个数学谜题的公式:
Hash = SHA-256(区块链最后一个区块的Hash+待计费的交易记录信息+随机数)
这个公式很清楚。 SHA-256 是一种哈希加密算法。要加密的前两个部分是固定的。我们只依靠随机数的不断变化来计算不同的哈希结果。系统要求哈希结果必须以 10 个 0 开头。这个概率太小太小了。我们可以让测试更简单。
例如:只要哈希结果以4个0开头,我们就认为问题解决成功,即挖矿成功。这时矿工可以生成一个新的区块,并将所有需要记录的交易记录记录到该区域中。同时构造一个系统奖励给自己的比特币交易(发起者为系统,接收者为矿工,假设比特币数量为10),也记录在账本中,所以即通过账本中的账户交易记录会显示矿工余额增加了10比特币。
我们来看挖矿代码:
/**
* 挖矿
* @param blockchain 整个区块链
* @param txs 需要计费的交易记录,包括
* @param address 矿工钱包地址
* @return
*/
private static void mineBlock(List blockchain, List txs, String address) {
//加入系统奖励交易
事务 sysTx = new Transaction(CryptoUtil.UUID(), "", address, 10);
txs.add(sysTx);
//获取当前区块链中的最后一个区块
Block latestBlock = blockchain.get(blockchain.size() - 1);
//随机数
int nonce = 1;
字符串哈希 = "";
而(真){
哈希 = CryptoUtil.SHA256(latestBlock.getHash() + JSON.toJSONString(txs) + nonce);
if (hash.startsWith("0000")) {
System.out.println("======计算结果正确,计算次数为:" +nonce+ ",hash:" + hash);
休息;
}
随机数++;
System.out.println("计算错误,哈希:" + 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 区块链
* @参数地址
* @return
*/
public static int getWalletBalance(Listblockchain, String address) {
int 余额 = 0;
for(区块:区块链){
Listtransactions = block.getTransactions();
for(交易交易:交易){
if (address.equals(transaction.getRecipient())) {
余额 += transaction.getAmount();
}
if (address.equals(transaction.getSender())) {
余额 -= transaction.getAmount();
}
}
}
返还余额;
}
至此,我们已经用java实现了一个基于区块链账本技术的简单比特币系统,包括区块链功能、挖矿生成新比特币功能、转账交易功能、余额查询功能、完整代码找小助手搞定.
运行结果如下图所示:
当然,真正的比特币系统远不止这么简单。比如结合密码学保证转账交易不被篡改,结合P2P技术实现点对点分布式网络功能。
我们只是在这里介绍一些想法。想了解更多的朋友可以参考我们提供的视频资料。