🎏

Capture the Ether - Choose a nickname

2022/02/13に公開

問題はここ: https://capturetheether.com/challenges/warmup/nickname/

ここからSolidityの理解が要求される。 コードはこんな感じ

pragma solidity ^0.4.21;

// Relevant part of the CaptureTheEther contract.
contract CaptureTheEther {
    mapping (address => bytes32) public nicknameOf;

    function setNickname(bytes32 nickname) public {
        nicknameOf[msg.sender] = nickname;
    }
}

// Challenge contract. You don't need to do anything with this; it just verifies
// that you set a nickname for yourself.
contract NicknameChallenge {
    CaptureTheEther cte = CaptureTheEther(msg.sender);
    address player;

    // Your address gets passed in as a constructor parameter.
    function NicknameChallenge(address _player) public {
        player = _player;
    }

    // Check that the first character is not null.
    function isComplete() public view returns (bool) {
        return cte.nicknameOf(player)[0] != 0;
    }
}

まずDeployするのだが、Deployされるcontractは1つだけであることに注意。今回の例ではCaputureTheEtherNicknameChallengeのうち、NicknameChallengeのみがDeployされる。ではCaputureTheEtherはどこにあるかというと

The CaptureTheEther smart contract keeps track of a nickname for every player. To complete this challenge, set your nickname to a non-empty string. The smart contract is running on the Ropsten test network at the address 0x71c46Ed333C35e4E6c62D32dc7C8F00D125b4fee.

つまり https://ropsten.etherscan.io/address/0x71c46Ed333C35e4E6c62D32dc7C8F00D125b4fee このアドレス。
コードのコメントにもあるように、必要なのはCaptureTheEtherのfunctionを呼び出してnicknameを登録すること。 前回の問題(解説)でcontractを呼び出したように、etherscanの"Contract"tabを見ると…

Read/Write tabが存在しない。 EtherscanでContractを呼び出すには"Verify and Publish"をする必要があるらしい。
(このcontractのcreatorではないので勝手にVerifyしないようにしましょう、念の為)
他の方法でContractの関数を呼び出す必要がある。
ここではRemix IDEを使う。これは Solidityのcompile,debug,deployが出来るWeb上のIDEだが詳しい説明は省く。 詳しい使い方は公式Documentなどを見てください。

見た目はこんな感じ

ContractをRemixから呼び出すには、実際にcontractを定義する必要がある。
solファイルを作って、

コードをコピペ

左の2番目のアイコンをクリックしてコンパイル…が失敗。Solidityのversionが不一致。

compiler versionを0.4.21に合わせるとコンパイル出来る

3番目のアイコンをクリックして

Injected Web3を選択。下部のAt AddressにCaptureTheEtherのAddressを入れる。
もしAddressを入れてもボタンの色が変わらない場合はIDEがバグってるのでページをリロード

At Addressをクリックすると"Deployed Contracts"にcontractの関数が表示される。

てきとうにfoobarと入れると…consoleにエラーが表示される

transact to CaptureTheEther.setNickname errored: Error encoding arguments: Error: invalid arrayify value (argument="value", value="foobar", code=INVALID_ARGUMENT, version=bytes/5.5.0)

要するに"foobar"という文字列はbytes32型ではないので弾かれている。
どんな方法でもいいのでUTF-8 -> bytes32に変換する必要がある。例えば testなら0x74657374000000000000000000000000000000000000000000000000000000にする必要がある。
foobarなら0x666f6f6261720000000000000000000000000000000000000000000000000000

長さが正しければtransactionを発行できる。

発行後nicknameOfを呼び出して、実際にセットした値が得られるかを念の為に確認。

Check Solutionして完了。

Discussion