Tech

Ethereum の Smart Contracts やアプリの作り方

  • このエントリーをはてなブックマークに追加
  • 書き途中なので、追記していきます。
  • 2014年3月現在、コンセプト証明の状態 Proof of Concept 3 (POC3) なので、仕様がどんどん変わる可能性が高いです。

Contract って何?

概念上の説明

  • Ethereum 上で実行できるプログラム
  • スマートコントラクト(契約)を書ける

仕様的な説明

  • contract は、Ethereumネットワーク上の自動化されたエージェント
  • contract がアドレスを持っている
  • contract のアドレスにトランザクションを送ると、contract のコードが実行される

用語: 予備知識

Bitcoinの予備知識

Ethereumの予備知識

  • EVM-code (旧 EtherScript)
    • Ethereum クライアントに入っている Virtual Machine上で動く?

作れるもの

  • currency
  • finacial derivatives
  • wallet
  • data storage
  • name registration (DNS, Namecoin)
  • Decentralized Organizations

Languages

  • ECLL/CLL (Cのような言語)
    • Ethereum C-Like Language
  • HLL (python inspired)
  • LLL (LISP inspired)
  • シミュレータでは、JavaScriptっぽいのが動いている

上記を(EtherScript 2.0? EVM?)バイナリにする

仕様系用語

Contracts

  • トランザクションを作成、受け取りできるのは、人かcontracts
  • contract は、Ethereum network上に生きる基本的に自動化されたエージェント
  • contract は、EthereumアドレスとEthereumのbalanceを持っていて、トランザクションの送受信ができる
  • contract は、誰かがトランザクションを送るたびにアクティベートされ、その時にコードを実行する
  • もしかすると、内部のステータスを変更したり、トランザクションを送ったりしてから、シャットダウンするかもしれない。
  • contract用のコードは、特別な目的のための低レベル言語で書かれていて、以下項目から構成される
    • stack (not persistent)
    • 2^256 メモリー・エントリー (not persistent)
    • 2^256 ストレージ・エントリー (永久的なステータスを保持)

Applications

incoming トランザクション の変数

  • call.sender (address)
  • call.value
  • call.datasize

tx??

contract

  • contract.storage
  • contract.address

block

  • block.account_balance
  • block.number
  • block.difficulty
  • block.parenthash
  • block.basefee
  • block.timestamp

定数: constants

大文字で始まる変数は、定数

functions

関数もあるはずだが、ドキュメントになく、サンプルにある状態

  • mktx()

Data Format: データ・フォーマット

全てのデータは、RLP (recursive length prefix encoding)に入っている

Block ブロック

[
    block_header,
    transaction_list,
    uncle_list 
]

それらは

transaction_list = [
    transaction 1,
    transaction 2,
    ...
]

uncle list = [
    uncle_block_header_1,
    uncle_block_header_2,
    ...
]

block_header = [
    parent hash,
    sha3(rlp_encode(uncle_list)),
    coinbase address,
    state_root,
    sha3(rlp_encode(transaction_list)),
    difficulty,
    timestamp,
    extra_data,
    nonce
]

トランザクション

[ nonce, receiving_address, value, [ data item 0, data item 1 ... data item n ], v, r, s ]
  • アドレスとして空stringに送られたトランザクションは、特別なタイプのトランザクションで、”contract” を作る

コンパイラ

色々な言語で書いたものをコンパイルする

Etherchain上に、Web上のコンパイラ

Simulators: シミュレータ

Ethereum testnetに繋がないで、シミュレータで contract を送ったりできる。

Ethereum Simulator

Web上で利用できるシミュレータ (JavaScript)

使い方

  • 見えづらいボタンが3つある
    • send a transaction: トランザクションを送る
    • create a contract: コントラクトを作る
    • create a wallet: ウォレットを作る
  • テストを実行する
    • cryptsyfeedのコントラクトを実行する
    • create a transaction: のアイコンをクリック
    • From: で crypty.com を選択
    • To: で crypty.com を選択
    • Value と Fee を適当に設定
    • Data: の一行目に JPN/ETH 。二行目に 1000 的な値を書く
    • $submit transaction をクリック
    • 確認: 下のBLOCKの欄に追加される
    • 確認: Contract に値が追加される

CLL Simulator

CLL のシミュレータ。CLIベースの表示。
Pythonでのユニットテストのような感じ。

サンプル

Jam10o/contracts

FAQ from Forum

Writing Smart Contracts FAQ (live updates) – ethereum
http://forum.ethereum.org/discussion/505/writing-smart-contracts-faq-live-updates/p1

LLL Tutorial

LLL Tutorial · ethereum/cpp-ethereum Wiki

Write your own contracts: Slide and Video

Slide

Ethereum: Write your own contracts

Video

Ethereum: Write your own smart contracts + Q&A – YouTube

ビデオにおける説明

単なるメモです。

  • ether を配る
  • storage を保存するくらいのインセンティブになると、etherがないとダメ
if tx.value < 100 * block.basefee:
    stop
  • フィー(報酬)が足りないなら、ストップ
  • block.basefee はまだ決ってないが、定数が入る
  • tx: transaction
  • tx.value:
elif contract.storage[1000]:
  • はじめての実行か、2回目以降の実行か?の判断
  • contract.storage の アドレス 1000 のところにデータが入っているなら、実行。
  • contract.storage[1000]: strage indexes: memory position: used ad a flag: executed only once
  • block.basefee: constant, 100
    • why 1000? avoid to override memory
else:
    contract.storage[MYCREATOR] = 10^18
    contract.storage[1000] = 1
  • MYCREATOR = 999 とかあるはず
  • 10^18は、コイン数
  • contract.storage[1000] = 1は、初回実行したというフラグ
  • MYCREATOR: placeholder: public your ethereum account: creator of the cotract

  • from: local stroge

  • value = txdata[1]: how much currency

FAQ

  • どこに書く?
  • どう配布する?

Ethereum Blockchain Explorer

Etherchain – An Ethereum Blockchain Explorer

  • このエントリーをはてなブックマークに追加