スマートコントラクト
本サービスに対応したスマートコントラクトの書き方について説明します。
おすすめの書き方
以下のようにコントラクトを作成することをおすすめします。 詳細については次に説明します。
contract YourContract {
// proxy コントラクトのアドレスを指定します
address constant public PROXY = "0xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
// TxProxy対応のメソッド
function foo(address _x, args..) public {
address _sender = sender(_x);
// your awesome logic
}
// Proxyからの呼び出し/通常の呼び出しに応じてsenderを取得します
function sender (address _x) private view returns (address) {
return msg.sender == PROXY ? _x : msg.sender;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TxProxy対応のメソッド
本サービスを経由して実行されたトランザクションは、Proxyコントラクトによって署名が検証された後に、以下の形式で呼び出されます。 ここでsenderは署名を行ったユーザのアドレスです。
func(sender, args..)
1
そのため、msg.senderが指定したProxyコントラクトの場合は、第一引数のアドレスをmsg.senderの代わりに利用します。
また、通常通りmsg.senderを利用する場合にも、同じシグネチャの関数で対応することで、クライアント側でProxyの利用の切り替えを容易にすることができます。 この場合、第一引数のアドレスは任意の値を設定可能なので信用できず、msg.senderを利用する必要があります。
すなわち、以下のような関数に第一引数を渡すことで署名を行った/トランザクションを発行したユーザを取得することができます。
function sender (address _x) private view returns (address) {
return msg.sender == PROXY ? _x : msg.sender;
}
1
2
3
2
3
Proxyコントラクトのアドレスについて
上記の例ではProxyコントラクトのアドレスを固定していますが、コントラクトに問題あった場合に備えて、変更可能にしても良いでしょう。 なお、Proxyコントラクト自体は万が一、本サービスが終了したとしても、呼び出すことが可能ですのでご安心ください。