- 書き途中なので、追記していきます。
- 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” を作る
コンパイラ
色々な言語で書いたものをコンパイルする
- HLL -> EVM-code v1
ethereum/compiler
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でのユニットテストのような感じ。
サンプル
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
- どこに書く?
- どう配布する?