Blockchain 私有以太坊上的NodeJs区块链

Blockchain 私有以太坊上的NodeJs区块链,blockchain,ethereum,Blockchain,Ethereum,我已经使用NodeJS创建了简单的区块链应用程序。区块链数据文件存储在本地文件系统中。该区块链不涉及采矿区块,也不涉及难度级别 请建议,如果我可以在私有以太坊/hyperledge上托管此应用程序,以及为此需要做哪些更改?下面是我用来创建块的代码 样本成因区块 示例代码(NodeJS) 祝贺您,如果您已经成功地在AWS上安装了Geth。现在我们将讨论如何配置以太坊节点。使用pwd命令确保您位于云服务器上的主目录中,然后创建一个名为which的新文件夹,以创建以太坊区块链的genesis块。可以使

我已经使用NodeJS创建了简单的区块链应用程序。区块链数据文件存储在本地文件系统中。该区块链不涉及采矿区块,也不涉及难度级别

请建议,如果我可以在私有以太坊/hyperledge上托管此应用程序,以及为此需要做哪些更改?下面是我用来创建块的代码

样本成因区块 示例代码(NodeJS)
祝贺您,如果您已经成功地在AWS上安装了Geth。现在我们将讨论如何配置以太坊节点。使用pwd命令确保您位于云服务器上的主目录中,然后创建一个名为which的新文件夹,以创建以太坊区块链的genesis块。可以使用以下命令执行此操作。第一个命令是创建文件夹,将目录更改为文件夹,然后创建名为genesis.json的文件

mkdir mlg ethchain cd mlg ethchain nano genesis.json

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

{
“nonce”:“0xdeadbeefdeadbeef”,
“时间戳”:“0x0”,
“parentHash”:“0x0000000000000000000000000000000000000000000000”,
“外部数据”:“0x0”,
“气体极限”:“0x8000000”,
“难度”:“0x400”,
“混合哈希”:
“0x0000000000000000000000000000000000000000000000000000000000”,“coinbase”:“0x3333333333333333333”,
“alloc”:{
}

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

设计用于以太坊的JS应用程序不会执行任何区块管理。相反,它将与智能合约执行高级和客户端级别的交互,智能合约基本上是一个可在整个网络上使用的类(类似于Java类),其方法由网络保证执行它们的任务。您的JS应用程序本质上是作为客户端调用智能合约的方法,而不关心任何区块生产问题

换句话说,更模糊但可能更熟悉的术语:

  • 客户端:JS应用程序
  • 服务器/后端:智能合约
  • 基础设施/引擎:以太坊
在以太坊上,作为客户机访问智能合约的方式是通过向合约的方法发送JSON格式的RPC调用(因此命名为JSON-RPC)。通过将JSON通过HTTP嵌入到以太坊节点(最好是您自己的节点)来完成通信。在Javascript中,一些库(如web3)为您提供了更高级别的抽象视图,因此您不需要关心JSON-RPC,您可以将契约的方法视为普通Javascript函数

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


与Hyperledger Fabric的交互在概念上类似,只是您对网络公开的HTTP端点执行普通REST调用。我不确定有哪些客户端抽象库可用。

谢谢您的回复。请建议我是否可以按以下方式定义自定义geneses块:[{“索引”:0,“previousHash”:“0”,“时间戳”:1465154705,“事务”:{“id”:“0”,“transactionHash”:“0”,“类型”:“数据”:{“StudInfo”:[{“id”:“studentId”:“parenterId”:“schemeId”:“batchId”:“instructorId”:“trainingId”:“skillId”:“}”)“fromAddress”:“hash”:“816534932c2b7154836da6afc367695e6337db8a921823784c14378abed4f7d7”}]。添加了示例源代码和我用来创建自定义区块链的genesis块。这并不重要,但我认为OP没有提到它们在AWS上的任何地方。第一句话听起来很像是未经请求的广告。我的团队正在致力于通过以太坊兼容的区块链提供安全的私有存储。有一个到c通过我们的网关(或使用您自己的本地网关)连接。通过使用此功能,您只需几步就可以实现分布式存储。如果您正在寻找一个框架来测试您的DApp,我们还实现了一个在事务时间上具有更好性能和显著降低每笔事务成本的。
[{"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"}]
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;
};