使用 0x.js api 签署订单时得到无效签名

getting Invalid signature while signing an order using 0x.js api

我一直在尝试向 https://api.openrelay.xyz/v0 发送订单 我使用 ZeroEx api 和 @0xproject/connect 来做到这一点。我正在使用 Ropstan 测试网络。

这是我使用的流程和代码:

  1. 首先我创建了一个订单对象:
var order = {
        maker: web3.eth.accounts[0],
        taker: "0x0000000000000000000000000000000000000000",
        makerTokenAddress: "0xa8e9fa8f91e5ae138c74648c9c304f1c75003a8d",
        takerTokenAddress: "0xc778417e063141139fce010982780140aa0cd5ab",
        makerTokenAmount: new BigNumber("1000000000000000000000"),
        takerTokenAmount: new BigNumber("700000000000000000"),
        expirationUnixTimestampSec: parseInt(
            (new Date().getTime()/1000) + duration
        ).toString(),
        salt: ZeroEx.generatePseudoRandomSalt()
    }
  1. 然后将exchangeContractAddress属性添加到订单对象:

order.exchangeContractAddress = zeroEx.exchange.getContractAddress();

  1. 使用 getFeesAsync 方法添加一些其他费用属性:
var feePr = httpClient.getFeesAsync(order).then(function(feeResponse) {
        order.makerFee = new BigNumber(feeResponse.makerFee || 0); 
        order.takerFee = new BigNumber(feeResponse.takerFee || 0); 
        order.taker = feeResponse.takerToSpecify;
        order.feeRecipient = feeResponse.feeRecipient || ZeroEx.NULL_ADDRESS;
    });
  1. 然后尝试签署订单以便我可以将订单发送到 openrelay 服务器:
Promise.all([feePr]).then(() => {
      var orderHash = ZeroEx.getOrderHashHex(order);
      return zeroEx.signOrderHashAsync(orderHash, order.maker, false);
      }).then((signature) => {
      order.ecSignature = signature;
      validSignature = zeroEx.exchange.validateOrderFillableOrThrowAsync(order);
      return order;
      });

这是我面临的问题: 在尝试从元掩码弹出窗口签署订单时,

"zeroEx.signOrderHashAsync"

函数返回 false 而不是返回我应该获得签名的承诺,而不是抛出 "INVALID SIGNATURE" 的错误。我也调试了 signOrderHashAsync 函数,我发现发送的订单哈希和制造商地址已验证。在这个函数中,他们尝试从 orderhash 中获取制造商地址,然后检查它是否与作为参数传递的制造商地址匹配。但他们不匹配。从那里我猜到我生成的订单哈希是不正确的。但我使用的是 ZeroEx.getOrderHashHex 函数,即 api 函数。我很困惑我哪里做错了。你能帮我指导一下我做错了什么吗?

顺便说一句,我在 getOrderHashHex 函数中传递的订单对象是:

{"maker":"0xe60c537190939913291db1296a8758b654519e46","taker":"0x0000000000000000000000000000000000000000","makerTokenAddress":"0xa8e9fa8f91e5ae138c74648c9c304f1c75003a8d","takerTokenAddress":"0xc778417e063141139fce010982780140aa0cd5ab","makerTokenAmount":"1000000000000000000000","takerTokenAmount":"700000000000000000","expirationUnixTimestampSec":"1524573824","salt":"26688534631002041508252861589623551425355865473398394026271856046218606941399","exchangeContractAddress":"0x479cc461fecd078f766ecc58533d6f69580cf3ac","makerFee":"500000000000000000","takerFee":"0","feeRecipient":"0xc22d5b2951db72b44cfb8089bb8cd374a3c354ea"}

这里我通过字符串化来展示。但在代码中我将它作为对象发送。 我得到的顺序哈希是:

"0x7795cee56f6167f6c50f177c08ecc1bffc778456f382b7664d40db42c07eac42"

提前谢谢你。 问候

我已经解决了。打电话时

zeroEx.signOrderHashAsync(orderHash, order.maker, false);

我发送的第三个参数是假的。但是当我使用 metamask 进行签名时,metamask 正在放置他们的签名。所以我不得不传递第三个参数真值。只需更改代码:

zeroEx.signOrderHashAsync(orderHash, order.maker, true);

这解决了我的问题。 :)