##コントラクトの作成
solidityにおけるコントラクトはオブジェクト指向言語におけるクラスのようなものである。コントラクトはトランザクションもしくは他のコントラクトを通して作られる。Ethereumでコントラクトを作成するには、JavaScript API web3.jsを使用する。コントラクト作成を容易にするweb3.eth.Contractというメソッドが存在するからだ。コントラクトが作成されると、コンストラクタ(コントラクトと同じ名前の関数)が1回実行される。内部的には、コンストラクタの引数は、契約自体のコードの後にエンコードされたABIに渡されるが、web3.jsを使用する場合は、このことを気にする必要はない。コントラクトが別のコントラクトを作成する場合作成されたコントラクトのソースコード及びバイナリを作成したコントラクトに知らせなければならない。
##visibility
solidityには2種類の関数呼び出し(内部呼び出し、外部呼出し)が存在し、4種類の関数と変数のvisibilityがある。関数にはexternal,public,internal,privateを設定可能でデフォルトはpublicである。変数にはpublic,internal,privateを設定可能でデフォルトはinternalである。
-
external
他のコントラクトやトランザクションから呼び出すことが可能。内部的に呼び出すことができない(つまりf()は機能しないが、this.f()は機能する)。大規模なデータ配列を受け取るのに適している。 -
public
内部的にまたはメッセージ経由で呼び出すことができる。public変数の場合自動でgetter関数(getdata())が生成される。 -
internal
内部的にのみ呼び出すことができる(現在のコントラクトもしくはそれから派生したコントラクト)。 -
private
定義されているコンストラクトのみで利用可能。派生したコントラクトでは使用できない。
##modifier
modifierを使って関数の実行の前に自動的に状態をチェックすることができる。"_"の後に関数内の処理が続く。
##viewとpure
関数はviewを宣言することができ、その場合状態を変更しないことを約束する。以下は状態を変更するとみなされる。
-
状態変数への書き込み
-
イベントを出す
-
他のコントラクトを作成する
-
selfdestructの使用
-
call経由でEtherを送信
-
viewまたはpureが宣言されていない関数を呼び出す
また関数はpureを宣言することができ、その場合状態を読み書きしないことを約束する。上記の状態の変更とみなされる操作に加えて以下の状態の読み取りとみなされる操作を行わない。
- 状態変数からの読み込み
- this.balance,address.balance
- block,tx,msgのメンバーへのアクセス(msg.sigとmsg.dataを除く)
- pureとマークされていない関数を呼び出す
##名前のない関数
コントラクトは名前のない関数を一つだけ取ることができる。この関数は引数を持たず何も返さない。ほかの関数が指定された関数識別子と一致しなかった場合もしくはEther(データなし)の送金を受けた場合に実行される。Etherを受け取るにはpayableを宣言する必要がある。
##参考
http://solidity.readthedocs.io/en/develop/contracts.html#low-level-interface-to-logs