阅读更多

3顶
0踩

编程语言

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

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

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

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

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

区块链

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

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

创造一个区块

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

那么我们如何确保数据的完整性呢?每个区块都包含一个基于其内容计算出来的hash。同时也包含了前一个区块的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属性来告知我们这个区块在整个链上的位置。我们同时也生成了一个时间戳,以及需要在区块里存储的一些数据。最后是前一个区块的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;
  }
}

在构造函数里,我通过创建一个包含创世块的数组来初始化整个链。第一个区块是特殊的,因为它不能指向前一个区块。我还添加了下面两个方法:
  • 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!之后我在链上添加了一些区块。区块里可以包含任何你想要放的数据,不过在上面的代码里,我选择添加了一个带有amount属性的对象。

试着操作吧!

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

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

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

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

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

结论

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

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

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

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

问题

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

什么是POW

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

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

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

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

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

实现POW

我们该如何实现呢?我们先来修改我们区块类并在其构造函数中添加Nonce变量。我会初始化它并将其值设置为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。强调一下,这是由难度决定的。所以我们会收到作为参数的难度。
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并且可以被开采了,我们还需要确保我们的区块链支持这种新的行为。让我们先在区块链中添加一个新的属性来跟踪整条链的难度。我会将它设置为2(这意味着区块的hash必须以2个0开头)。
constructor() {
  this.chain = [this.createGenesisBlock()];
  this.difficulty = 2;
}

现在剩下要做的就是改变addBlock()方法,以便在将其添加到链中之前确保实际挖到该区块。下面我们将难度传给区块。
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 }));

如果你运行了上面的代码,你会发现添加新区块依旧非常快。这是因为目前的难度只有2(或者你的电脑性能非常好)。

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

免责声明

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

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

Part3:交易与挖矿奖励

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

重构区块类

现在一个区块拥有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;
  }
}

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

交易类

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

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

调整我们的区块链

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

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

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

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

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

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

  // 推入待处理交易数组
  this.pendingTransactions.push(transaction);
}

挖矿

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

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

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

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

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

地址的余额

在测试我们的代码钱让我们再做一件事!如果能够检查我们区块链上地址的余额将会更好。
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

局限性与结论

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

不过,还是有一些不足:发送货币是,我们不检查发起人是否有足够的余额来实际进行交易。然而,这其实是一件容易解决的事情。我们也没有创建一个新的钱包和签名交易(传统上用公钥/私钥加密完成)。

免责声明 & 源代码

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

该项目的源代码就放在我的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来创建一个简单的区块来演示它们的内部究竟是如何工作的。我将会称之为SavjeeCoin!全文分为三个部分: 实现一个基本的区块 实现 POW 交易与挖矿奖励 实现一个基本的区块 区块 区块是由一个个...

  • 【译】用JavaScript一个区块

    原文:Writing a tiny blockchain in JavaScript 作者:Savjee.be 译者:JeLewine 几乎每个人都听说过像比特币和以太币这样的加密货币,但是只有极少数人懂得隐藏在它们背后的技术。在这篇博客中,我将会用JavaScript来创建一个简单的区块来演示它们的内部究竟是如何工作的。我将会称之为SavjeeCoin! 全文分为三个部分: part1:实现...

  • JavaScript实现简单区块

    JavaScript来实现一个简单的区块。通过实现过程,你将理解区块是什么:区块就是一个分布式数据库,存储结构是一个不断增长的表,表中包含着许多有序的记录。 然而,在通常情况下,当我们谈到区块的时候也会谈起使用区块来解决的问题,这两者很容易混淆。 像流行的比特币...

  • 如何用JavaScript一个区块

    Part1实现一个基本的区块 1.区块 区块是由一个个任何人都可以访问的区块构成的公共数据库。这好像没什么特别的,不过它们有一个有趣的属性:它们是不可变的。一旦一个区块被添加到区块中,除非让剩余的其余区块失效,否则它是不会再被改变的。这就是为什么加密货币是基于区块的原因。你肯定不希望人们在交易完成后再变更交易! 2.创造一个区块区块 是由许许多多的区块接在一起的(...

  • 怎么用JavaScript一个区块

      几乎所有语言都可以编区块开发程序。那么如何用JavaScript一个区块?以下我将要用JavaScript来创建1个简单的区块来演示它们的内部到底是怎样工作的。我将会称作SavjeeCoin!   区块是由一个个所有人能够访问的区块构成的公共数据库。这好像没有什么特别的,不过它们有个有意思的特性:它们是无法变的。要是1个区块被插入到区块中,除非让剩下的另外区块失效,不然这是...

  • 区块:通过演示Demo理解区块运行原理

    打开比特币Demo演示网页区块Demo演示地址,我们可以看到如下页面。 点击开始演示 接下来是BlockChain Demo 2.0的新功能介绍 关于Demo功能区的介绍 并附有JavaScript代码和gitHubDemo地址 显示每个区块存储的信息 介绍区块区块的索引 介绍创建区块时候的时间戳 介绍区块中hash散列加密 介绍区块hash...

  • 区块开发之区块钱包

    引言 “钱包”,大家都不陌生,因为我们每个人身上都会带一个钱包,里面存放了一些钱,一些证件,钥匙等等。而“区块钱包”可能有些人就不是那么了解了。下边,我们就来介绍介绍区块的钱包。 定义 首先说明一点,这是我自己的定义。我觉着可以把区块钱包当做是一个银行账户系统,它管理着你的在区块上的资产,并且可以实现查看余额,转账,收账功,查看交易记录功能,而钱包应用就相当于银行的客户端,来实现...

  • 区块技术实现只需200行javascript代码!

    本文使用JavaScript来实现一个的简单的区块。通过这一实现过程,你将会真正理解 区块是什么:区块就是一个分布式数据库,存储结构是一个不断增长的表, 表中包含着许多有序的记录。 如果你希望马上开始学习以太坊DApp开发,可以访问汇智网提供的出色的在线互动教程: 以太坊DApp实战开发入门 去中心化电商DApp实战开发 然而,在通常情况下,当我...

  • 使用JavaScript实现区块

    BlockChain.js 使用javascript实现区块, 实现了 PoW工作量证明算法挖矿 P2P网络,挖到的区块后广播给其他节点 不涉及交易功能 区块基本概念:一个存储不断增加的有序记录的分布式数据库 这里我使用js实现了最基本的区块和挖矿功能,帮助大家最直接的理解区块区块结构 区块是一种被包含在公开账簿(区块)里的聚合了交易信息的容器数据结构,包括区块头和区块体组成。 ...

  • 区块游戏与博彩的春天来了吗

    很多人说,区块应该落实在应用层面上。 于是,文娱领域应声出现了各种各样的“区块+”:区块+游戏、区块+音乐、区块+影视、区块+偶像IP、区块+社交、区块+视频……新概念不断涌现。 截至目前,区块游戏没有一个公认的概念。区块游戏行业,还处于幼生期,被冠以“行业”也为时过早。 触控科技CEO,区块游戏引擎Cocos-BCX发起人陈昊芝更是发表了“流量游戏或将终结,数字资产时代开...

  • 怎么看区块正规项目与否,区块投资前你应知道这三点

     ?怎么看区块正规项目与否,区块投资前你应知道这三点  区块变得异常火爆,只要跟区块沾边的,身价都会翻倍。网上对于区块的消息与言论也是各有不同,无论是褒义是贬义,在接触区块投资前,都应该知道这几个点,才能更好的进行投资。  一、区块分几个阶段?  区块一共有1.0、2.0、3.0,以比特币为主的数字货币是区块1.0;以太网为心的智能合约平台的是区块2.0;以高性能的区块的应用...

  • 2018年必看:关于区块技术的10本书

    1、区块技术指南 区块专家联袂推荐,资深区块践行者联合撰,从技术层面全面揭示区块技术秘密。涵盖基础概念、架构、底层算法、应用开发、典型的区块解决方案、常见问题等读者*为关心的技术与应用。 2、中国区块产业发展白皮书 乌镇智库发布了《中国区块产业发展白皮书》,主要分析了区块产业的全球和国内发展...

  • 区块Baas底层技术系统区块Baas平台开发

    随着众多区块项目应用落地,比如联盟等之类的应用???项目是有一定的政策扶持,区块Baas平台可以节约成本,BaaS 通常是一个基于云服务的企业级的区块开放平台,可一键 式快速部署接入、拥有去中心化信任机制、支持私有、联盟或多,拥有私有化部署与丰富的运维管理等特色能力。 BAAS平台为我们提供了无门槛玩转区块的技术系统,替我们一键进入区块世界,自助建立区块账簿、自定义制定交易流程...

  • 区块源代码分析(1)

    国外有个大侠用node.js区块项目,一起来学习一下。暂时还没包括POW和P2P协议和如何奖励。接下来几篇将详细叙述POW(nonce),P2P,reward// 引入加密模块const SHA256 = require('crypto-js/sha256');// 定义块class Block {constructor (index,timestamp,data,previousHash=...

  • blockchain 区块200行代码:在JavaScript实现的一个简单的例子

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

  • 区块技术如何上手-DApp

    1.区块参与路径 区块火了这么久,道理听了很多,到底怎么参与? 买几个币就算么?其实也算 从大的维度看,区块的参与路径: 投资:数字货币,挖矿 运营:自媒体,行情,交易所 技术:做技术服务,做区块项目 2.区块技术路径 本文我们只谈技术,那么区块技术又包含哪些呢? 最核心的就三个方向: 做公。立一个伟大的目标,争取做成区块世界的平台或操作系统。比如以太坊,EO...

  • 大年初二已憋不住想代码的心!来来来教你仅用15分钟在以太坊编一个区块Web应用

  • Java简易区块钱包源码ppblock V1.0

    ppblock区块 Java 的简易实现版,自学了一段时间的区块理论知识,自己尝试着一个具有钱包雏形的区块项目,开源出来, 供像我一样想开发区块又不知从何下手初学者参考。目前大部分区块从业者都是从事 DApp 开发,做底层开发的还是比较少,目前也没有很大必要, 不过尝试可以更好的理解区块底层的运行逻辑。本人在开发的过程中最大的体会是,在理论学习的时候觉得区块知识并不复杂, 理...

  • 区块开发教程: 使用Javascript发送数据到区块

    Bitpay开源了它们的Bitcore库包,我们可以使用它来基于Node.js发送信息到区块。该库包能让我们生产比特币交易,却不用花费几天时间下载完整的区块账本。想象比特币和区块如同笔和新的页面纸张,为了在“纸张”(Blockchain)上字你需要墨水。在这个比喻中的“墨水”是指你用来创建交易的比特币。我们在里面一个交易数据被称为“op_return”。一个op_return是操作码,你...

  • 区块原理及区块架构

    区块是什么:1.??? 区块是一种不可篡改的分布式数据库。2.??? 数据库由区块按时间顺序连接而成3.??? 每个区块保存了一个时间段内的所有记录总结为:去中心化,集体维护,不可篡改,数据透明,用户匿名?区块2.0智能合约什么是智能合约:智能合约是有事件驱动的具有状态的,获得多发承认,运行在一个可行,共享的区块账本上,且能够根据预设条件自动处理账本上的交易记录。智能合约的优势是利用程序算...

Global site tag (gtag.js) - Google Analytics 重庆时时彩怎么作弊的