【问题标题】:How to verify the Coinbase price oracle signature?如何验证 Coinbase 价格预言机签名?
【发布时间】:2022-08-19 21:34:59
【问题描述】:

Coinbase 价格预言机是一个签名的价格馈送 API。 https://docs.cloud.coinbase.com/exchange/reference/exchangerestapi_getcoinbasepriceoracle

有谁知道如何通过 Coinbase 价格预言机公钥验证价格数据的真实性?

我从 Coinbase 价格预言机 API 获得的价格数据 JSON 如下所示,

{
    \"messages\": [
        \"0x000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000621f0ee800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000a4847d4a00000000000000000000000000000000000000000000000000000000000000006707269636573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034254430000000000000000000000000000000000000000000000000000000000\",
        \"0x000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000621f0ee800000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000b219df400000000000000000000000000000000000000000000000000000000000000006707269636573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034554480000000000000000000000000000000000000000000000000000000000\"
],
\"prices\": {
        \"BAT\": \"0.7477895\",
        \"BTC\": \"44162.34\"
    },
    \"signatures\": [
       \"0xef893d807434364a70faf3dab7f6ba2ef82c74433ae35ac3c4dc60cd1a9b1df467a4d027e5f63676bf12093671504c01a8fb0411415c35c8469332794b949ae7000000000000000000000000000000000000000000000000000000000000001c\",

\"0x21e231317d30edb6d999702c7be5f4506d6d1d097fe50dadf8abfef3d87e1ad93d7695d0b39bed6e35195accc8b6f4abef7f66f6ca92930edc350beaed3be860000000000000000000000000000000000000000000000000000000000000001b\"
],
    \"timestamp\": \"1646202600\"
}

    标签: api signature verify


    【解决方案1】:

    因此,上面的 JSON 结构如下:

    • 时间戳:数据的时间戳(相同的时间戳编码在消息中)
    • 价格:十进制格式的未编码价格(相同数据在消息中编码,此数据未签名)
    • 留言:数量为“n”的以太坊 ABI 编码价格数据消息(对于我正在查看的转储,n=13)
    • 签名:一个数字,与上面的十六进制编码(以“0x ...”开头的字符串)签名相同的“n”

    签名是对相应消息的 keccak256 哈希进行签名(使用 ECDSA)的结果,因此 signature[i]ecdsa_sign(keccak256(message[i]), COINBASE_PRIVATE_KEY)

    可以使用 NodeJS 中 Ethereum web3 库的 web3.accounts.recover 函数(执行 ECDSA 签名恢复)检查签名,如下所示:

    const Web3 = require('web3');
    web3 = new Web3();
    
    const signer_check = web3.eth.accounts.recover(
        web3.utils.keccak256(message), 
        signature, 
        false);
    

    Coinbase Oracle 的公钥似乎是 0xfCEAdAFab14d46e20144F48824d0C09B1a03F2BC,因此如果匹配 signer_check,则签名有效。

    我编写了一些简单但更完整的代码来验证整个消息,以及一个从 Coinbase API 下载当前数据的工具,在 Github 上:https://github.com/barnabee/coinbase-oracle-verify。阅读两个 JavaScript 源文件中的 cmets 以获取更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-14
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      相关资源
      最近更新 更多