0

これは私を困惑させているので、助けを期待しています...

FTX.com でユーザー アカウントと API 資格情報を作成しました。

ここで詳しく説明されている興味深い認証セットアップがあります: https://docs.ftx.com/?python#authentication

Python、JavaScript、および C# のコード例のみが提供されていますが、RoR アプリに統合を実装する必要があります。

GET 呼び出しと POST 呼び出しの両方の例も提供するリンクを次に示します: https://blog.ftx.com/blog/api-authentication/

私は使用しています:

ruby '3.0.1'

gem 'rails', '~> 6.1.4', '>= 6.1.4.1'

また、

require 'uri'
require 'net/https'
require 'net/http'
require 'json'

次のように、GET呼び出しで認証が機能するようになりました。

def get_market
 get_market_url = 'https://ftx.com/api/markets/BTC-PERP/orderbook?depth=20'

 api_get_call(get_market_url)
end
def api_get_call(url)
    ts = (Time.now.to_f * 1000).to_i

    signature_payload = "#{ts}GET/api/markets"

    key = ENV['FTX_API_SECRET']
    data = signature_payload
    digest = OpenSSL::Digest.new('sha256')

    signature = OpenSSL::HMAC.hexdigest(digest, key, data)

    headers = {
      'FTX-KEY': ENV['FTX_API_KEY'],
      'FTX-SIGN': signature,
      'FTX-TS': ts.to_s
    }
    uri = URI.parse(url)
    http = Net::HTTP.new(uri.host, uri.port)
    http.read_timeout = 1200
    http.use_ssl = true
    rsp = http.get(uri, headers)
    JSON.parse(rsp.body)
  end

これはうまく機能し、正しい応答が得られます。

=>
{"success"=>true,
"result"=>
{"bids"=>
[[64326.0, 2.0309],
...
[64303.0, 3.1067]],
"asks"=>
[[64327.0, 4.647],
...
[64352.0, 0.01]]}}

ただし、POST 呼び出しに対して正しく認証できないようです (私が知る限り、指示に正しく従っているにもかかわらず)。私は以下を使用します:

  def create_subaccount
    create_subaccount_url = 'https://ftx.com/api/subaccounts'

    call_body =
      {
        "nickname": "sub2",
      }.to_json

    api_post_call(create_subaccount_url, call_body)
  end
  def api_post_call(url, body)
    ts = (Time.now.to_f * 1000).to_i

    signature_payload = "#{ts}POST/api/subaccounts#{body}"

    key = ENV['FTX_API_SECRET']
    data = signature_payload
    digest = OpenSSL::Digest.new('sha256')

    signature = OpenSSL::HMAC.hexdigest(digest, key, data)

    headers = {
      'FTX-KEY': ENV['FTX_API_KEY'],
      'FTX-SIGN': signature,
      'FTX-TS': ts.to_s
    }

    uri = URI.parse(url)
    http = Net::HTTP.new(uri.host, uri.port)
    http.read_timeout = 1200
    http.use_ssl = true
    request = Net::HTTP::Post.new(uri, headers)
    request.body = body
    response = http.request(request)

    JSON.parse(response.body)
  end

また、直接request[]経由でヘッダーを渡そうとしました:

  def api_post_call(url, body)
    ts = (Time.now.to_f * 1000).to_i

    signature_payload = "#{ts}POST/api/subaccounts#{body}"

    key = ENV['FTX_API_SECRET']
    data = signature_payload
    digest = OpenSSL::Digest.new('sha256')

    signature = OpenSSL::HMAC.hexdigest(digest, key, data)

    uri = URI.parse(url)
    http = Net::HTTP.new(uri.host, uri.port)
    http.read_timeout = 1200
    http.use_ssl = true
    request = Net::HTTP::Post.new(uri)
    request['FTX-KEY'] = ENV['FTX_API_KEY']
    request['FTX-SIGN'] = signature
    request['FTX-TS'] = ts.to_s
    request.body = body
    response = http.request(request)

    JSON.parse(response.body)
  end

これはエラー応答です: => {"success"=>false, "error"=>"Not logged in: Invalid signature"}

私の感じでは、問題はここで HMAC を介して署名を生成する前にsignature_payloadに本体を追加することのどこかにある..?: signature_payload = "#{ts}POST/api/subaccounts#{body}"

これを考えると、#{body}ここを省略した場合、次のようになります。 signature_payload = "#{ts}POST/api/subaccounts" 応答は次のとおりです。 => {"success"=>false, "error"=>"Missing parameter nickname"}

さまざまなnet/httpsの例を使用して POST 呼び出しメソッドの設定を何度か繰り返してみましたが、うまくいきませんでした... FTX サポートにも連絡しましたが、応答がありませんでした。

ここで私が間違っていることについて誰かが洞察を持っていれば、本当に感謝していますか?

4

0 に答える 0