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

标签 blockchain ethereum

我使用 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

关于blockchain - 私有(private)以太坊上的 NodeJs 区 block 链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49768118/

相关文章:

blockchain - 从 web3js 中的 Solidity 函数访问多个返回值(a、b、c)

ethereum - 如何获取交易(非合约)的所有事件?

javascript - super 账本 Composer : Error: Could not find any functions to execute for transaction

java - HyperLedger Fabric 网络 Chaincode 实例化错误

javascript - 格式错误: invalid address

ethereum - 如何在 Solidity 中实现自毁模式?

azure - 以太坊联盟区 block 链 - 无法解锁 coinbase 帐户 - Microsoft Azure

node.js - 币安测试网部署错误 : Could not create addresses from your mnemonic or private key(s)

blockchain - 安全帽测试 : <functionName> is not a function

ethereum - 如何通过 Solidity 中的多个属性查询结构?