簡體   English   中英

NodeJs私有以太坊上的區塊鏈

[英]NodeJs blockchain on private ethereum

我使用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"}]

示例代碼(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

要創建私有區塊鏈,您需要定義創世塊。 Genesis塊通常嵌入客戶端,但使用Ethereum,您可以使用json對象配置genesis塊。 將以下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命令正確配置該文件。 從同一目錄輸入此命令。

cat genesis.json

根據我的理解,您的JS代碼會執行某種低級別的塊生成(盡管是以集中/獨立的方式)。 我不確定該代碼的用途,但它不是一個可以“移植到”以太坊或Hyperledger [Fabric]的應用程序,因為這些區塊鏈引擎的作用正是為您實現塊生成邏輯。

設計用於與以太坊合作的JS應用程序不會執行任何塊管理。 相反,它將執行與智能合約的高級和客戶端級交互,智能合約基本上是整個網絡上可用的類(類似於Java類),並且其方法由網絡保證做他們所做的事情。為了。 您的JS應用程序基本上將智能合約的方法稱為客戶端,而無需關心任何塊生產問題。

在其他更模糊但可能更熟悉的術語中:

  • 客戶端:JS應用程序
  • 服務器/后端:智能合約
  • 基礎設施/發動機:以太坊

在以太坊上,您作為客戶端獲得智能合約的方式是通過將JSON中的RPC調用(因此名稱為JSON-RPC)發送到合同的方法。 通過HTTP將JSON嵌入到以太網節點(最好是您自己的節點)來完成通信。 在Javascript中,一些庫(如web3)為您提供了更高級別的抽象視圖,因此您無需關心JSON-RPC,您可以將合約的方法視為正常的Javascript函數。

此外,既然你在詢問私有的以太坊:層次分布的另一個后果是客戶代碼和智能合約不需要關心以太坊網絡是公共網絡還是私有網絡,即共識協議是什么地點。 粗略地說,無論數據庫如何在磁盤上持久存在,它都與SQL查詢或模式保持相同的方式類似。

與Hyperledger Fabric的交互在概念上類似,只是您對網絡公開的HTTP端點進行簡單的REST調用。 我不確定哪些客戶端級抽象庫可用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM