はじめに
しばらくQiitaはROM専だったのですが、備忘録のために残します。
最近、仮想通貨とか暗号通貨とかブロックチェーンとかについて色々調べています。
ただ、ネットにある情報が若干(数か月前の情報ですが)古いために、サンプルコードがまともに動かないことが多くて
その調査だけで時間が掛かっています。
私自身が経験したつまずいたことを書いていきます。
バージョン違いによる仕様変更
2018/05現在、solidityのバージョンは v0.4.23です。
ですので、このバージョンと以前のバージョンでの違いについてがメインとなります。
いろいろ変わっていますので、対応が必要です。
public などの関数の可視性
method(uint param) { // 可視性はなくてもOKでした
....
....
}
method(uint param) public { // 可視性が必要です
....
....
}
多言語でよくある public int method(int param)
のような形ではありません。
関数名の後ろに付けるのがsolidityです。これに気が付くまでに時間が掛かりました。
ちなみに戻り値があるときは、可視性の後ろにreturns修飾子を付けます。
method(uint param) public returns(bool ret) {
....
....
}
コンストラクタについて
contract TestToken {
TestToken() { // 以前は、コントラスト名と同じでした
....
....
}
}
contract TestToken {
constructor () public { // constructorというキーワードです
....
....
}
}
constructor という表記方法に代わっています。
もちろんですが可視性(public)も必要です。
uintについて
method(uint param) { // uintでOKでした
....
....
}
method(uint256 param) public { // uintだとWarningが発生しますので、uint256などに変更
....
....
}
uint型は、推奨ではないようです。
ERC20のコードなどを見るとuint256を使用しているケースが多いので、
uint256にしておくのが良いかと。
event修飾子
event Transfer(address indexed _from, address indexed _to, uint _value);
function sendCoin(address receiver, uint amount) public returns(bool sufficient) {
if (balances[msg.sender] < amount) return false;
balances[msg.sender] -= amount;
balances[receiver] += amount;
Transfer(msg.sender, receiver, amount); // 特になにもする必要はありませんでした
return true;
}
event Transfer(address indexed _from, address indexed _to, uint _value);
function sendCoin(address receiver, uint amount) public returns(bool sufficient) {
if (balances[msg.sender] < amount) return false;
balances[msg.sender] -= amount;
balances[receiver] += amount;
emit Transfer(msg.sender, receiver, amount); // emit修飾子を使います
return true;
}
event(トランザクションへのログ出力)を実行するときはemit
をつける必要があります。
終わりに
オープンソースですので、仕様の変更がよくあるのは仕方がないと割り切っていますが、
情報を探すが結構大変です。公式サイトなどをしっかり読めば気づくのでしょうけど・・・
参考URL
solidity(https://solidity.readthedocs.io/en/latest/index.html)
https://github.com/OpenZeppelin/openzeppelin-solidity/issues/932