pk10免费滚雪球计划 北京pk赛车人工计划 一分钟赛车是官方的吗 北京pk10数学天才揭秘 北京pk10网赌害人案例 北京pk10保罗软件计划 pk10模式长期稳赚6码 北京pk10公式大全 网络赛车赌博是骗局吗 北京pk赛车是不是真的 北京pk10八码公式教程 一无所有怎么白手起家 北京pk10正规平台平台 北京pk赛车历史开结果 pk10买8码杀2码好方法 北京pk10冠亚和值漏洞 正规北京pk赛车彩票 玩北京pk10输钱经历 北京pk10专家在线计划 北京pk赛车正规吗 北京pk10为什么不禁止 北京pk拾赛车有人赢吗 北京pk10代理违法吗 pk10挂机模式真的稳赢 pk10冠军固定公式软件 北京pk10如何看大小 北京pk哈赛车官方网站 北京pk10六码公式教程 pk10去一尾算法举例 北京pk10冠军5码方法
阅读更多

3顶
0踩

编程语言

转载新闻 用JavaScript写一个区块链

2018-04-13 10:53 by 副主编 jihong10102006 评论(2) 有23997人浏览
引用
原文:Writing a tiny blockchain in JavaScript
作者:Savjee.be
译者:JeLewine

几乎每个人都听说过像比特币和以太币这样的?#29992;?#36135;币,但是只有极少数人懂得隐藏在它们背后的技术。在这篇博客中,我将会用JavaScript来创建一个简单的区块链来演示它们的内部究竟是如何工作的。我将会称之为SavjeeCoin!

全文分为三个部分:
part1:实现一个基本的区块链
part2:实现POW
part3:交易与挖矿奖励

Part1:实现一个基本的区块链

区块链

区块链是由一个个任何人都可以访问的区块构成的公共数据库。这好像没什么特别的,不过它们有一个有趣的属性:它们是不可变的。一旦一个区块被添加到区块链中,除非让剩余的其余区块失效,否则它是不会再被改变的。

这就是为什么?#29992;?#36135;币是基于区块链的原因。你肯定不希望人们在交易完成后再变更交易!

创造一个区块

区块链是由许许多多的区块链接在一起的(这听上去好像没毛病..)。链上的区块通过某种方式允许我们检测到是否有人操纵了之前的任何区块。

那么我们如何确保数据的完整?#38405;兀?#27599;个区块都包含一个基于其内容计算出来的hash。同?#24065;?#21253;含了前一个区块的hash。

下面是一个区块类用JavaScript写出来大致的样子:
const SHA256 = require("crypto-js/sha256");
class Block {
  constructor(index, timestamp, data, previousHash = '') {
    this.index = index;
    this.previousHash = previousHash;
    this.timestamp = timestamp;
    this.data = data;
    this.hash = this.calculateHash();
  }

  calculateHash() {
    return SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data)).toString();
  }
}

因为JavaScript中并不支持sha256所以我引入了crypto-js库。然后我定义了一个构造函数来初始化我区块的属性。每一个区块上都被赋予了index属性来告知我们这个区块在整个链上的位置。我们同?#24065;?#29983;成了一个时间戳,以及需要在区块里存储的一些数据。最后是前一个区块的hash。

创造一个链

现在我们可以在Blockchain类中将区块链接起来了!下面是用JavaScript实现的代码:
class Blockchain{
  constructor() {
    this.chain = [this.createGenesisBlock()];
  }

  createGenesisBlock() {
    return new Block(0, "01/01/2017", "Genesis block", "0");
  }

  getLatestBlock() {
    return this.chain[this.chain.length - 1];
  }

  addBlock(newBlock) {
    newBlock.previousHash = this.getLatestBlock().hash;
    newBlock.hash = newBlock.calculateHash();
    this.chain.push(newBlock);
  }

  isChainValid() {
    for (let i = 1; i < this.chain.length; i++){
      const currentBlock = this.chain[i];
      const previousBlock = this.chain[i - 1];

      if (currentBlock.hash !== currentBlock.calculateHash()) {
        return false;
      }

      if (currentBlock.previousHash !== previousBlock.hash) {
        return false;
      }
    }
    return true;
  }
}

在构造函数里,我通过创建一个包含创世块的数组来初始化整个链。第一个区块是特殊的,因为它不能指向前一个区块。?#19968;?#28155;加了下面两个方法:
  • getLatestBlock()返回我们区块链上最新的区块。
  • addBlock()负责将新的区块添加到我们的链上。为此,我们将前一个区块的hash添加到我们新的区块中。这样我们就可以保持整个链的完整性。因为只要我们变更了最新区块的内容,我们就需要重新计算它的hash。当计算完成后,我将把这个区块推进链里(一个数组)。
最后,我创建一个isChainValid()来确保没有人篡改过区块链。它会遍历所有的区块来检查每个区块的hash是否正确。它会通过比较previousHash来检查每个区块是否指向正确的上一个区块。如果一切都没有问题它会返回true否则会返回false。

使用区块链

我们的区块链类已经写完啦,可以真正的开始使用它了!
let savjeeCoin = new Blockchain();
savjeeCoin.addBlock(new Block(1, "20/07/2017", { amount: 4 }));
savjeeCoin.addBlock(new Block(2, "20/07/2017", { amount: 8 }));

在这里我仅仅是创建了一个区块链的实例,并且命名它为SavjeeCoin!之后?#20197;?#38142;上添加了一些区块。区块里可以包含任?#25991;?#24819;要放的数据,不过在上面的代码里,我选择添加了一个带有amount属性的对象。

试着操作吧!

在介绍里?#20197;?#35828;过区块链是不可变的。一旦添加,区块就不可能再变更了。让我们试一下!
// 检查是否有效(将会返回true)
console.log('Blockchain valid? ' + savjeeCoin.isChainValid());

// 现在尝试操作变更数据
savjeeCoin.chain[1].data = { amount: 100 };

// 再次检查是否有效 (将会返回false)
console.log("Blockchain valid? " + savjeeCoin.isChainValid());

?#19968;?#22312;一开始通过运行isChainValid()来验证整个链的完整性。我们操作过任何区块,所以它会返回true。

之后我将链上的第一个(索引为1)区块的数据进行了变更。之后?#20197;?#27425;检查整个链的完整性,发现它返回了false。我们的整个链不再有效了。

结论

这个小栗子还远?#21019;?#21040;完成的程度。它还没有实现POW(工作量证明机制)或P2P网络来与其它矿工来进行交流。

但他确实证明了区块链的工作原理。许多人认为原理会非常复杂,但这篇文章证明了区块链的基本概念是非常容易理解和实现的。

Part2:实现POW(proof-of-work:工作量证明)

在part1中我们用JavaScript创建了一个简单的区块链来演示区块链的工作原理。不过这个实现并不完整,很多人发现依旧可以篡改该系统。没错!我们的区块链需要另一?#21482;?#21046;来抵御攻击。那么让我们来看看我们该如何做到这一点!

问题

现在我们可以很快的创造区块然后非常迅速的将它们添加进我们的区块链中。不过这导致了三个问题:
  • 第一:人们可以快速创建区块然后在我们的链里塞满垃圾。大量的区块会导致我们区块链过载并让其无法使用。
  • 第二:因为创建一个有效的区块太容易了,人们可以篡改链中的某一个区块,然后重新计算所有区块的hash。即使它们已经篡改了区块,他们仍然可以以有效的区块来作为结束。
  • 第三:你可以通过结合上述两个破绽来有效控制区块链。区块链由p2p网络驱动,其中节点会将区块添加到可用的最长链中。所以你可以篡改区块,然后计算所有其他的区块,最后添加多?#25105;?#20320;想要添加的区块。你最后会得到一个最长的链,所有的其它节点都会接受它然后往上添加自己的区块。
显然我们需要一个方案来解决这些问题:POW。

什么是POW

POW是在第一个区块链被创造之前就已经存在的一?#21482;?#21046;。这是一项简单的技术,通过一定数量的计算来防止滥用。工作量是防止垃圾填充和篡改的关键。如果它需要大量的算力,那么填充垃圾就不再值得。

比特币通过要求hash以特定0的数目来实现POW。这也被称之为?#35759;?

不过等一下!一个区块的hash怎么可以改变呢?在比特币的场景下,一个区块包含有各种金融交易信息。我们肯定不希望为了获取正确的hash而混淆了那些数据。

为了解决这个问题,区块链添加了一个nonce值。Nonce是用来查找一个有效Hash的次数。而且,因为无法预测hash函数的输出,因此在获得满足?#35759;?#26465;件的hash之前,只能大量组合尝试。寻找到一个有效的hash(创建一个新的区块)在圈内称之为挖矿。

在比特币的场景下,POW确保每10分钟只能添加一个区块。你可以想象垃圾填充者需要多大的算力来创造一个新区块,他们很难欺骗网络,更不要说篡改整个链。

实现POW

我们该如何实现呢?我们先来修改我们区块类并在其构造函数中添加Nonce变量。?#19968;?#21021;始化它并将其值设置为0。
constructor(index, timestamp, data, previousHash = '') {
  this.index = index;
  this.previousHash = previousHash;
  this.timestamp = timestamp;
  this.data = data;
  this.hash = this.calculateHash();
  this.nonce = 0;
}

我们还需要一个新的方法来增加Nonce,直到我们获得一个有效hash。强调一下,这是由?#35759;?#20915;定的。所以我们会收到作为参数的?#35759;取?
mineBlock(difficulty) {
    while (this.hash.substring(0, difficulty) !== Array(difficulty + 1).join("0")) {
        this.nonce++;
        this.hash = this.calculateHash();
    }
    console.log("BLOCK MINED: " + this.hash);
}

最后,我们还需要更改一下calculateHash()函数。因为目前他还没有使用Nonce来计算hash。
calculateHash() {
  return SHA256(this.index +
    this.previousHash +
    this.timestamp +
    JSON.stringify(this.data) +
    this.nonce
  ).toString();
}

将它们结合在一起,你会得到如下所示的区块类:
class Block {
  constructor(index, timestamp, data, previousHash = '') {
    this.index = index;
    this.previousHash = previousHash;
    this.timestamp = timestamp;
    this.data = data;
    this.hash = this.calculateHash();
    this.nonce = 0;
  }

  calculateHash() {
    return SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data) + this.nonce).toString();
  }

  mineBlock(difficulty) {
    while (this.hash.substring(0, difficulty) !== Array(difficulty + 1).join("0")) {
      this.nonce++;
      this.hash = this.calculateHash();
    }
    console.log("BLOCK MINED: " + this.hash);
  }
}

修改区块链

现在,我们的区块已经拥有Nonce并且可以被开采了,我们还需要确保我们的区块链支持这?#20013;?#30340;行为。让我们先在区块链中添加一个新的属性来跟踪整条链的?#35759;取N一?#23558;它设置为2(这意味着区块的hash必须以2个0开头)。
constructor() {
  this.chain = [this.createGenesisBlock()];
  this.difficulty = 2;
}

现在剩下要做的就是改变addBlock()方法,以便在将其添加到链中之前确保实际挖到该区块。下面我们将?#35759;?#20256;给区块。
addBlock(newBlock) {
  newBlock.previousHash = this.getLatestBlock().hash;
  newBlock.mineBlock(this.difficulty);
  this.chain.push(newBlock);
}

大功告成!我们的区块链现在拥有了POW来抵御攻击了。

测试

现在让我们来测试一下我们的区块链,看看在POW下添加一个新区块会有什么效果。我将会使用之前的代码。我们将创建一个新的区块链实例然后往里添加2个区块。
let savjeeCoin = new Blockchain();

console.log('Mining block 1');
savjeeCoin.addBlock(new Block(1, "20/07/2017", { amount: 4 }));

console.log('Mining block 2');
savjeeCoin.addBlock(new Block(2, "20/07/2017", { amount: 8 }));

如果你运行了上面的代码,你会发现添加新区块依旧非常快。这是因为目前的?#35759;?#21482;有2(或者你的电脑?#38405;?#38750;常好)。

如果你创建了一个?#35759;?#20026;5的区块链实例,你会发现你的电脑会花费大概十秒钟来挖矿。随着?#35759;?#30340;提升,你的防御攻击的保护程度越高。

免责声明

就像之前说的:这绝不是一个完整的区块链。它仍然缺少很多功能(像P2P网路)。这只是为了说明区块链的工作原理。

并且:由于单线程的原因,用JavaScript来挖矿并不快。

Part3:交易与挖矿奖励

在前面两部分我们创建了一个简单的区块链,并且加入了POW来抵御攻击。然而我们在途中也偷了懒:我们的区块链只能在一个区块?#20889;?#20648;一笔交易,而且矿工没有奖励。现在,让我们解决这个问题!

重构区块类

现在一个区块拥有index,previousHash,timestamp,data,hash和nonce属性。这个index属性并不是很有用,事实上我甚至不知道为什么开始我要将它添加进去。所以我把它移除了,同时将data改名为transactions来更语义化。
class Block{
  constructor(timestamp, transactions, previousHash = '') {
    this.previousHash = previousHash;
    this.timestamp = timestamp;
    this.transactions = transactions;
    this.hash = this.calculateHash();
    this.nonce = 0;
  }
}

当我们改变区块类?#20445;?#25105;们也必须更改calculateHash()函数。现在它还在使用老旧的index和data属性。
calculateHash() {
  return SHA256(this.previousHash + this.timestamp + JSON.stringify(this.transactions) + this.nonce).toString();
}

交易类

在区块内,我们将可以存储多笔交易。因此我们还需要定义一个交易类,一边我们可以锁定交易应?#26412;?#26377;的属性:
class Transaction{
  constructor(fromAddress, toAddress, amount){
    this.fromAddress = fromAddress;
    this.toAddress = toAddress;
    this.amount = amount;
  }
}

这个交易例子非常的简单,仅仅包含了发起方(fromAddress)和接受方(toAddress)以及数量。如果有需求,你?#37096;?#20197;在里面加入更多字段,不过这个只是为了最小实现。

调整我们的区块链

当前的最大任务:调整我们的区块链来适应这些新变化。我们需要做的第一件事就是存储待处理交易的地方。

正如你所知道的,由于POW,区块链可以稳定的创建区块。在比特币的场景下,?#35759;?#34987;设置成大约每10分钟创建一个新区块。但是,是可以在创造两个区块之间提交新的交易。

为了做到这一点,首先需要改变我们区块链的构造函数,以便他可以存储待处理的交易。我们还将创造一个新的属性,用于定义矿工获得多少钱作为奖励:
class Blockchain{
  constructor() {
    this.chain = [this.createGenesisBlock()];
    this.difficulty = 5;

    // 在区块产生之间存储交易的地方
    this.pendingTransactions = [];

    // 挖矿回报
    this.miningReward = 100;
  }
}

下一步,我们将调整我们的addBlock()方法。不过我的调整是指删掉并重写它!我们将不再允许人们直接为链上添加区块。相反,他们必须将交易添加至下一个区块中。而且我们将addBlock()更名为createTransaction(),这看起来更语义化:
createTransaction(transaction) {
  // 这里应该有一些校验!

  // 推入待处理交?#36164;?#32452;
  this.pendingTransactions.push(transaction);
}

挖矿

人们现在可以将新的交易添加到待处理交易的列表中。但无论如何,我们需要将他们清理掉并移入实际的区块中。为此,我们来创建一个minePendingTransactions()方法。这个方法不仅会挖掘所?#20889;?#20132;易的新区块,而?#19968;?#20250;向采矿者发送奖励。
minePendingTransactions(miningRewardAddress) {
  // 用所?#20889;?#20132;易来创建新的区块并且开挖..
  let block = new Block(Date.now(), this.pendingTransactions);
  block.mineBlock(this.difficulty);

  // 将新挖的看矿加入到链上
  this.chain.push(block);

  // 重?#20040;?#22788;理交易列表并且发送奖励
  this.pendingTransactions = [
      new Transaction(null, miningRewardAddress, this.miningReward)
  ];
}

请注意,该方法采用了参数miningRewardAddress。如果你开始挖矿,你可以将你的钱包地址传递给此方法。一旦成功挖到矿,系统将创建一个新的交易来给你挖矿奖励(在这个栗子里是100枚币)。

有一点需要注意的是,在这个栗子中,我们将所?#20889;?#22788;理交易一并添加到一个区块中。但实际?#24076;?#30001;于区块的大小是有限制的,所以这是行不通的。在比特币里,一个区块的大小大概是2Mb。如果有更多的交易能够?#26041;?#19968;个区块,那么矿工可以选择哪些交易达成哪些交易不达成(通常情况下费用更高的交易容易获胜)。

地址的余额

在测试我们的代码钱让我们再做一件事!如果能够检查我们区块链上地址的余额将会更好。
getBalanceOfAddress(address){
  let balance = 0; // you start at zero!

  // 遍历每个区块以及每个区块内的交易
  for(const block of this.chain){
    for(const trans of block.transactions){

      // 如果地址是发起方 -> 减少余额
      if(trans.fromAddress === address){
        balance -= trans.amount;
      }

      // 如果地址是接收方 -> 增加余额
      if(trans.toAddress === address){
        balance += trans.amount;
      }
    }
  }

  return balance;
}

测试

好吧,我们已经完成并可以最终一切是否可以正常工作!为此,我们创建了一些交易:
let savjeeCoin = new Blockchain();

console.log('Creating some transactions...');
savjeeCoin.createTransaction(new Transaction('address1', 'address2', 100));
savjeeCoin.createTransaction(new Transaction('address2', 'address1', 50));

这些交易目前都处于等待状态,为了让他们得到证实,我们必须开始挖矿:
console.log('Starting the miner...');
savjeeCoin.minePendingTransactions('xaviers-address');

当我们开始挖矿,我们也会传递一个我们想要获得挖矿奖励的地址。在这种情况下,我的地址是xaviers-address(非常复杂!)。

之后,让我们检查一下xaviers-address的账户余额:
console.log('Balance of Xaviers address is', savjeeCoin.getBalanceOfAddress('xaviers-address'));
// 输出: 0

我的账户输出竟然是0?!等等,为什么?难道我不应该得到我的挖矿奖励么?那么,如果你仔细观察代码,你会看到系统会创建一个交易,然后将您的挖矿奖励添加为新的待处理交易。这笔交易将会包含在下一个区块中。所以如果我们再次开始挖矿,我们将收到我们的100枚硬币奖励!
console.log('Starting the miner again!');
savjeeCoin.minePendingTransactions("xaviers-address");

console.log('Balance of Xaviers address is', savjeeCoin.getBalanceOfAddress('xaviers-address'));
// 输出: 100

局限性与结论

现在我们的区块链已经可以在一个区块上存储多笔交易,并且可以为矿工带来回报。

不过,还是有一些不足:发送货币是,我们不检查发起人是否有足够的余额来实?#24335;?#34892;交易。然而,这其实是一件容易解决的事情。我们也没?#20889;?#24314;一个新的钱包和签名交易(传?#25104;?#29992;公钥/私钥?#29992;?#23436;成)。

免责声明 & ?#21019;?#30721;

我想指出的是,这绝不是一个完整的区块链实现!它仍然缺少很多功能。这只是为了验证一些概念来帮助您来了解区块链的工作原理。

该项目的?#21019;?#30721;就放在我的GitHub
来自: 知乎
3
0
评论 共 2 条 请登录后发表评论
2 楼 it_node 2018-08-24 14:37
web3j,主要是针对java和android程序员围绕web3j库进行区块链以太坊开发的讲解:
Java以太坊实战教程
1 楼 it_node 2018-05-16 08:54
安利个区块链开发新手入门教程:以太坊 DApp 实战开发

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • JavaScript实现简单区块链

    JavaScript来实现一个简单的区块链。通过实现过程,你将理解区块链是什么:区块链就是一个分布式数据库,存储结构是一个不?#26174;?#38271;的链表,链表中包含着许多有序的记录。 然而,在通常情况下,当我们谈到区块链的时候也会谈起使用区块链来解决的问题,这两者很容易混淆。 像流行的比特币和以太坊这样基于区块链的项目就是这样。“区块链”这个术语通常和像交易、智能合约、?#29992;?#36135;币这样的概念紧紧联系在一起。 ...

  • JavaScript一个区块链

    英文:Xavier Decuyper? ?译文:百度外卖前端/JeLewinezhuanlan.zhihu.com/p/34522746几乎每个人都听说过像比特币和以太币这样的?#29992;?#36135;币,但是只有极少数人懂得隐藏在它们背后的技术。在这篇博客中,我将会用JavaScript来创建一个简单的区块链来演示它们的内部究竟是如何工作的。我将会称之为SavjeeCoin!全文分为三个部分:实现一个基本的区块链

  • 用java写一个简单的区块链(下)

    本章目标创建一个简单的钱包。使用我们的区块链发送带签名的交易。这样我们就有自己的?#29992;?#36135;币值得注意的是,这里创建的区块链并不是功能完全的完全适合应用与生产的区块链,相反只是为了帮助你更好的理解区块链的概念。别担心,这实际上是很简单的,但比上一个教程要长!在上一章节,我们已经有了一个基本的区块链,但在区块链?#20889;?#25918;的是一些无用的信息。今天我们将用交易取代这些信息(我们的区块将能够保存多个交易),允许我们...

  • blockchain 区块链200?#20889;?#30721;:在JavaScript实现的一个简单的例子

    了解blockchain的概念很简单(区块链,交易链块):它是分布式的(即不是放置在同一台机器?#24076;?#19981;同的网络设备上的)数据库支持主办记录?#25214;?#22686;长的名单。但是,这也是容易混淆blockchain与我们试?#21450;?#20182;解决了目标 - 在人们心中的那一刻,这个词是相当强烈的交易,合同或智能cryptocurrency的概念有关。 只有在这里blockchain - 是不是一回事比特币,并理解链块的基本知识?#20154;?

  • 20分钟,我用简单的Python代码创建了一个完整的区块链!想学吗?

    作者 |Gerald Nash编译 | 科科、kou、木星这是篇技术文,我们会用Python一步步搭建一个完整的区块链。不过,在此之前,咱们还是?#20154;?#35828;你什么你该学习如何...

  • 通过写一个python区块链原型程序学习区块链

    通过写一个区块链原型程序学习区块链?网上看到一篇翻译文章:https://learnblockchain.cn/2017/10/27/build_blockchain_by_python/?学习一门技术最好的方法就是自己做一个,水平有限,手敲了一遍这个代码,边敲边学,在这个过程中对区块链有了更加全面的认识,同?#24065;?#23398;习了一些python知识。?区块链基本概念区块链一个分布式账本,每个参与挖矿的节点...

  • 只用200行Go代码写一个自己的区块链

    “用不到200行 Go 代码就能实现一个自己的区块链!” 听起来有意思吗?有什么能比开发一个自己的区块链更好的学习实践方法呢?那我们就一起来实践下! 因为我们是一家从事医?#24179;?#24247;领域的科技公司,所以我们采用人类平静时的心跳数据(BPM心?#21097;?#20316;为这篇文章中的示例数据。让我们先来统计一下你一分钟内的心跳数,然后记下来,这个数字可能会在接下来的内容中用到。 通过本文,你将可以做

  • 教你仅用15分钟在以太坊编写一个区块链Web应用

    作者 | 汪晓明? 以太坊是什么 以太坊是一个全新开放的区块链?#25945;ǎ?#23427;允许任何人在?#25945;?#20013;建立和使用通过区块链技术运行的去中心化应用。就像比特币一样,以太坊不受任何人控制,也不归任何人所有——它是一个开源项目,由全球区块链爱好者共同创建。和比特币协议有所不同的是,以太坊的设计十分灵活,极具适应性。 比特币 vs 以太坊 如果对比特币和以

  • 自己手动用javascript一个区块链

    史上最简单,几十?#20889;?#30721;,自己手动用javascript一个区块链

  • 【译】自己动手写区块链

    目前大多数对于区块链的文章都是停留在概念性的描述,大?#21015;?#25196;其颠覆性,本文则反其道行之,以一个程序员的视角,通过300?#20889;?#30721;,快速实现了一个区块链原型。虽然没有覆盖区块链的全部内容(如Merkle树),但对于理解区块链的核心技术仍大有裨益。 —-译者注 能够点进这篇文章,说明你也像我一样对?#29992;?#36135;币的兴起十分激动,并想了解?#29992;?#36135;币的支撑技术—区块链是如何工作的。 但理解区块链并不那么轻松,至少对...

  • 【译】用JavaScript一个区块链

    几乎每个人都听说过像比特币和以太币这样的?#29992;?#36135;币,但是只有极少数人懂得隐藏在它们背后的技术。在这篇博客中,我将会用JavaScript来创建一个简单的区块链来演示它们的内部究竟是如何工作的。我将会称之为SavjeeCoin! 全文分为三个部分: part1:实现一个基本的区块链 part2:实现POW part3:交易与挖矿奖励 Part1:实现一个基本的区块链 区块链 区块链是由一个...

  • JavaScript一个区块链(源码)

  • 用c语言实现的简单区块链

    用c语言实现的简单的区块链。包含交易的生成,区块的生成以及散?#23567;?#19981;包含proof of the work 部分。

  • 用Java创建你第一个区块链-part1

    ??????比特币是区块链中最重要的一个应用,在比特币大涨之后又出现了很多币种,比如?#31243;?#24065;、以太币等等,更在2014年以太坊的出现,市面上出现了各种各样的币种以及ICO,在此先简单介绍一下以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系?#24120;?#20174;数据资料中显示,以太坊?#25317;?#29983;到2017年5月,全球已有了200多个以太坊应用的诞生。以太坊是一个?#25945;?#21644;一种编程语言,...

  • 自己动手写区块链(Java版)

    2018年开始区块链真是火啊。一夜暴富的例子一直在传说。今天我们就自己动手写一个基本的区块链。 先简单的说一下区块链是个什么(相信你早就知道了)。 区块链就是一个链表。把一堆区块串起来就是区块链。每个block有自己的数字签名(就是一串不规则看起来叼叼的字符串),同时包含有上一个block的数字签名,然后包含一些其他的data。 大体就长这样: ? &amp;gt;&amp;gt;&amp;gt;阅读全文...

  • javascript

    javascript写的树形结构用javascript写的树形结构用javascript写的树形结构用javascript写的树形结构用javascript写的树形结构用javascript写的树形结构

  • 一个JavaScript写的俄罗斯方块

    一个JavaScript写的俄罗斯方块

  • 使用 Python 一步步搭建自己的区块链

    你是否会和我一样,对?#29992;?#25968;字货币底层的区块链技术非常?#34892;?#36259;,特别想了解他们的运行机制。 但是学习区块链技术并非一帆风?#24120;?#25105;看多了大量的视频教程还有各种课程,最终的感觉就是真正可用的实战课程太少。 我?#19981;?#22312;实践中学习,尤其?#19981;?#19968;代码为基础去了解整个工作机制。如果你我一样?#19981;?#36825;种学习方式,当你学完本教程?#20445;?#20320;将会知道区块链技术是如何工作的。 写在开始之前 记住,区块链一个

  • javascript日期控件

    javascript写的一个控件

Global site tag (gtag.js) - Google Analytics 玩北京pk10久玩必输