You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Remix中传递多个bytes32类型参数时遇报错的技术咨询

在Remix中给Solidity函数传递多个bytes32参数的正确姿势

看起来你在调用setOrder时遇到了两个典型问题,我来帮你拆解一下原因和解决办法:

先分析你遇到的两个错误

  • SyntaxError: Unexpected token in JSON at position 1:这几乎肯定是你在Remix的参数输入框里写了不符合格式的内容,比如多余的方括号、不配对的引号,或者逗号用错了位置。Remix会把你输入的参数解析成JSON,格式错了就会报这个错。
  • Error: invalid bytes32 value (arg=undefined, type="string", value="abc"):这个问题出在bytes32参数的格式上——要么你漏传了某个参数(导致undefined),要么你传的内容无法被正确转换为32字节的bytes类型。比如直接传了太长的字符串,或者传了非字符串/十六进制的值。

正确的传参方式(针对Remix界面)

你的setOrder函数需要7个bytes32类型的参数,在Remix的「Run」面板调用时,你只需要按顺序用逗号分隔每个参数,每个参数用双引号包裹(只要字符串长度≤32字符,Remix会自动帮你转成bytes32):

举个实际的例子,你可以在参数输入框里直接写:

"sunwarr10r", "Shanghai", "Gasoline", "450", "3.1", "1395", "1718123456"

注意:

  • 不要加方括号[](那是数组参数的写法,你的函数是独立的多个参数)
  • 每个参数都要完整,不能漏传任何一个(漏传就会出现undefined的错误)
  • 如果要传超过32字符的内容,需要先把它转成十六进制格式,比如用web3.utils.fromAscii("超长字符串")得到十六进制值,再以0x开头传入,比如0x68656c6c6f776f726c64207468697320697320612076657279206c6f6e6720737472

额外的注意事项

  1. 如果你的参数是数字(比如金额、时间戳),你可以直接用字符串形式传入(比如"1690000000"),Remix会自动转换为bytes32;或者转成十六进制传入也可以,比如0x0000000000000000000000000000000000000000000000000000000064b71700(对应时间戳1690000000)。
  2. 调用前确保你的合约已经正确编译并部署到Remix的测试链(比如JavaScript VM)。
  3. 如果你用代码调用(比如web3.js),要记得用web3.utils.fromAscii()把字符串转成bytes32格式,示例代码如下:
// 假设你已经获取了合约实例和账户
contract.methods.setOrder(
  web3.utils.fromAscii("your-customer"),
  web3.utils.fromAscii("your-location"),
  web3.utils.fromAscii("your-product"),
  web3.utils.fromAscii("300"),
  web3.utils.fromAscii("2.8"),
  web3.utils.fromAscii("840"),
  web3.utils.fromAscii("1718123456")
).send({ from: yourAccountAddress })
.then(receipt => console.log("交易成功:", receipt))
.catch(err => console.error("错误:", err));

内容的提问来源于stack exchange,提问作者sunwarr10r

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:08:58