Monthly Archive 2022-08-18

Bitlife Coin / iOS

最近iOS開発を再々開することになり、iOSアプリでも暗号通貨を扱ってみたいという思いから、調べたことを久しぶりに投稿いたします。
iPhoneが発売されてから、iOSアプリ(当時はiPhoneアプリ)開発をはじめ、Swiftきっかけで再開し、そして今回Appleシリコン、MLきっかけで三度始めることになりました。

https://github.com/horizontalsystems/ethereum-kit-ios

http://bitlife.me/bc/2022/01/23/ (前回ブログ)

目標は、上記EthereumKitを以前作ってマイコイン”Bitlife Coin”の残高を表示させることです。
iOSのプログラムにいく前に、Bitlife Coinの復習と、Ropstenテストネットが終了するという情報もあることから前回ブログを参考に、Goerliテストネットへのデプロイをしました。
前回のDocker環境の仕方を忘れてしまい(Docker imageがどっかにいってしまった・・)、いろいろと手間取りました。(メモっておかないとだですね)
Windows Docker Desktop -> Containers -> competent_para スタート
WSL -> docker exec -it competent_pare bash
(こんなやり方だった? WSLが起動しなくなる現象はこれが原因? PC再起動でなんとか復旧)
truffleの実行でエラーがでたため、nvmアップデート

nvm install 12.22.12
nvm use 12.22.12

truffle console –network goerli

その前に、truffle-config.jsの編集(前回このあたりの説明がなかった・・)

ropsten: { provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/${infura_key}`, 0, numAccounts), network_id: 3, gas: 5500000, // Ropsten has a lower block limit than mainnet confirmations: 2, // # of confs to wait between deployments. (default: 0) timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50) skipDryRun: true, // Skip dry run before migrations? (default: false for public nets ) from: account, gasPrice: 10000000000, // in wei (default: 100 gwei) websockets: true // Enable EventEmitter interface for web3 (default: false) }, goerli: { provider: () => new HDWalletProvider(mnemonic, `https://goerli.infura.io/v3/${infura_key}`, 0, numAccounts), network_id: 5, gas: 5500000, // Ropsten has a lower block limit than mainnet confirmations: 2, // # of confs to wait between deployments. (default: 0) timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50) skipDryRun: true, // Skip dry run before migrations? (default: false for public nets ) from: account, gasPrice: 10000000000, // in wei (default: 100 gwei) websockets: true // Enable EventEmitter interface for web3 (default: false) },
Code language: JavaScript (javascript)

infura.ioのアカウントはまだ使用可能で、上記goerliのendpointを確認。
前回同様にデプロイしてミント。

truffle(goerli)> migrate
truffle(goerli)> token.mint(accounts[0], web3.utils.toWei(“5000”, “ether”))

https://qiita.com/guntamania/items/d1605961f0af008e8e8d

せっかくなので、こちらを参考に前回やらなかった送金をしました。

https://goerlifaucet.com/

その前にこちらでEtherを取得
このメタマスクのウォレットのニーモニックをtruffle実行フォルダにある.secretに保存します。

truffle(goerli)> tc = await MyCoin.at(MyCoin.address).then(=>)
truffle(goerli)> tc.totalSupply().then(ts=>ts.toString())
‘5000000000000000000000’
truffle(goerli)> dest = “0x…..” <- 送金先 truffle(goerli)> tc.transfer(dest, 100000000000000) 

さていよいよiOS側ですが、githubから取得したプロジェクトをXcodeに読み込ませビルドします。(github参考に、pod installも。.xcworkspaceを使用)
私テスト用デバイスiPhone6がiOS13.0に対応していないのでiPhoneシミュレータを使いました。
ここでgoerliテストネットワーク用に修正をします。

Configuration.swift
・chain.id 5(goerli)でErc20Token追加
 3(ropsten)でも一応確認。
・BLCトークンアドレスの設定(前回ブログ確認)
・RpcResourceの設定。goerli用の関数を使用
・infuraCredentialsの設定。登録したアカウントのProjectIDとSecretコード。
・defaultWordsの設定。MetaMaskのニーモニックコードを使用。(このユーザの残高を確認。ログイン時の指定できるが面倒なのでデフォルトに)
・RcpResourceの設定。goerli用の関数に変更。引数にinfuraCredentialsを指定。
・TransactionResourceの設定。goerli用の関数に変更。etherScanのアカウントを作成しAPIキーを指定。

Chain.swift
・goerliのcointypeを1から60に変更(ropstenでも同様)
 ニーモニックから出力するアドレスが一致しないため、いろいろと調べたところ、HDWallet.swiftのprivateKey:pathが違ったため。

ganache-cli -m “….”
….

Mnemonic: ….
Base HD Path: m/44’/60’/0’/0/{account_index}

ganacheでも確認可

実行結果

まだ送金ができていませんが、アプリに組み込むのに何が必要なのか理解できた気がします。

<おまけ>

https://api.etherscan.io/apis

コードを修正しながら動作確認していく上でなかなかうまくできなかったので、上記APIも実行して確認しました。

https://api-goerli.etherscan.io/api?module=account&action=tokenbalance&contractaddress=”mycoin contract address”&address=”wallet address”&tag=latest&apikey=”APIKEY”

Response: {“status”:”1″,”message”:”OK”,”result”:”4999998999499499499500″}