当前位置: 首页 > 知识库问答 >
问题:

NodeJs区块链在私有以太坊

赵锐
2023-03-14

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

请建议,如果我可以在私有以太坊/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"}]
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个答案

东方华荣
2023-03-14

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

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

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

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

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

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

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

阴凯歌
2023-03-14

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

mkdir mlg ethchain cd mlg ethchain nano genesis。json

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

{
"nonce": "0xdeadbeefdeadbeef",
"timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x0",
"gasLimit": "0x8000000",
"difficulty": "0x400",
"Mixhash": 
"0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x3333333333333333333333333333333333333333",
"alloc": {
}
}
 类似资料:
  • 我已经建立了一个私有区块链,其中2个节点1是miner节点。然而,我们看到许多空矿正在被开采。我尝试了在这个链接上建议的解决方案https://ethereum.stackexchange.com/questions/3151/how-to-make-miner-to-mine-only-when-there-are-pending-transactions.但空矿还是被开采出来了。有人能帮忙吗?

  • 我试图在windows上开发一个简单的去中心化应用程序,使用以太坊的教程-“DAPPS初学者”。它需要三款软件:Alethzers、Mist和Mix。我在不同的层面上有很多问题,因为很明显,他们停止了与Alethzerand Mix的合作。还有其他选择吗?有没有一个解决方案来开发一个好的Dapp,在那里我可以看到区块链最重要的部分?比如采矿和安全系统?

  • 以太坊智能合约是否有可能实现身份证明和电子邮件检查? 是否需要进行外部呼叫,或者一切都可以在区块链中实现。如何添加新身份到区块链,以便以后检查? 我搜索这个话题有一段时间没有成功。

  • 为了跳过信任第三方的需要,并跳过在我的电脑上完全下载区块链,我想在本地服务器上设置一个同步以太网测试网区块链的完整节点,然后将我的电脑连接到这个服务器,使用一个geth实例。 这在某种程度上可能吗?我怎么能那样做?

  • 我是区块链新手。突然我得到一个问题,我们是否可以通过区块号从以太坊区块链访问以前的区块数据。 例如,我创建了一个block1,block2。 block1有数据“apple”,之后我将数据更改为“banana”,因此创建了新的block 2。我知道如果我们调用get data函数,那么它将给出输出香蕉,但是如果我想通过块号as 1访问block1中的数据,如何访问它? 有任何方法可以访问以前块的数

  • 1) 我使用以下命令设置一个专用以太坊网络 2) 创建了一个帐户 3)然后,使用miner.start()命令启动矿工。 过了一段时间,以太被自动添加到我的帐户中,但我的私人网络中没有任何挂起的事务。那么我的矿工们从哪里得到乙醚呢? 尽管我没有在我的网络中实例化任何事务,但一旦启动miner,我就可以看到日志中记录了一些事务。 日志如下: 我的创世区块代码如下: 由于我的网络是隔离的,并且只有一个