使用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. 使用getFeesSync方法添加其他一些费用属性:
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;
      });

这是我面临的问题: 在试图从MetAmask弹出式签署订单时,

" Zeroex.SignOrderHashasync"

fucntion正在返回false,而不是返回我应该获得签名的承诺,而不是抛出"无效签名" 的错误。我还调试了 SIGNORDERHASHASYNC 功能,我发现订单哈希和制造商地址已发送到已验证。在此功能中,他们尝试从orderhash获取制造商地址,然后检查它是否与以参数传递的制造商地址匹配。但是他们不匹配。从我猜测我生成的哈希的顺序不正确。但是我正在使用 Zeroex.getOrderHashhex 函数是API函数。我很困惑我做错了什么。您能帮我指导我做错的地方吗?

顺便

{"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);

我发送第三个参数false。但是,当我使用metAmask进行签名时,metamask正在放置自己的签名。因此,我必须传递第三参数真实值。只需使用以下方式更改代码:

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

这解决了我的问题。:(

最新更新