solidity

Solidity memo

自身用にメモ 

//コンパイラのバージョン指定
pragma solidity ^0.4.8;

//contract(コントラクト)はクラスのような物,任意の名前があります
contract HelloWorld {
    //コントラクト内で有効な変数,ユーザーから渡された文字列を保持する変数
    //publicで不安かもしれないが、値の更新はできない
    string public greeting;


    //solidityの慣習で変数の戦闘はアンダースコアになります。
    //コントラクトと同じ名前のメソッド名でデプロイ時に実行可能な関数です。
    //引数の_greetingを上記の変数にセットします。
    function HelloWorld(string _greeting) {
        greeting = _greeting;
    }

    //メソッドの宣言
    function setGreeting(string _greeting) {
        greeting = _greeting;
    }
    //戻り値を返す場合はreturnsとして戻り値のデータを宣言します。
    //保持しているデータの変更を伴わない場合はconstantをつけます
    function say() constant returns (string) {
        return greeting;
    }
}

上記をコンパイル後デプロイし、ABIを取得します

デプロイ
contractAbiDefinition = sourceCompiled['/tmp/geth-compile-solidity794996942:HelloWorld'].info.abiDefinition

ABIはコントラクトの外部仕様となります。

Contractとは
先に述べたように、Ethereumには2つのタイプのアカウントが存在します。
一つはEOA(Externally Owned Account)です。我々ユーザーがそのアカウントを作成し、任意のタイミングでそのアカウントを通じてEthereumネットワークとのやり取りを行うものです。

そしてもう一つがContractです。JavaやPythonなどオブジェクト指向言語になじみがある人であればContractは、オブジェクト指向言語での「クラス」に似たものと考えるとイメージがつかみやすいかもしれません。それぞれのContractは、各自にクラス変数に相当するような、内部状態を保持するストレージ部分と、メソッドに相当するような、実行コードである「コントラクト・コード」を持っています。
「etherを送金してみる」節で見たように、EOAが、他のEOAのアドレスを宛先としたトランザクションを生成することで、他のEOAに対してetherを送金することができました。

同様にEOAがContractのアドレスを宛先とするトランザクションを生成することも可能です。この場合、EOAを宛先とした場合と同様にContractへのetherの送金も可能ですが、同時にコントラクト・コードの実行を指示することが可能です。
コントラクト・コードに様々な動作をプログラムすることで、そのContractにより名前管理やトークン管理のようなアプリケーションが実現できます。コントラクト・コードの実行は採掘者によって行われ、実行結果は公開元帳であるブロックチェーンに書き込まれていき、特定の中央機関なくアプリケーションが動作していきます。

オブジェクト生成
contractAbiDefinition = sourceCompiled['/tmp/geth-compile-solidity794996942:HelloWorld'].info.abiDefinition

_