見出し画像

test-validator で USDC をミントする

Solana の test-validator ではメインネットからアカウントやプログラムをコピーして使うことができます。

Solana ではアクセスするアカウントがトランザクションで明示されているため、トランザクションで使われるアカウントさえコピーしてしまえば、実行環境を再現することが容易です。

USDCのミントアカウントである EPjF…Dt1v を test-validator で使用するには、メインネットからアカウントのデータを JSON に保存し、それを test-validator に読み込ませます。

bash-3.2$ solana account -u m --output json-compact --output-file USDC_mint.json EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
{"account":{"data":["AQAAABzjWe1aAS4E+hQrnHUaHF6Hz9CgFhuchf/TG3jN/Nj2VQqkBEbjEQAGAQEAAAAqnl7btTwEZ5CY/3sSZRcUQ0/AjFYqmjuGEQXmctQicw==","base64"],"executable":false,"lamports":146540071068,"owner":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch":349},"pubkey":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"}
Wrote account to USDC_mint.json

bash-3.2$ solana-test-validator --account EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v USDC_mint.json --reset
Ledger location: test-ledger
Log: test-ledger/validator.log
⠠ Initializing...
⠒ Initializing...
Identity: DPTVjrZjoSYQDUZaqjVFAqDvEfUVeQsQPhNAYdgxZsNq
Genesis Hash: 22UWWCtgfPAWf1BkU4Qt5sygGdixJ8pEBzP5mH2rhhQ3
Version: 1.9.3
Shred Version: 47657
Gossip Address: 127.0.0.1:1024
TPU Address: 127.0.0.1:1027
JSON RPC URL: http://127.0.0.1:889900:00:45 | Processed Slot: 93 | Confirmed Slot: 93 | Finalized Slot: 61 | Full Snapshot Slot: - | Incremental Snapshot Slot: - | Transactions: 93 | ◎499.999540000

ミントができないという課題

これで test-validator 上に USDC のミントアカウントが配置されました。

bash-3.2$ solana account -u l EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v

Public Key: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
Balance: 146.540071068 SOL
Owner: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
Executable: false
Rent Epoch: 349
Length: 82 (0x52) bytes
0000:   01 00 00 00  1c e3 59 ed  5a 01 2e 04  fa 14 2b 9c   ......Y.Z.....+.
0010:   75 1a 1c 5e  87 cf d0 a0  16 1b 9c 85  ff d3 1b 78   u..^...........x
0020:   cd fc d8 f6  55 0a a4 04  46 e3 11 00  06 01 01 00   ....U...F.......
0030:   00 00 2a 9e  5e db b5 3c  04 67 90 98  ff 7b 12 65   ..*.^..<.g...{.e
0040:   17 14 43 4f  c0 8c 56 2a  9a 3b 86 11  05 e6 72 d4   ..CO..V*.;....r.
0050:   22 73        

とはいえ、これだけでは USDC のミントはできません。

メインネットで私達が USDC を勝手にミントできないように、ミント権限をもったアカウントでなければミントはできません。

単にアカウントをコピーしただけでは、ミント権限の情報もコピーされるため、ミントできないのです。

bash-3.2$ spl-token mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v 10000
Minting 10000 tokens
  Token: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
  Recipient: FbQdXCQgGQYj3xcGeryVVFjKCTsAuu53vmCRtmjQEqM5
RPC response error -32002: Transaction simulation failed: Error processing Instruction 0: custom program error: 0x4 [5 log messages]

ミント権限

ミント権限はアカウントのなかの mint_authority に保存されています。
5 バイト目から始まるフィールドです。

この mint_authority を自分のウォレットにすれば、mint_authority としてトランザクションへの署名が可能になり、ミントも可能になります。

mint_authority を変更する方法で自明なのは JSON ファイルの編集です。solana account コマンドで出力した USDC_mint.json のなかにある "data" を書き換えます。base64 エンコードされているので少し手間です。バイナリエディタで直接できたらまだよかったのですが・・・

bash-3.2$ cat USDC_mint.json | jq
{
  "account": {
    "data": [
      "AQAAABzjWe1aAS4E+hQrnHUaHF6Hz9CgFhuchf/TG3jN/Nj2VQqkBEbjEQAGAQEAAAAqnl7btTwEZ5CY/3sSZRcUQ0/AjFYqmjuGEQXmctQicw==",
      "base64"
    ],
    "executable": false,
    "lamports": 146540071068,
    "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
    "rentEpoch": 349
  },
  "pubkey": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
}

自分のミントアカウントを USDC にしてしまう

再度上記のミントアカウントのフィールドデータをみると、特にどこに配置されたミントアカウントなのかの情報はありません。

つまり、自分が mint_authority である適当なミントアカウントを作成し、それを USDC のミントアカウントとして配置してしまえば整合性の不一致なく、自分が mint_authority になっている状態を作れるということです。

適当なトークンを作成する

USDC の decimals は 6 のため、同じく decimals が 6 の適当なトークンを作成します。

bash-3.2$ spl-token create-token --decimals 6
Creating token AgBZkrtj6k1bkQsfyCxEiMNVE9xmH1fnYWNryZqHHWNT

Signature: 2Z4FVfc2nib2EVp4WSUNXGM7t5zjqmW7zqjjpKtn6e9BoKfR9cmTRj38toCeSza6NxghgSgKBgDCxb4yJQmUoRzZ

JSON ファイルを作る

solana account コマンドを使用し、作成したトークンのミントアカウント(AgBZ…HWNT) を JSON ファイルに保存します。

bash-3.2$ solana account -u l --output json-compact --output-file my_mint.json AgBZkrtj6k1bkQsfyCxEiMNVE9xmH1fnYWNryZqHHWNT
{"account":{"data":["AQAAAAyOmHhPgzBPRhSA14a0e9oEWRTSIbSsd3QCl6+2cVM1AAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==","base64"],"executable":false,"lamports":1461600,"owner":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch":0},"pubkey":"AgBZkrtj6k1bkQsfyCxEiMNVE9xmH1fnYWNryZqHHWNT"}
Wrote account to my_mint.json

my_mint.json の内容を確認します。
"data" に含まれる mint_authority は自分になっているはずです。

bash-3.2$ cat my_mint.json | jq
{
  "account": {
    "data": [
      "AQAAAAyOmHhPgzBPRhSA14a0e9oEWRTSIbSsd3QCl6+2cVM1AAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
      "base64"
    ],
    "executable": false,
    "lamports": 1461600,
    "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
    "rentEpoch": 0
  },
  "pubkey": "AgBZkrtj6k1bkQsfyCxEiMNVE9xmH1fnYWNryZqHHWNT"
}

1つ都合が悪いのは、最後の "pubkey" です。これがあると、local-validator は違うアドレスにデータを配置してくれないようです。よって、この "pubkey" のみ書き換えます。これはプレーンテキストなので容易です。

bash-3.2$ sed s/AgBZkrtj6k1bkQsfyCxEiMNVE9xmH1fnYWNryZqHHWNT/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v/ my_mint.json > my_mint_as_usdc.json

bash-3.2$ cat my_mint_as_usdc.json | jq
{
  "account": {
    "data": [
      "AQAAAAyOmHhPgzBPRhSA14a0e9oEWRTSIbSsd3QCl6+2cVM1AAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
      "base64"
    ],
    "executable": false,
    "lamports": 1461600,
    "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
    "rentEpoch": 0
  },
  "pubkey": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
}

"pubkey" を書き換えた my_mint_as_usdc.json を作っています。

sed で書き換えましたが、vi やエディタで書き換えても問題ありません。これで、自分が mint_authority で、"pubkey" が USDC のミントアカウントになっており、配置可能な JSON が完成しました。

あとはもうこの JSON を使い続ければよく、この作業はこの1回きりです。

test-validator に読み込ませる

USDCのミントアカウントをメインネットからコピーしたときと同様に、--account にて USDC のミントのアドレス (EPjF…Dt1v) に my_mint_as_usdc.json を配置します。

bash-3.2$ solana-test-validator --account EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v my_mint_as_usdc.json --reset
Ledger location: test-ledger
Log: test-ledger/validator.log
⠠ Initializing...
⠒ Initializing...
Identity: 2szxBH6caa3U4726AXjnsLZ9zwPTaJtSnhqjKjDXEYm9
Genesis Hash: 8kvvDa3do8avbc4zF7jUktC7C9gt9iAsX1iWRnXjrPZs
Version: 1.9.3
Shred Version: 7523
Gossip Address: 127.0.0.1:1024
TPU Address: 127.0.0.1:1027
JSON RPC URL: http://127.0.0.1:889900:00:14 | Processed Slot: 27 | Confirmed Slot: 27 | Finalized Slot: 0 | Full Snapshot Slot: - | Incremental Snapshot Slot: - | Transactions: 27 | ◎499.999870000

配置の確認

solana account で test-validator の USDC のミントを表示してみます。
アカウントのデータが表示されれば配置は問題なく完了です。

bash-3.2$ solana account -u l EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v

Public Key: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
Balance: 0.0014616 SOL
Owner: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
Executable: false
Rent Epoch: 0
Length: 82 (0x52) bytes
0000:   01 00 00 00  0c 8e 98 78  4f 83 30 4f  46 14 80 d7   .......xO.0OF...
0010:   86 b4 7b da  04 59 14 d2  21 b4 ac 77  74 02 97 af   ..{..Y..!..wt...
0020:   b6 71 53 35  00 00 00 00  00 00 00 00  06 01 00 00   .qS5............
0030:   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00   ................
0040:   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00   ................
0050:   00 00   

ミントしてみる

spl-token コマンドを利用して、トークンアカウントを作成してミントしてみます。前後で USDC の供給量を supply サブコマンドで確認しています。

bash-3.2$ spl-token supply EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
0

bash-3.2$ spl-token create-account EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
Creating account FbQdXCQgGQYj3xcGeryVVFjKCTsAuu53vmCRtmjQEqM5

Signature: 2LiHnYTk3HfL6rGLFGHTgYEonVm1XuEccGcGt4dd5eJhsG9zA5SGrRbLqhdeBy4kPaNAk89DCi3j1bCEeF9TrowL

bash-3.2$ spl-token mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v 100000
Minting 100000 tokens
  Token: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
  Recipient: FbQdXCQgGQYj3xcGeryVVFjKCTsAuu53vmCRtmjQEqM5

Signature: 27a4D7znKQ9uT4r5bEFHttSMDLrPDNxZUbXyLfcTpnUC7oGTF2yxYsY8UJ9H6SuDB9HbwQ82Zws3t4KRTBRZskoz

bash-3.2$ spl-token balance EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
100000

bash-3.2$ spl-token supply EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
100000

適当に作ったミントアカウントを USDC のミントアカウントにしたので、supply は当初 0 で、ミントによって増加が確認できました。

ミントできればこれで問題ないですが、バーンする場合には supply を減らすと思いますので、適当なアカウント宛にミントして supply をそれっぽく増やしておく必要がありそうです。

都合の良い状態になったら、JSON ファイルに状態を保存しておけばよいと思います。

以上です。

この記事が気に入ったらサポートをしてみませんか?