我使用 NodeJS 创建了简单的区块链应用程序。区块链数据文件存储在本地文件系统上。这个区块链没有采矿块,没有难度级别。
请建议,如果我可以在私有(private)以太坊/hyperledge 上托管此应用程序,我需要为此做哪些更改?下面是我用于创建块的代码。
示例创世块
[{"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;
};
最佳答案
恭喜,如果您已经到了这一步,您已经成功地在 AWS 上设置了 Geth。现在我们将讨论如何配置以太坊节点。使用 pwd 命令确保您位于云服务器上的主目录中,然后创建一个名为任意名称的新文件夹,以创建以太坊区块链的创世块。您可以使用以下命令执行此操作。第一个命令是创建文件夹,将目录更改为文件夹,然后创建一个名为 genesis.json 的文件。
mkdir mlg-ethchain cd mlg-ethchain nano genesis.json
要创建私有(private)区块链,您需要定义创世区块。创世块通常嵌入在客户端中,但在以太坊中,您可以使用 json 对象配置创世块。将以下 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 命令正确配置。从同一目录输入此命令。
猫创世纪.json
关于blockchain - 私有(private)以太坊上的 NodeJs 区块链,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49768118/