ContractSwiftというライブラリを作った
4 min readApr 4, 2018
モチベーション
EthereumのスマートコントラクトはデプロイされるとABI(Application Binary Interface)と呼ばれるJSONファイルが生成される。ABIには、デプロイしたスマートコントラクトの機能(関数)の関数名とそれぞれの入力と出力などの情報が記載されていて、ABIを見ればそのスマートコントラクトがどういう機能を持っているのかがざっくりと分かる。
// ABI
[
{
"constant": false,
"inputs": [
{
"name": "_to",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
...
]
クライアントからスマートコントラクトの関数を呼ぶ場合、関数のシグネチャのsha3ハッシュされた文字列の最初の4byteと、関数の引数の16進数の256bit長の文字列を連結したものを送らないといけない。
例えばERC20に定義されているトークン送金用の関数transfer(address,uint256)を呼びたい場合、以下のような文字列を生成しないといけない。
0xa9059cbb0000000000000000000000005c66b0d82df26e8FE165Be6628F5f5e1f1bccD5C00000000000000000000000000000000000000000000000000005af3107a4000
これをクライアントで扱おうと思うと、なかなかめんどくさいし、気持ち悪い関数のシグネチャを定義しておかないといけない。
let transferSignatureSha3String = "a9059cbb"
let balanceOfSigatureSha3String = "70a08231"
// あるいは
let transferSignature = "transfer(address,uint256)"
let balanceOfSignature = "balanceOf(address)"
ということで、
- スマートコントラクトの全ての関数の補完が効く
- 各関数の引数を動的に入れた上で
data
パラメータが取得できる
ライブラリを作りたいと思った。
また、それをやってくれるライブラリがまだなかったのと、今後モバイルDappsが増えていく時に、必要なものであると思ったので作ってみた。
どんなライブラリか
- スマートコントラクトのABIから
Contract.generated.swift
というファイルを生成する静的コードジェネレーター - 実装された全ての関数の補完が効く
- トランザクションを生成するときに必要な
data
パラメータの文字列を返してくれる
Demo
デモ動画にあるように、補完が効く形で関数を呼ぶことができ、 data
パラメータの文字列を取得できる。
Contract
.Function
.transfer(
Address(string: "0x5c66b0d82df26e8...Be6628F5f5e1f1bccD5C"),
BInt("100000000000000")!
)
.txDataString()// => 0xa9059cbb0000000000000000000000005c66b0d82df26e8FE165Be6628F5f5e1f1bccD5C00000000000000000000000000000000000000000000000000005af3107a4000
なお、まだ全てのSolidityの型に対応していなかったり、不十分な部分があるので早急に対応していきたい。