Capture the Ether - Choose a nickname
問題はここ: 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つだけであることに注意。今回の例ではCaputureTheEther
とNicknameChallenge
のうち、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