Base58は、BitcoinとSolanaで一般的に使用されるバイナリをテキストにエンコードする方式です。Base64エンコーディング方式と同じ58文字のアルファベットを使用しますが、数字と見た目が似ている文字0、O、I、lを省略しています。これにより、混乱を避けることができます。

Base58エンコードされた文字列をVARBINARY値に変換するには、from_base58関数を使用できます。例えば、次のクエリは、Base58エンコードされた文字列3DZBMRwnSU8fをVARBINARY値に変換します。

SELECT
from_base58('3DZBMRwnSU8f')
-- results in VARBINARY 0x030094357700000000

Base58エンコードされた文字列をVARBINARY値に変換できるようになったので、bytearray_to_bigint関数を使用してVARBINARY値をBIGINT値に変換できます。ただし、さらに考慮する必要があります。

  1. デコードされたVARBINARY値には、BIGINT値に変換したいデータだけでなく、Solanaプログラムのどの関数が呼び出されたかを示すディスクリミネータも含まれています。VARBINARY値をBIGINT値に変換する前に、このディスクリミネータを取り除く必要があります。これは、bytearray_substring関数を使用して行います。
  2. Solanaはリトルエンディアンバイトオーダーを使用しているため、VARBINARY値をBIGINT値に変換する前にバイトオーダーを逆にする必要があります。これは、bytearray_reverse関数を使用して行います。
SELECT
bytearray_to_bigint(bytearray_reverse(bytearray_substring(from_base58('3DZBMRwnSU8f'), 2, 8))) as token_sold_amount
-- results in BIGINT 2000000000

実際のシナリオでは、これらの関数を使用して、Solanaのスワップトランザクションでトークン量を表すBase58エンコードされた文字列をデコードします。以下はその例です。

SELECT
sp.call_inner_instructions[1].data
,from_base58(sp.call_inner_instructions[1].data) as first_step
,bytearray_substring(from_base58(sp.call_inner_instructions[1].data), 2, 8) as second_step
,bytearray_reverse(bytearray_substring(from_base58(sp.call_inner_instructions[1].data), 2, 8)) as third_step
,bytearray_to_bigint(bytearray_reverse(bytearray_substring(from_base58(sp.call_inner_instructions[1].data), 2, 8))) as decoded_amount
FROM whirlpool_solana.whirlpool_call_swap sp
WHERE sp.account_whirlpool = '7qbRF6YsyGuLUVs6Y1q64bdVrfe4ZcUUz1JRdoVNUJnm'
AND call_tx_id = '44kmeC1edSfp21K5kKNVViJvLHG8XQqqu3KbHsrYcYZGmopWwBgP48c9u1DRBMGtQcbvyxd2TT8syY7ZvwpHqkhF'
and call_block_slot = 187701147

DuneSQLでのクエリは次のようになります[→](https://dune.com/queries/2846422?_gl=1*1fc8kyg*_ga*MTM0NTczNDcyMS4xNzEzNDUwMjk1*_ga_H1G057R0KN*MTcxNTc4NDkzNC4xNi4xLjE3MTU3OTU1MDMuMC4wLjA.)

関数

from_base58()

from_base58(varchar) → varbinary

Base58エンコードされた文字列をVARBINARY値に変換します。

SELECT
from_base58('3DZBMRwnSU8f')
-- results in VARBINARY 0x030094357700000000

to_base58()

to_base58(varbinary) → varchar

VARBINARY値をBase58エンコードされた文字列に変換します。

SELECT
to_base58(0x030094357700000000)
-- results in base58 encoded varchar 3DZBMRwnSU8f