スマートコントラクト

本サービスに対応したスマートコントラクトの書き方について説明します。

おすすめの書き方

以下のようにコントラクトを作成することをおすすめします。 詳細については次に説明します。

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

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

Proxyコントラクトのアドレスについて

上記の例ではProxyコントラクトのアドレスを固定していますが、コントラクトに問題あった場合に備えて、変更可能にしても良いでしょう。 なお、Proxyコントラクト自体は万が一、本サービスが終了したとしても、呼び出すことが可能ですのでご安心ください。