Solidityに触れてみた
2/9,16,17日にブロックチェーンハッカソンに参加してきました!
そこで、SolidityというEthereum上で動くスマートコントラクト開発言語に初めて触れたので知識をメモしておきます。
修飾子
- アクセス修飾子
アクセス修飾子 | 内部 | 継承先 | 外部 |
---|---|---|---|
public | ◯ | ◯ | ◯ |
external | × | × | ◯ |
internal | ◯ | ◯ | × |
private | ◯ | × | × |
状態修飾子
- pure:storageの読み込み、書き込み不可
- view:storageの読み込みは可能、書き込みは不可能
- payable:Etherを受信可能
- modify:カスタムの修飾子
変数の種類
- memory:一時的に保持される変数、gas不要
- storage:ブロックチェーンに永久に保持される、gas要
文字列比較
- 文字列を直接比較することはできない
- ABIでエンコードし、keccak256でハッシュ化(bytes32型に変換)
function isSameString(string memory origin, bytes32 target) private pure returns (bool) { return keccak256(abi.encodePacked(origin)) ==keccak256(abi.encode(target)); }
文字列連結
str1 + str2
みたいなことは不可能- bytes型
.length
メンバを使える- 添え字が使える
- 動的配列なのでサイズを確保(mallocのようなもの)
function strConnect(string memory str1, string memory str2) private returns(string memory) { bytes memory strbyte1 = bytes(str1); bytes memory strbyte2 = bytes(str2); bytes memory str = new bytes(strbyte1.length + strbyte2.length); uint8 point = 0; for(uint8 i = 0; i < strbyte1.length; i++) { str[point] = strbyte1[i]; point++; } for(uint8 i = 0; i < strbyte2.length; i++){ str[point] = strbyte2[i]; point++; } return string(str); }
文字列→Bytes32
function stringToBytes32(string memory source) private returns (bytes32 result) { bytes memory tempEmptyStringTest = bytes(source); if (tempEmptyStringTest.length == 0) { return 0x0; } assembly { result := mload(add(source, 32)) } }
感想
人類にとってスマコン開発は早すぎた。