NodeJs私有领土上的区块链

时间:2018-04-11 06:37:11

标签: blockchain ethereum

我使用NodeJS创建了简单的区块链应用程序。区块链数据文件存储在本地文件系统中。没有采矿区块,这个区块链没有任何难度级别。

请建议,如果我可以在私有的以太它/ hyperledge上托管这个应用程序,以及我需要为此做些什么改变?我在下面用于创建块的代码。

Sample Genesis Block

[{"index":0,"previousHash":"0","timestamp":1465154705,"transaction":{"id":"0","transactionHash":"0","type":"","data":{"StudInfo":[{"id":"","studentId":"","parenterId":"","schemeId":"","batchId":"","instructorId":"","trainingId":"","skillId":""}]},"fromAddress":""},"hash":"816534932c2b7154836da6afc367695e6337db8a921823784c14378abed4f7d7"}]

示例代码(NodeJS)

var generateNextBlock = (blockData) => {
    var previousBlock = getLatestBlock();
    var nextIndex = previousBlock.index + 1;
    var nextTimestamp = new Date().getTime() / 1000;
    var nextHash = calculateHash(nextIndex, previousBlock.hash, nextTimestamp, blockData);

    return new Block(nextIndex, previousBlock.hash, nextTimestamp, blockData, nextHash);
};

var calculateHashForBlock = (block) => {
    return calculateHash(block.index, block.previousHash, block.timestamp, block.transaction);
};

var calculateHash = (index, previousHash, timestamp, transaction) => {
    return CryptoJS.SHA256(index + previousHash + timestamp + transaction).toString();
};

var addBlock = (newBlock) => {
    if (isValidNewBlock(newBlock, getLatestBlock())) {
        blockchain.push(newBlock);
        blocksDb.write(blockchain);
    }
};

var isValidNewBlock = (newBlock, previousBlock) => {
    if (previousBlock.index + 1 !== newBlock.index) {
        console.log('invalid index');
        return false;
    } else if (previousBlock.hash !== newBlock.previousHash) {
        console.log('invalid previoushash');
        return false;
    } else if (calculateHashForBlock(newBlock) !== newBlock.hash) {
        console.log(typeof (newBlock.hash) + ' ' + typeof calculateHashForBlock(newBlock));
        console.log('invalid hash: ' + calculateHashForBlock(newBlock) + ' ' + newBlock.hash);
        return false;
    }
    return true;
};

2 个答案:

答案 0 :(得分:4)

恭喜你,如果你已经做到这一点,你已经在AWS上成功设置了Geth。现在我们将讨论如何配置以太坊节点。使用pwd命令确保您位于云服务器上的主目录中,然后创建一个名为“您想要创建以太坊区块链的创世块”的新文件夹。您可以使用以下命令执行此操作。第一个命令是创建文件夹,将目录更改到文件夹中,然后创建一个名为genesis.json的文件。

mkdir mlg-ethchain cd mlg-ethchain nano genesis.json

要创建私有区块链,您需要定义创世块。 Genesis块通常嵌入客户端,但使用Ethereum,您可以使用json对象配置genesis块。将以下JSON对象粘贴到您的genesis.json文件中,我们将在下一节中解释每个变量。



{
"nonce": "0xdeadbeefdeadbeef",
"timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x0",
"gasLimit": "0x8000000",
"difficulty": "0x400",
"Mixhash": 
"0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x3333333333333333333333333333333333333333",
"alloc": {
}
}




coinbase是挖掘地址的默认地址。因为您尚未创建钱包,但只要它是有效的以太坊地址,就可以将其设置为您想要的任何内容。困难在于矿工创建新区块的难度。出于测试和开发目的,建议您从较低难度开始,然后增加它。 parentHash是父块的哈希,它不存在,因为这是链中的第一个块。 gasLimit是执行交易或将令牌从一个帐户发送到另一个帐户所需的最大气体量。 nonce是该块的随机数。这是每个矿工必须猜测以定义块的数字,但对于第一个块,它必须是硬编码的。您可以提供任何extraData是extraData部分。在alloc部分,您可以在区块链的开头为某些地址分配一些预先设置的令牌或以太网。我们不想这样做,所以我们会把它留空。

确认后,您可以检查文件以确保已使用cat命令正确配置。从同一目录输入此命令。

cat genesis.json

答案 1 :(得分:0)

据我了解,您的JS代码执行某种低级块生成(尽管以集中/独立方式进行)。我不确定该代码的用途,但它不是您可以“移植”到以太坊或Hyperledger [Fabric]的应用程序,因为这些区块链引擎的作用正是为您实现块生成逻辑。 / p>

旨在与以太坊一起使用的JS应用程序不会执行任何块管理。相反,它将使用智能合约执行高层和客户端层的交互,该合约基本上是整个网络上可用的类(类似于Java类),并且网络保证了其方法来执行其工作。为了。本质上,您的JS应用会以客户端的身份调用智能合约的方法,而无需关心任何批量生产问题。

换句话说,更模糊但也许更熟悉的术语:

  • 客户端:JS应用
  • 服务器/后端:智能合约
  • 基础设施/引擎:以太坊

在以太坊上,作为客户端获得智能合约的方式是通过将JSON中的RPC调用(因此称为JSON-RPC)发送到合约的方法。通过将JSON通过HTTP嵌入到以太坊节点(最好是您自己的节点)来完成通信。在Javascript中,一些库(例如web3)为您提供了更高级别的抽象视图,因此您无需关心JSON-RPC,并且可以将合同的方法视为正常的Javascript函数。

此外,由于您正在询问私有以太坊:分层分布的另一个结果是,客户端代码和智能合约不需要关心以太坊网络是公共的还是私有的,即共识是什么协议到位。进行大胆的类比,类似于无论数据库如何持久存储在磁盘上,SQL查询或模式都保持不变。

与Hyperledger Fabric的交互在概念上类似,不同之处在于,您对网络公开的HTTP终结点进行普通的REST调用。我不确定有哪些客户端级别的抽象库可用。