法定人數私人交易不是私人的
我正在努力使用 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) } })
通過@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,我們會這樣做。