不到 1500 行代码的加密货币实现

不到 1500 行代码的加密货币实现

原文:https://medium.com/hackernoon/a-cryptocurrency-implementation-in-less-than-1500-lines-of-code-d3812bedb25c

动机

加密货币和区块链 T2 之上的智能合约不是最容易理解的琐碎概念,像钱包、地址、工作证明、交易和他们的签名这样的东西,在更广泛的背景下更有意义。受帖子,了解更多关于区块链如何运作的细节。

交易是未确认交易的列表。没什么特别的。在该实现中,交易列表仅包含未确认的交易。一旦交易得到确认,区块链就会将其从清单中删除。

[
    transaction 1,
    transaction 2,
    transaction 3
]

如果出现以下情况,交易将被添加到交易列表中:

  1. 它不在交易列表中;
  2. 事务哈希正确(计算的事务哈希= = transaction . hash);
  3. 所有输入交易的签名都是正确的(交易数据由地址的公钥签名);
  4. 投入交易的总和大于产出交易,这就需要给交易费留有余地;
  5. 这笔交易还没有在区块链进行
  6. 所有投入交易都在区块链中未使用;

块结构:

一个块代表一组事务,包含将其链接到前一个块的信息。

关于 nonce 和用于生成块的工作证明算法的细节将在前面的某个地方描述。

交易结构:

交易包含表示硬币所有者和地址之间的硬币转移的输入和输出列表。输入列表包含现有未用输出交易的列表,并由地址所有者签名。输出列表包含其他地址的金额,包括或不包括所有者地址的更改。

操作员

操作员处理钱包和地址以及交易创建。它大部分操作都与 CRUD 有关。每个运营商都有自己的钱包和地址列表,这意味着它们在节点之间不同步。

钱包结构:

钱包包含一个随机 id 号、密码散列和从该密码生成的秘密。它包含一个密钥对列表,每个密钥对代表一个地址。

地址结构:

地址是以确定性的方式创建的,这意味着对于给定的密码,下一个地址是基于上一个地址(如果是第一个地址,则是密码秘密)创建的。

它使用 EdDSA 算法生成一个秘密公钥对,该密钥对使用一个种子,该种子可以来自密码散列(也是以确定的方式)中随机生成的值,或者来自最后一个秘密密钥。

只有公钥作为用户的地址公开。

矿工

挖掘器获得未决事务的列表,并创建一个包含这些事务的新块。根据配置,每个块中最多有 2 个事务。

组装新积木:

  1. 从未确认交易列表中选择不在区块链中或尚未被选择的候选交易;
  2. 从候选事务列表中获取前两个事务;
  3. 向矿工地址添加包含费用值的新交易,每笔交易 1 satoshi
  4. 将包含 50 个硬币的奖励交易添加到矿工的地址;
  5. 证明为本区块工作;

工作证明:

工作证明是通过计算给定事务哈希的前 14 个十六进制值来完成的,并增加 nonce,直到它达到所需的最低难度级别。每创建 5 个方块,难度增加一个指数值(5 的幂)。大约在创建第 70 个块时,它开始用大约 50 秒的时间生成一个具有此配置的新块。所有这些值都可以调整。

this.blockchain.getDifficulty()返回当前区块链指数难度的十六进制值。这个值是通过每隔 5 个街区给初始难度增加 5 倍来计算的。

block.getDifficulty()返回块散列的前 14 个字节的十六进制值,并将其与当前接受的难度进行比较。

当生成的散列达到所需的难度级别时,它会按原样返回该块。

结节

该节点包含已连接对等体的列表,并在节点之间进行所有数据交换,包括:

  1. 接收新的同伴,并检查如何处理
  2. 接收新块并检查如何处理它
  3. 接收新交易并检查如何处理

该节点重新广播它接收到的每个信息,除非它对此不做任何事情,例如,如果它已经具有对等体/事务/区块链。

一个额外的责任是为一个给定的交易获得许多确认。它通过询问每个节点在其区块链中是否有该事务来做到这一点。

看看这个:

[## conradoqg/naivecoin

naive coin——不到 1500 行代码的加密货币实现

github.com](https://github.com/conradoqg/naivecoin)

就是这样。

黑客中午是黑客如何开始他们的下午。我们是 @AMI 家庭的一员。我们现在接受投稿,并乐意讨论广告&赞助机会。

如果你喜欢这个故事,我们推荐你阅读我们的最新科技故事趋势科技故事。直到下一次,不要把世界的现实想当然!


本站为非盈利网站,作品由网友提供上传,如无意中有侵犯您的版权,请联系删除