Web3js

法定人數私人交易不是私人的

  • February 6, 2020

我正在努力使用 Quorum 的 privateFor 選項來強制執行隱私。

我在 Azure blockchian 服務中配置了一個具有 3 個節點的聯盟。我使用以下程式碼從 node2 privateFor node1 部署智能合約,但 node3 也可以看到合約並執行功能(例如在 remix 中)。我無法弄清楚我做錯了什麼。

const Web3 = require('web3')
const rpcURL = "https://node2.blockchain.azure.com:3200/<AccessKey>"
const web3 = new Web3(rpcURL)
const EthereumTx = require('ethereumjs-tx').Transaction
const account = '<myAccountAddress>'
const privateKey = Buffer.from('<myPrivateKey>', 'hex')

const contractByteCode = '<contractbByteCode>'

const Common = require('ethereumjs-common').default

const customCommon = Common.forCustomChain(
   'mainnet',
   {
       name: 'my-network',
       chainId: <myChainId>, //from genesis
   },
   'constantinople',
);

web3.eth.getTransactionCount(account, (err, txCount) => {
   if (err!=null) {console.log('error executing web3.eth.getTransactionCount: ', err)}
   else{
       console.log('txCount: ',txCount)

       const txObject = {
           nonce: web3.utils.toHex(txCount),
           gasLimit: web3.utils.toHex(3000000),
           gasPrice: web3.utils.toHex(web3.utils.toWei('0', 'gWei')),
           data: contractByteCode,
           privateFor: ['<node1publickey>']
       }

       const tx = new EthereumTx(txObject,{common: customCommon})

       tx.sign(privateKey)

       const serializedTransaction = tx.serialize()
       const raw = '0x' + serializedTransaction.toString('hex')

       web3.eth.sendSignedTransaction(raw)
       .on('transactionHash',(hash) => {
           console.log('txHash:', hash)
       })
       .on('receipt',(receipt) => {
           console.log('receipt', receipt)
       })
       .on('error', console.error)
   }

})

Azure 區塊鏈服務概述頁面如下所示。我沒有看到任何提及交易成員或星座或 Tessera : 在此處輸入圖像描述

通過@fixanoid添加答案,

我從 Azure 區塊鏈服務團隊得到以下回复“目前我們不支持發送簽名的私人交易,因為我們沒有暴露 tessera 埠來發送私人交易,所以 web3.sendRawPrivateTransaction 將不起作用。要發送私人交易,你必須使用 web3 sendTransaction 函式不是用於公共交易的 sendSignedTransaction。”

我已經嘗試過了,而且效果很好。我使用了由 Azure 區塊鏈服務在交易節點上創建的預設帳戶。我在節點上創建了一個新帳戶,它也有效。程式碼更簡單,因為使用私鑰顯式簽名和使用 ethereumjs-common 庫定義自定義鏈的複雜性消失了。

const Web3 = require('web3')
const rpcURL = "https://node2.blockchain.azure.com:3200/<AccessKey>"
const web3 = new Web3(rpcURL)
const account = '<myAccount>'
const accountPassword = '<myPassword>'

const contractByteCode = '<contractByteCode>'

web3.eth.personal.unlockAccount(account, accountPassword, 60)

web3.eth.getTransactionCount(account, (err, txCount) => {
   if (err!=null) {console.log('error executing web3.eth.getTransactionCount: ', err)}
   else{
       console.log('txCount: ',txCount)

       const txObject = {
           from: account,
           nonce: web3.utils.toHex(txCount),
           gas: web3.utils.toHex(3000000),
           gasPrice: web3.utils.toHex(web3.utils.toWei('0', 'gWei')),
           data: contractByteCode,
           privateFor: ['<nodepublickey>']
       }

       web3.eth.sendTransaction(txObject)
       .on('transactionHash',(hash) => {
           console.log('txHash:', hash)
       })
       .on('receipt',(receipt) => {
           console.log('receipt', receipt)
       })
       .on('error', console.error)
   }

})

您的程式碼是發送外部簽名的公共 txn 的一個很好的範例,但它不是私有 txn,因此該合約在鏈的所有節點上都可用。

發送私有 txn 有點複雜,並且涉及一組額外的密鑰和伺服器——這些屬於您網路上的私有事務管理器 (Tessera)。我們在這裡確實有一組範例:https ://github.com/jpmorganchase/quorum.js/tree/master/7nodes-test ,您可以閱讀https://github.com/jpmorganchase/quorum.js以了解什麼如果您希望避免使用 quorum.js,我們會這樣做。

引用自:https://ethereum.stackexchange.com/questions/79644