Ethereum の Browser-solidity の挙動やContractの流れについて

技術メモ

前回の記事で Browser-solidity を使い Ethereumのcontractを動かしてみたが、ただ動かしただけでまったく仕組みを理解していいないため1つ1つ理解していく。

現在のテスト環境構成

Contractを理解する

Contractを作成する のページで記載されているが、以下がContractの作成から利用までの流れ。

1. Contractの作成
 Solidity言語でコントラクト・コードをプログラミングする。そしてプログラムしたコントラクト・コードを、solcを使ってコードをコンパイルする。
2. Contractのブロックチェーンへの登録
 コンパイル結果を用いて、Contract を生成するトランザクションをEthereumネットワークに送信する。そのトランザクションを受信した採掘者は、トランザクションをブロックチェーンに登録する(=Contractをブロックチェーンに登録する)。この時Contractのアドレスが発行される。
3. Contractへアクセス
 Contractを利用するユーザーは、Contract作成者からContractへのアクセス情報の取得する。その情報をもとにContractへアクセスし、コントラクト・コードの実行等を行う。

今回使用したContractコード

pragma solidity ^0.4.0;

contract Counter {
    bytes32 counterName;
    uint32 numberOfCounter;
    function Counter(bytes32 name) {
        counterName = name;
    }
    
    function countUp() {
        numberOfCounter++;
    }
    
    function getCounterName() constant returns (bytes32 name) {
        return counterName;
    }
    
    function getNumberOfCounter() constant returns (uint32 number) {
        return numberOfCounter;
    }
}

contract CounterMaster {
    mapping (address => Counter) private counters;
    address[] private addressList;
    
    function addCounter(bytes32 name) {
        Counter c = new Counter(name);
        addressList.push(address(c));
        counters[address(c)] = c;
    }
    
    function getCounterAddressList() constant returns (address[] counterAddressList) {
        counterAddressList = addressList;
    }
    
}

gethのコマンドおさらい

geth --datadir /root/ethereum/data --networkid 15 --rpc --rpcaddr "172.17.0.2" --rpcport 8545 --rpccorsdomain "*" --rpcapi "net,eth,web3,personal" --testnet --nodiscover --unlock primary --password "/root/ethereum/password" --verbosity 4 console

–rpccorsdomain value : Comma separated list of domains from which to accept cross origin requests (browser enforced)
–networkid value  : Network identifier (integer, 0=Olympic (disused), 1=Frontier, 2=Morden (disused), 3=Ropsten) (default: 1)
–rpccorsdomain value : Comma separated list of domains from which to accept cross origin requests (browser enforced)
–verbosity value  : Logging verbosity: 0=silent, 1=error, 2=warn, 3=info, 4=core, 5=debug, 6=detail (default: 3)
–nodiscover  : Disables the peer discovery mechanism (manual peer addition)
–unlock value  : Comma separated list of accounts to unlock
 Ethereum: アカウントをアンロックする方法
–password value : Password file to use for non-inteactive password input

Command Line Options

Transaction origin

トランザクションを扱うアドレスを表示。

browser-solidityの Select execution environment

今回の環境では Select execution environment で Web3 Provider を指定しているが、それぞれの挙動について調べる。

Contract開発環境(IDE)の活用 に説明があるので転記。
Select execution environmentには以下3つの指定がある

・JavaScript VM
  ブラウザ上での疑似実行モード。実際のEthereumノードには接続せず、ブラウザ上のJavascript VM 上でContractの関数を疑似的に実行
・Injected Web3
 不明。。。
・Web3 Provider
 Blockchain上での実行モード。実際のEthereumノードに接続し、作成したContractをブロックチェーン上に登録した上でContractの関数を実行

Web3 Providerでないと実際のEthereumノードに接続しない。
ちなみにweb3とはEthereum JavaScript API。 RPCを使ってノードと会話する。

Contract の Create

Ethereumノードにアクセスしブロックチェーン上にContractを登録するためのTransactionを発行。
Ethereumネットワーク上でTransactionが採掘されると今回のContractのブロックチェーン上でのアドレスとContractで規定された関数(ここではgetとsetの関数)が表示される。

create押すと上記画面が表示されるので、
実際にaddCounter関数のテキスト入力エリアに任意の文字列を入力し赤色のいるaddCounter関数実行ボタンを押下するとbrouser-solidityはトランザクションを発行しEthereumネットワーク上で採掘されるとトランザクション実行結果を表示する。
またそのあと青色のgetCounterAddressList関数ボタンを押下すればaddCounter関数で設定したアドレス一覧が表示される。

はまった点

Create, addCounter, getCounterAddressList ボタン押すたびに miner.start(), miner.stop() を繰り返さないとbrouser-solidityからのアクションが反映されず 以下ログがずっと表示されたままになっていた。

DEBUG[05-03|07:45:45] Receipt not found for transaction        hash=b2a5a7…eb2a38
DEBUG[05-03|07:45:46] Receipt not found for transaction        hash=b2a5a7…eb2a38

Create 押したら、 miner.start() で、submit 確認できたら miner.stop()
で、また addCounter 押したら、 miner.start() で、submit 確認できたら miner.stop()
みたいなのを繰り返す必要があった。

この謎は未だによくわからない、、、

Sponsored Link

ビットコイン(Bitcoin)、イーサリアム(Ethereum)、リップル(Ripple)、ネム(NEM)などの仮想通貨を買うならZaifがおすすめです。

特に国内でETHを購入するなら、アルトコインでも板取引に対応しているZaif(ザイフ)が割安なのでよいですよ。

コメントはまだありません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


Ethereum(イーサリアム)
Error: The contract code couldn’t be stored, please check your gas amount.

ALISのICOソースのzeppelinバージョンを1.2から1.8にあげようとしたときにはまったエ …

Dapps
日本の都道府県を所有できるDApps & ERC721 のサンプルを公開してみました

最近、Ethereum上でカードなどを所有できるdAppsが流行っているので、試しに日本の都道府県を …

Ethereum(イーサリアム)
TX doesn’t have the correct nonce – Metamask

EthereumのdAppsを作ろうとしていてはまったのでメモ。 Metamaskを使用して支払いを …