blockchain之私有(private)以太坊上的 NodeJs 区 block 链

EasonJim 阅读:68 2024-12-31 21:38:35 评论:0

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

请建议,如果我可以在私有(private)以太坊/ super 账本上托管此应用程序,我需要为此做哪些更改?下面是我用来创建 block 的代码。

创世区 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; 
}; 

请您参考如下方法:

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

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

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

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

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

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

猫创世纪.json


标签:NodeJs
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号