使用Solidity和Truffle迁移合约时遇Buffer.from is not a function错误求助
问题描述
我使用Solidity和Truffle开发智能合约,执行迁移命令migrate时触发以下错误:
truffle(develop)> migrate Uncaught TypeError: Buffer.from is not a function at Object.601827 (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/packages/core/lib/commands/migrate/index.js:4:18) at __webpack_require__ (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/webpack/bootstrap:19:1) at Object.853983 (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/packages/core/lib/commands/migrate/runMigrations.js:1:17) at __webpack_require__ (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/webpack/bootstrap:19:1) at Object.523459 (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/packages/migrate/index.js:5:16) at __webpack_require__ (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/webpack/bootstrap:19:1) at Object.120553 (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/packages/config/dist/index.js:12:26) at __webpack_require__ (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/webpack/bootstrap:19:1) at Object.969203 (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/packages/config/dist/configDefaults.js:27:36) at __webpack_require__ (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/webpack/bootstrap:19:1) at Object.200509 (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/packages/provider/index.js:2:14) at __webpack_require__ (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/webpack/bootstrap:19:1) at Object.503283 (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/node_modules/web3/lib/index.js:30:11) at __webpack_require__ (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/webpack/bootstrap:19:1) at Object.727646 (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/node_modules/web3-eth/lib/index.js:29:11) at __webpack_require__ (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/webpack/bootstrap:19:1) at Object.960306 (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/node_modules/web3-eth-ens/lib/index.js:21:11) at __webpack_require__ (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/webpack/bootstrap:19:1) at Object.529321 (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/node_modules/web3-eth-ens/lib/ENS.js:26:19) at __webpack_require__ (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/webpack/bootstrap:19:1) at Object.688894 (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/node_modules/web3-eth-ens/lib/lib/contentHash.js:31:19) at __webpack_require__ (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/webpack/bootstrap:19:1) at Object.378138 (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/node_modules/content-hash/src/index.js:19:16) at __webpack_require__ (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/webpack/bootstrap:19:1) at Object.576883 (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/node_modules/multicodec/src/index.js:16:31) at __webpack_require__ (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/webpack/bootstrap:19:1) at Object.209550 (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/node_modules/multicodec/src/varint-table.js:11:1) at varintEncode (/home/patricia/.nvm/versions/node/v13.14.0/lib/node_modules/truffle/build/webpack:/node_modules/multicodec/src/util.js:33:1)
操作系统为Ubuntu 18.04 TLS,已尝试多个Node.js 13+版本(13以下无法编译合约),所有版本组合均触发相同错误:
Truffle v5.5.24 (core: 5.5.24) Ganache v7.4.0 Solidity v0.5.16 (solc-js) Node v13.14.0 Web3.js v1.7.4 Truffle v5.5.23 (core: 5.5.23) Ganache v7.3.2 Solidity v0.5.16 (solc-js) Node v15.14.0 Web3.js v1.7.4 Truffle v5.5.24 (core: 5.5.24) Ganache v7.4.0 Solidity v0.5.16 (solc-js) Node v16.13.0 Web3.js v1.7.4 Truffle v5.5.24 (core: 5.5.24) Ganache v7.4.0 Solidity v0.5.16 (solc-js) Node v16.16.0 Web3.js v1.7.4 Truffle v5.5.24 (core: 5.5.24) Ganache v7.4.0 Solidity v0.5.16 (solc-js) Node v17.9.1 Web3.js v1.7.4
解决方案
这个错误源于Truffle打包后的代码中Buffer对象未被正确注入,导致Buffer.from无法被识别。以下是几个可行的修复步骤:
1. 全局安装buffer包并注入到Truffle环境
在终端执行以下命令:
npm install -g buffer
然后修改Truffle启动方式,注入Buffer后再进入开发环境:
NODE_OPTIONS="--require buffer" truffle develop
进入环境后执行migrate命令即可。
2. 降级Truffle到稳定版本
部分Truffle 5.5.x版本存在webpack打包兼容性问题,可尝试降级到v5.4.21版本:
npm uninstall -g truffle npm install -g truffle@5.4.21
该版本打包逻辑更稳定,不会出现Buffer相关注入问题。
3. 清理项目本地依赖冲突
若全局与项目本地Truffle版本冲突,可移除本地依赖后重新安装:
rm -rf node_modules package-lock.json npm install
之后使用本地版本执行迁移:
npx truffle migrate
4. 临时修改代码(应急方案)
若以上方法无效,可手动修改Truffle打包后的代码:找到错误路径中的multicodec/src/util.js文件,将Buffer.from替换为new Buffer:
// 原代码 varintEncode = function (num) { var buf = Buffer.from(varintEncode.bytes(num)); // ... } // 修改后 varintEncode = function (num) { var buf = new Buffer(varintEncode.bytes(num)); // ... }
注意:此修改为临时方案,更新Truffle后会被覆盖。
内容的提问来源于stack exchange,提问作者Earthling
相关产品推荐
相关产品推荐

