主页 > imtoken安卓官方下载 > 用 Java 实现的简单比特币系统

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

imtoken安卓官方下载 2023-01-17 05:42:01

最近比特币分佣系统,区块链技术突然爆发。身边做技术的朋友,饭后不谈区块链,被认为跟不上时代。为什么会这样?

这其实和去年比特币价格的飞速进步是分不开的。比特币价格从去年初的不到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技术实现点对点分布式网络功能。

我们只是在这里介绍一些想法。想了解更多的朋友可以参考我们提供的视频资料。