我使用NodeJS创建了简单的区块链应用程序 . 区块链数据文件存储在本地文件系统中 . 没有采矿区块,这个区块链没有任何难度级别 .
请建议,如果我可以在私有的以太它/ hyperledge上托管这个应用程序,以及我需要为此做些什么改变?下面我用于创建块的代码 .
Sample Genesis 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;
};
2 回答
恭喜你,如果你已经到目前为止,你已成功在AWS上设置Geth . 现在我们将讨论如何配置以太坊节点 . 使用pwd命令确保您位于 Cloud 服务器上的主目录中,然后创建一个名为“您想要创建以太坊区块链的创世块”的新文件夹 . 您可以使用以下命令执行此操作 . 第一个命令是创建文件夹,将目录更改到文件夹中,然后创建一个名为genesis.json的文件 .
mkdir mlg-ethchain cd mlg-ethchain nano genesis.json
要创建私有区块链,您需要定义创世块 . Genesis块通常嵌入客户端,但使用Ethereum,您可以使用json对象配置genesis块 . 将以下JSON对象粘贴到您的genesis.json文件中,我们将在下一节中解释每个变量 .
coinbase是挖掘地址的默认地址 . 因为您尚未创建钱包,但只要它是有效的以太坊地址,就可以将其设置为您想要的任何内容 . 困难在于矿工创建新区块的难度 . 出于测试和开发目的,建议您从较低难度开始,然后增加它 . parentHash是父块的哈希,它不存在,因为这是链中的第一个块 . gasLimit是执行交易或将令牌从一个帐户发送到另一个帐户所需的最大气体量 . nonce是该块的随机数 . 这是每个矿工必须猜测以定义块的数字,但对于第一个块,它必须是硬编码的 . 您可以提供任何extraData是extraData部分 . 在alloc部分,您可以在区块链的开头为一些地址分配一些预先设置的令牌或以太网 . 我们不想这样做,所以我们会把它留空 .
确认后,您可以检查文件以确保已使用cat命令正确配置该文件 . 从同一目录输入此命令 .
cat genesis.json
根据我的理解,您的JS代码会执行某种低级别的块生成(尽管是以集中/独立的方式) . 我不确定该代码的用途,但它不是一个可以“移植到”以太坊或Hyperledger [Fabric]的应用程序,因为这些区块链引擎的作用正是为您实现块生成逻辑 .
设计用于与以太坊合作的JS应用程序不会执行任何块管理 . 相反,它将执行与智能合约的高级和客户端级交互,智能合约基本上是整个网络上可用的类(类似于Java类),并且其方法由网络保证做他们所做的事情 . 为了 . 您的JS应用程序基本上将智能合约的方法称为客户端,而无需关心任何块 生产环境 问题 .
在其他更模糊但可能更熟悉的术语中:
客户端:JS应用程序
服务器/后端:智能合约
基础设施/发动机:以太坊
在以太坊上,您作为客户端获得智能合约的方式是通过将JSON中的RPC调用(因此名称为JSON-RPC)发送到 Contract 的方法 . 通过HTTP将JSON嵌入到以太网节点(最好是您自己的节点)来完成通信 . 在Javascript中,一些库(如web3)为您提供了更高级别的抽象视图,因此您无需关心JSON-RPC,您可以将合约的方法视为正常的Javascript函数 .
此外,既然你在询问私有的以太坊:层次分布的另一个后果是客户代码和智能合约不需要关心以太坊网络是公共网络还是私有网络,即共识协议是什么地点 . 粗略地说,无论数据库如何在磁盘上持久存在,它都与SQL查询或模式保持相同的方式类似 .
与Hyperledger Fabric的交互在概念上类似,除了您对网络公开的HTTP endpoints 进行简单的REST调用之外 . 我不确定哪些客户端级抽象库可用 .