Chainlink 導入導致 Truffle 控制台崩潰
GitHub 上的相關問題:https ://github.com/trufflesuite/truffle/issues/3329
如果我編譯我的契約,
truffle compile
然後打開松露控制台,truffle develop
就會發生這種情況:truffle(develop)> version Truffle v5.1.39 (core: 5.1.39) Solidity - ^0.6.0 (solc-js) Node v12.18.2 Web3.js v1.2.1 truffle(develop)> TypeError: Buffer.isBuffer is not a function at Function.writeFileSync [as sync] (/usr/local/lib/node_modules/truffle/build/webpack:/node_modules/write-file-atomic/index.js:213:1) at Configstore.set all [as all] (/usr/local/lib/node_modules/truffle/build/webpack:/node_modules/configstore/index.js:58:1) at new Configstore (/usr/local/lib/node_modules/truffle/build/webpack:/node_modules/configstore/index.js:25:1) at Function.getUserConfig (/usr/local/lib/node_modules/truffle/build/webpack:/packages/config/dist/index.js:171:1) at Object.send (/usr/local/lib/node_modules/truffle/build/webpack:/packages/core/lib/services/analytics/index.js:5:1) at Command.run (/usr/local/lib/node_modules/truffle/build/webpack:/packages/core/lib/command.js:137:1) at Console.interpret (/usr/local/lib/node_modules/truffle/build/webpack:/packages/core/lib/console.js:155:1) at ReplManager.interpret (/usr/local/lib/node_modules/truffle/build/webpack:/packages/core/lib/repl.js:129:1) at bound (domain.js:426:14) at REPLServer.runBound [as eval] (domain.js:439:12) at REPLServer.onLine (repl.js:760:10) at REPLServer.emit (events.js:315:20) at REPLServer.EventEmitter.emit (domain.js:482:12) at REPLServer.Interface._onLine (readline.js:329:10) at REPLServer.Interface._line (readline.js:658:8) at REPLServer.Interface._ttyWrite (readline.js:999:14) at REPLServer.self._ttyWrite (repl.js:851:9) at ReadStream.onkeypress (readline.js:205:10) at ReadStream.emit (events.js:315:20) at ReadStream.EventEmitter.emit (domain.js:482:12) at emitKeys (internal/readline/utils.js:335:14) at emitKeys.next (<anonymous>)
原因似乎是命名衝突**(但不是。嗯……它是但……見下文)**。但作為一個附帶問題:Openzeppelin 和 chainlink 都包含一個 SafeMath 合約:
Compiling your contracts... =========================== > ... > Compiling @chainlink/contracts/src/v0.6/vendor/SafeMath.sol > ... > Compiling @openzeppelin/contracts/math/SafeMath.sol > Duplicate contract names found for SafeMath. > This can cause errors and unknown behavior. Please rename one of your contracts.
如何在不遇到此問題的情況下同時使用 chainlink 和 openzeppelin。這是否只有通過兩個完全獨立的僅通過交易進行通信的合約才能實現?或者我在這裡沒有得到什麼?
更新
所以……實際的問題似乎只是鏈環和/或鬆露。
雖然問題仍然存在,但如何解決這些命名衝突,我意識到這個
Buffer.isBuffer
問題與它無關,但似乎與鏈環/松露本身有關。如果我從 openzeppelin 導入一些東西,比如 Ownable,一切正常。但是,如果我導入 chainlink 並從 ChainlinkClient 繼承,一旦我第一次編譯合約,松露控制台就會崩潰並出現上述異常。
我記錄了這個,見這裡:https ://youtu.be/InNPguD3h6g
事實證明,當您有使用此名稱的契約時,本機節點對象 Buffer 將被覆蓋。一般來說,合約名稱可能與本機節點對象衝突。
GitHub 上的相關問題:https ://github.com/trufflesuite/truffle/issues/3329
目前,當使用 Truffle 控制台時,它會載入所有合約名稱以方便您訪問已部署的合約等。但是,當合約名稱與 Node 原生對象衝突時,這會導致問題;在這種情況下,本機
Buffer
對象。這有點像你有一個名為“String”的契約。這將覆蓋本機String
對象,並且將變得無法訪問。所以希望這是 Truffle 可以解決的問題,也許可以通過為與該上下文中已經存在的名稱衝突的合約名稱提供命名空間。