主页 > imtoken钱包地址 > Java 创建你的第一个区块链-part2:可交易

Java 创建你的第一个区块链-part2:可交易

imtoken钱包地址 2023-07-10 05:12:10

区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的一种新型应用模式。 所谓共识机制是区块链系统中不同节点之间建立信任、获取权益的数学算法。

前言

本系列教程旨在帮助您了解如何开发区块链技术。 【翻译】Create your first blockchain in Java-part2

本章目标

这样我们就有了自己的加密货币

值得注意的是,这里创建的区块链并不是功能齐全,完全适合应用和生产。 相反,它只是为了帮助您更好地理解区块链的概念。

sitehqz.com 比特币创世区块_比特币交易链区块拥堵_比特币创世纪区块地址

别担心,它实际上很简单,但比上一个教程要长!

在顶章【翻译】Create your first blockchain in Java-part2,我们已经有了一个基本的区块链,但是一些无用的信息存储在区块链中。 今天我们将用交易替换这些信息(我们的区块将能够保存多个交易),从而允许我们创建一个非常简单的加密货币,我们的货币名称是 NoobCoin。

准备一个钱包

在加密货币中,当在区块链上进行交易时,硬币的所有权可以转移,每个参与者都有一个私人地址来发送或接收硬币。 ,钱包可以存储这些地址。 因此,钱包是一种可以在区块链上进行新交易的软件。

比特币交易链区块拥堵_比特币创世纪区块地址_sitehqz.com 比特币创世区块

不要担心有关交易的信息,很快就会解释

让我们创建一个钱包类来保存公钥和私钥:

package noobchain;
import java.security.*;
public class Wallet { 
 public PrivateKey privateKey; 
 public PublicKey publicKey;
}

公钥和私钥的作用是什么? 其实公钥的作用就是地址。 您可以与他人共享您的公钥以获取付款,而您的私钥的作用是签署交易。 这样别人没有你的私钥就不能花你的钱,所以对每个人来说,一定要保护好自己的私钥,不要把自己的私钥信息泄露给他人。 同时,我们在进行交易的时候,也会同时发送我们的公钥来验证我们的签名是否有效,没有数据被篡改。

我们在 KeyPair 中生成私钥和公钥。 我们将使用椭圆曲线密码学来生成我们的密钥对 KeyPair。 让我们将 generateKeyPair() 方法添加到我们的钱包类并在构造函数中调用它:

比特币创世纪区块地址_比特币交易链区块拥堵_sitehqz.com 比特币创世区块

私钥用于签署我们不想被篡改的数据。 公钥用于验证签名。

你不需要完全理解椭圆曲线加密算法的核心逻辑是什么,你只需要用它来创建公钥和私钥,以及公钥和私钥的作用是什么。 有了钱包类的大体框架,我们再来看看交易类。

比特币创世纪区块地址_sitehqz.com 比特币创世区块_比特币交易链区块拥堵

交易和数字签名

每笔交易都将携带以下某些信息:

资金支付人的公钥信息。 资金接收方的公钥信息。 转移的资金数额。 输入,这是对先前交易的引用,证明发件人有资金可以发送。 输出,显示交易中收款人相关地址的数量。 (这些输出被引用为新交易的输入)加密签名证明交易是由地址的发送者发送的并且数据没有被更改。 (防止第三方机构更改发送金额)

让我们创建这个新的事务类:

我们还应该创建空的 transactioninput 和 transactionoutput 类,不用担心我们可以稍后填充它们。

我们的交易类也会包含生成/验证签名和验证交易的相关方法,那么签名的目的是什么? 签名在我们的区块链中执行两个非常重要的任务:首先,签名用于确保只有货币所有者才能发送自己的货币,其次,签名用于防止其他人试图篡改提交交易。

即私钥用于对数据进行签名,公钥用于验证其完整性。

例如:Bob要给Sally发送2个加密货币,他们用各自的钱包创建一个交易,作为一个新区块提交给全网区块链比特币创世纪区块地址,一个矿工试图篡改接收方的2个加密货币给John,但幸运的是,Bob已经用自己的私钥对交易数据进行了签名,这使得全网任何一个节点都可以使用小明的公钥来验证数据是否被篡改(因为没有其他人的公钥可以用来验证)验证小明发送的交易)。

从前面的代码我们可以看出我们的签名将是一堆字符串,所以让我们创建一个方法来生成它们。 首先,我们在 StringUtil 类中创建生成签名的方法。

不用担心看不懂这些方法的内容。 你只需要知道applyECDSASig方法的输入参数是付款人的私钥和需要加密的数据信息,签名后返回一个字节数组。 verifyECDSASig 方法的输入参数是公钥、加密数据和签名。 调用该方法后,返回true或false表示签名是否有效。 getStringFromKey 返回任何键的编码字符串

让我们使用签名方法在事务类中添加 generatesiganature() 和 variifysignature() 方法:

实际上,您可能想要签署更多信息,例如使用的输出/输入和/或时间戳(目前我们只签署最低限度)

签名将由矿工进行验证,只有签名验证成功后才能将交易添加到区块中。

比特币创世纪区块地址_sitehqz.com 比特币创世区块_比特币交易链区块拥堵

当我们检查区块链的有效性时,我们也可以检查签名

测试钱包和签名

现在我们简单地做一些测试。 在 main 方法中,我们添加了一些新的变量,并替换了我们之前在 main 方法中的一些内容。

确保添加 bounceycastle 依赖项

我们创建了两个钱包walleta和walletb,然后打印了walleta的私钥和公钥。 生成交易并使用 walleta 的私钥对其进行签名。

打印

接下来我们将创建和验证输入和输出,并将交易保存到区块链。

输入输出1:如何验证货币是你的

如果你拥有 1 个比特币,你必须预先收到 1 个比特币。 比特币分类帐不会向您的帐户添加比特币,也不会从发送者那里减去比特币,发送者只能指向他/她之前收到过比特币,因此创建交易输出用于显示比特币发送到的地址你(一个交易的输入指向上一个交易的输出)。

您的钱包余额是所有未花费交易输出的总和

从这个角度来看,我们将按照比特币中的说明,将所有未花费的交易输出称为UTXO。

创建事务输入类:

此类将用于引用未使用的交易输出。 transactionOutputId 将用于查找相关的 TransactionOutput,允许矿工检查您的所有权。

创建事务输出类:

交易输出类将显示交易发送给每一方的最终金额。 这些在新交易中用作输入参考,作为您可以发送的金额的证明。

比特币交易链区块拥堵_sitehqz.com 比特币创世区块_比特币创世纪区块地址

输入输出2:处理交易

区块链可以接收很多交易,而且区块链可以很长,因为我们必须查找和检查它的输入,所以处理新交易可能需要很长时间。 为了解决这个问题,我们保存了一个额外的集合叫做used transactions作为可用输入,所以在main函数中添加一个叫做UTXO的集合。

hashmap 允许我们使用键来查找值,但是你需要导入 java.util.hashmap

重点来了,我们在事务类中添加一个processTransaction方法,这个方法就是把所有的东西都放在一起来处理事务。

我们还添加了 getInputsValue 方法

通过这种方法,我们执行一些检查以确保交易有效,然后收集输入并生成输出。 最重要的是,最后,我们在我们的 UTXO 列表中丢弃了输入,这意味着一个可用的交易输出必须是之前的一个输入,所以输入的价值必须被完全使用,所以付款人必须改变自己的金额状态。

sitehqz.com 比特币创世区块_比特币交易链区块拥堵_比特币创世纪区块地址

红色箭头是输出。请注意比特币创世纪区块地址,绿色输入是对先前输出的引用

最后让我们修改我们的钱包类

您可以随时为您的钱包添加一些其他功能,例如记录您的交易历史记录。

将交易添加到块

现在我们有了一个有效的交易系统,我们需要将交易添加到我们的区块链中。 我们用交易列表替换了我们区块中的无用数据,但是单个区块中可能存储了1000笔交易,这会导致大量的哈希计算,不用担心这里我们使用交易的merkle根,稍后你会看到。 让我们添加一个辅助方法来在 StringUtils 类中创建 merkle 根。

在 StringUtils 类中创建 getMerkleRoot 方法

我会尽快用实际的 merkleroot 替换它,但现在它可以正常工作

构建块类

请注意,我们还更新了 Block 构造函数,因为我们不再需要传递字符串数据并将 merkle 根包含在计算哈希方法中。 addTransaction 方法用于添加交易,只有满足条件才能将交易成功添加到区块中。

我们已经实施了交易区块链。

sitehqz.com 比特币创世区块_比特币创世纪区块地址_比特币交易链区块拥堵

最后一个考试

我们应该测试从钱包发送货币、更新区块链和进行有效性检查。 但首先我们需要一种方法来将新代币引入组合中。 有很多方法可以创建新硬币。 在比特币区块链上,有很多方法可以创建新的比特币:矿工可以将交易作为对每个矿工进行挖矿的奖励。 但是这里我们只希望硬币在创世块中发布。 就像比特币一样,所以我们修改我们的主要功能来达到以下目的。

考虑到交易,创世块向 walletA 释放 100 个硬币以进行更新的链有效性检查。 测试事务以查看是否一切正常。

打印:

钱包现在可以在您的区块链上安全地发送金额,只要它们有要发送的金额。这意味着您拥有自己的原生加密货币

交易区块链

sitehqz.com 比特币创世区块_比特币交易链区块拥堵_比特币创世纪区块地址

您已成功创建自己的加密货币。 你的区块链:

比特币创世纪区块地址_比特币交易链区块拥堵_sitehqz.com 比特币创世区块

原文链接:Creating Your First Blockchain with Java。 第 2 部分-交易

代码下载

从我的github下载,