高水準言語 Solidityでとりあえず、書いてコンパイルする

solidityというのが最もポピュラーなのでしょう。ちらっと聞いた話だと、これもフルスクラッチで作り直すとか話があるようです。過去を切り捨てていくスタイルなので致し方ないのかも。BSVもライアンがv2という名でゼロから設計しなおしたものが公開されました。

エンジニアあるあるですが、何か作った時もう一度ゼロから作り直すといいものが生まれます。これを何度もやる奴がいて、そういう奴は大抵優秀なエンジニアです。作り直すというのは作っている最中に問題があるなーってパターンと、成長してより良いものが作れるようになったからというものがあります。なのでその点の経緯から大抵優秀です。あとそういうのが趣味って言う点でも優秀と言えます。

なのであまりそこをマイナス評価したり、不安材料と考える必要もないでしょう。いざこざがあるとだめですけどね。

蛇口、フォーセット

はじめbsvで聴いたときに、なんのこっちゃでしたが業界の?英語圏の?標準の言い回しの様です。

contract Faucet {//蛇口っつーコントラクト作るぞ
	function withdraw(uint withdraw_amount) public {//withdrawっつー関数を作るぞ。引数はマイナスなしの整数だ!publicにしてどこからでも呼び出すぞ!
		require(withdraw_amount <= 100000000000000000);//引数の数字がこの数値以下かテストするぞ!

		msg.sender.transfer(withdraw_amount);//引数の金額を送信者アドレスに送金するぞ!
	}

	function () public payable {}//フォールバック、デフォルト関数。
}

コードはすべてgithubにあります。
github.com

と、書いてあるので見に行ったらコードがちょっと違います。どういうこっちゃ!!っこれは欠陥のあるコントラクトらしくてもしかしたらとび先のコードはそれを修正したものなのかも??

コードにはコメントを入れました。要は送金関数で、金額の上限チェックをいれて送金するプログラムです。フォールバック、デフォルト関数はこのコントラクタにはwithdrawって関数があるんですが、それを選ばなかった場合に実行されるらしいです。最初に呼び出されるコンストラクタともちがう、try,catch的な?payableという関数がいるみたいです。たぶん無名関数の中でpayableを実行している?そういう記述だと思う。
medium.com

requireっていうとphp的にはファイル読み込みなんですが、これはテスト処理みたいですね。if文+return(exit)的な。
いろいろ似たような関数があるようです。
y-nakajo.hatenablog.com

remixでコンパイルしよう

で、このプログラムをコンパイルしまして、機械が読む用の言語に変換します。Chromeのmetamaskと連動するようなのでChromeアクセスします。
remix.ethereum.org

これmetamaskのメインネット、テストネットを判断しているっぽいのでテストネット使うつもりならそっちに切り替えておこう!

sCryptに似てる。sCryptが意識して作っているのでしょう。Solidityとremixの両方をsCryptが構築中ってことですね。で、これコンパイル試みていて薄々分かりました。結構バージョンがあります。こんだけ刻んだのか(笑)私のサンプルはver0.4.19。githubは0.6.0。remixをみると0.7.5まで来ています。因みに1.0.0で一般的には正式リリースなのでここまで長い道のりです。なんならまだ触らない方がいいバージョンと言えます。そうですが、そうですね。まぁこの時期に触るっていうことはそういうことです。逆にこれに投資だ!といってトークン売り買いするのははやり歴史上なかったシステムですね。

f:id:online106:20201124191720p:plainf:id:online106:20201124191713p:plainf:id:online106:20201124191710p:plain

バージョンを合わせてコンパイルしたらうまく行きました。pragmaっていうバージョンの指定が必要みたいです。とりまコンパイル出来たら図のあたりポチポチしてみましょう。

Bytecodeはっつけてみました。すると、opcodesってのがEVMバイトコードみたいですね。

{
	"linkReferences": {},
	"object": "6060604052341561000f57600080fd5b60e58061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632e1a7d4d146041575b005b3415604b57600080fd5b605f60048080359060200190919050506061565b005b67016345785d8a00008111151515607757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151560b657600080fd5b505600a165627a7a723058201d650e64b50f27a480cbcdd4abf293a829d818cbbee25b39d98f2eecc77990650029",
	"opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE CALLVALUE ISZERO PUSH2 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xE5 DUP1 PUSH2 0x1D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x3F JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x2E1A7D4D EQ PUSH1 0x41 JUMPI JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH1 0x4B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x5F PUSH1 0x4 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP2 SWAP1 POP POP PUSH1 0x61 JUMP JUMPDEST STOP JUMPDEST PUSH8 0x16345785D8A0000 DUP2 GT ISZERO ISZERO ISZERO PUSH1 0x77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC DUP3 SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO ISZERO PUSH1 0xB6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0x1d PUSH6 0xE64B50F27A4 DUP1 0xcb 0xcd 0xd4 0xab CALLCODE SWAP4 0xa8 0x29 0xd8 XOR 0xcb 0xbe 0xe2 JUMPDEST CODECOPY 0xd9 DUP16 0x2e 0xec 0xc7 PUSH26 0x9065002900000000000000000000000000000000000000000000 ",
	"sourceMap": "28:442:0:-;;;;;;;;;;;;;;;;;"
}