使用 0x.js api 签署订单时得到无效签名
getting Invalid signature while signing an order using 0x.js api
我一直在尝试向 https://api.openrelay.xyz/v0 发送订单
我使用 ZeroEx api 和 @0xproject/connect 来做到这一点。我正在使用 Ropstan 测试网络。
这是我使用的流程和代码:
- 首先我创建了一个订单对象:
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()
}
- 然后将exchangeContractAddress属性添加到订单对象:
order.exchangeContractAddress = zeroEx.exchange.getContractAddress();
- 使用 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;
});
- 然后尝试签署订单以便我可以将订单发送到 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);
这解决了我的问题。 :)
我一直在尝试向 https://api.openrelay.xyz/v0 发送订单 我使用 ZeroEx api 和 @0xproject/connect 来做到这一点。我正在使用 Ropstan 测试网络。
这是我使用的流程和代码:
- 首先我创建了一个订单对象:
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() }
- 然后将exchangeContractAddress属性添加到订单对象:
order.exchangeContractAddress = zeroEx.exchange.getContractAddress();
- 使用 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; });
- 然后尝试签署订单以便我可以将订单发送到 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);
这解决了我的问题。 :)