geth

Download Geth よりダウンロードしてインストール
実行
毎回unlockは面倒だから,2つのアカウントはpasswordファイルでunlockして起動。passwordファイルは1つづつ改行

geth --unlock 0,1 --password c:\gethdata\pass.txt --mine --minerthreads 1 --identity "sampleNode" --rpc --rpcport 8545 --rpcapi "web3,eth,net,personal" --rpccorsdomain "*" --rpcaddr "0.0.0.0" --datadir "C:\gethdata" --nodiscover --networkid 10 console 2>> C:\gethdata\geth.log

mineとかminerthreadsとか指定しているけど、省略してコンソールで、

>miner.start(1)
null
>eth.mining
true
>miner.stop()
true

でもよし

コマンド

アカウント作成

personal.newAccount("test1")

アカウント一覧

eth.accounts

マイニングするアカウントの確認

eth.coinbase

送金

eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(100,"ether")})

とか

var tx = {from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(100,"ether")}
personal.sendTransaction(tx, "passphrase")

passphraseにはfromのパスワード

残高

web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")

アンロック アンロックの時間はデフォルト300秒

personal.unlockAccount(アドレス, "パスワード", "アンロックの時間(秒)")
personal.unlockAccount(アドレス)

トランザクション確認 #送金でトランザクションIDが表示されている

eth.getTransaction('トランザクションID')

トランザクションレシート

トランザクションが発行されて、マイニングが行われたら、確認できる。それまではnull

eth.getTransactionReceipt('トランザクションID')

ブロック確認

eth.getBlock(ブロック番号);

ブロックの中身を取得

eth.getTransactionFromBlock()

ペンディングトランザクションを確認

送金処理が完了しブロックに取り込まれると発行

eth.pendingTransactions

ハッシュレート

eth.hashrate

トランザクションのトレース

なんかわかるかも

debug.traceTransaction('アドレス');

こんな感じでfailedの情報が表示されていた。

{
 failed: false,
 gas: 61484,

接続数確認

net.peerCount

meteor

ここでは関係ないです。ただのフレームワーク。後で分けます..
bootstrapとsessionはどうでもいいけど、いつもつかっているので。

meteor add twbs:bootstrap 
meteor add ethereum:web3
meteor add ethereum:accounts
meteor add ethereum:blocks
meteor add session

EthAccounts?

meteorのethereum:accounts
1番目のアカウントの名前

EthAccounts.find().fetch()[0].name

1番目のアカウントのアドレス

EthAccounts.find().fetch()[0].address

1番目のアカウントのEtherの残高

EthAccounts.find().fetch()[0].balance

EthBlocks?

meteorのethereum:blocks
最新のブロック番号

EthBlocks.latest.number

最新ブロックのハッシュ値

EthBlocks.latest.hash

最新ブロックを採掘した採掘者のアドレス

EthBlocks.latest.miner

truffle

イーサリアムの開発フレームワークです。まずはインストール

npm install -g truffle

以下のサイトを参考
参考Ethereumアプリの開発フレームワークTruffle入門
参考【イーサリアム】 SolidityとTruffleでペットショップのDappをつくる!
エラーでたら、とりあえず

npm install --global windows-build-tools

OpenZeppelin?ライブラリを入れて、

npm i zeppelin-solidity
truffle develop

でコンソールに入って

compile
migrate

作ったコントラクトは、コンソールの中で、使える。

var tt = コントラクト.at(TutorialToken.address)
tt.transfer(web3.eth.accounts[2], 10e18)
コントラクト.deployed()

とやると、ABIが見える。app.jsとかをみてると、

deployed().then

とかあるけど、truffle-contract.jsに

deployed: function() 

があった。thenがいるから、Promiseなんだろうな。

Error: Could not find C:\dapps\hoge\node_modules\zeppelin-solidity\contracts\token\MintableToken?.sol from any sources

import "../node_modules/zeppelin-solidity/contracts/token/ERC20/MintableToken.sol";

にしてやる。ようはディレクトリ階層が違っていると当然駄目。

Error: VM Exception while processing transaction: revert

tt.transfer(web3.eth.accounts[2], 10e18)

でrevertされまくり。totalSupply_に15000とか小さい値を設定していた事が原因。 ちなみにWEBでひっかかるサンプルのソースのコンストラクタでは、totalSupplyってなっているけど、 zeppelin-solidity/contracts/token/ERC20/BasicToken?.solをみるとtotalSupply_になっているので、変わったのだろう。
追記
truffle developで

tt.transfer(web3.eth.accounts[4],8,{from:web3.eth.accounts[1],gas:500000});

これでもエラーが発生。うまくいくaccountもあり調べると

truffle(develop)> tt.balanceOf(web3.eth.accounts[1])
BigNumber { s: 1, e: 0, c: [ 5 ] }

で8 > 5になっていた。

tt.transfer(web3.eth.accounts[4],5,{from:web3.eth.accounts[1],gas:500000});

にするとうまくいき、

truffle(develop)> tt.balanceOf(web3.eth.accounts[1])
BigNumber { s: 1, e: 0, c: [ 0 ] }

となった。
token/ERC20/BasicToken?.solのfunction transferで

require(_value <= balances[msg.sender]);

となっているので、当然だった..

Error: VM Exception while processing transaction: revert その2

pragma solidity ^0.4.18;
import "../node_modules/zeppelin-solidity/contracts/token/ERC20/MintableToken.sol";
contract TestCoin is MintableToken {
  string public name = "TEST COIN";
  string public symbol = "TST";
  uint8 public decimals = 18;
}

としていたが、

contract TestCoin is MintableToken {
   string public name = "TEST COIN";
   string public symbol = "TST";
   uint8 public decimals = 18;
   uint public INITIAL_SUPPLY = 15000e18;
   function ArayaCoin() public {
       totalSupply_ = INITIAL_SUPPLY;
       balances[msg.sender] = INITIAL_SUPPLY;
   }
}

としてみた。

Browser-Solidity エラー

errored: Error encoding arguments: SyntaxError?: Unexpected token e in JSON at position 2

setMsg1とかでtestとかをセットしてやるとエラー。"test"とすると大丈夫

Warning: No visibility specified. Defaulting to "public". function Hoge() {

function Hoge() public {

とpublicをつける

Warning: "throw" is deprecated in favour of "revert()", "require()" and "assert()". throw;

throwは使うなということらしい。

if(!owner.send(this.balance)) {
  throw;
}

require(owner.send(this.balance));

にする。

ParserError?: Expected token Semicolon got 'Identifier' i++;

require(investors[i].addr.send(investors[i].amount))
i++

はrequireの最後に;が抜けていた...

require(investors[i].addr.send(investors[i].amount));
i++

Warning: Variable is declared as a storage pointer. Use an explicit "storage" keyword to silence this warning. Investor inv = investors[numInvestors++];

【Solidity基礎】storageとmemoryを参考にstorageとmemoryの違いを確認しながら、明示的に書けとのことなので、

Investor storage inv = investors[numInvestors++];

Warning: Function state mutability can be restricted to view

function getAdopters() public returns (address[16]) {

でワーニング

function getAdopters() public view returns (address[16]) {

に変更 【Ethereum】【Solidity0.4.16】viewとpure修飾子

Error: Attempting to run transaction which calls a contract function, but recipient address 0x8cdaf0cd259887258bc13a92c0a6da92698644c0 is not a contract address

これはtruffleでmigrateした時のエラーです。build/contracts/のjsonを消す。

Warning: Using contract member "balance" inherited from the address type is deprecated. Convert the contract to "address" type to access the member. to.transfer(this.balance);

to.transfer(this.balance);

to.transfer(address(this).balance);

に修正

"sha3" has been deprecated in favour of "keccak256"

sha3をkeccak256に書き換える

Function with same name and arguments defined twice.

function () public {
}
function () payable public {
}    

どっちかにしろってこと。

base fee exceeds gas limit

intrinsic gas too lowと表示されることもあるらしいのですが、transactionに設定されているgas limitが最小値よりも小さい時に発生します。

調査

fallback

function () public payable {

の場合、

eth.sendTransaction({to:rp.address,from:eth.accounts[0],value:web3.toWei(800,"ether")});

でコントラクトに送ると、実行されている。rpは

var rp = eth.constract(....

で設定している。

function () public {

とすると、実行されない。payableがついている関数はsendTransactionが呼ばれた時に発火するので、そりゃそうか。

eth.sendTransaction({from:rp.address,to:eth.accounts[0],value:web3.toWei(800,"ether")});

fromtoを逆にすると、これはエラーになる。コントラクトから送金したら駄目で、EOA(Externally Owned Account)からだとOK。なぜだ。

function transfer(address to, uint256 value) public {
    to.transfer(value);
}

を作って、

rp.transfer.sendTransaction(eth.accounts[1],web3.toWei(50,"ether"),{from:eth.accounts[1],gas:500000});

で送れた。zeppelin-solidityを見ていると、ERC20Basic.solでは、

contract ERC20Basic {
 function totalSupply() public view returns (uint256);
 function balanceOf(address who) public view returns (uint256);
 function transfer(address to, uint256 value) public returns (bool);
 event Transfer(address indexed from, address indexed to, uint256 value);
}

ってなっており、BasicToken?.solでtransferの実装をしているので、ないとだめなのかな。だいぶんfallbackと逸れた...

補完してくれない。

gethでタブで補完してくれるのだが、

var r4 = eth.contract(....

とかで作成しても、r4.でタブを押しても補完してくれない。

var rf = eth.contract(....

とか数値以外にすると、rf.でタブで、

rf._eth            rf.adpsender       rf.cntfallback     rf.sender
rf.abi             rf.allEvents       rf.constructor     rf.transactionHash
rf.address         rf.amount          rf.deposit         rf.transfer

とか補完してくれる...

MetaMask?で失敗する。

truffle unbox tutorialtoken

で作ったやつで、OpenZeppelinを活用してセキュアのコントラクトを書く を参考にやってみたのだが、

tt.transfer(web3.eth.accounts[3], 600e18)

した後でないと、MetaMask?でエラーがでる。

vm exception while processing transaction:revert

なぜだ...→単純に元のbalanceが0だったのでした...

TIPS

コマンド

Ethereum Geth コンソールコマンド一覧

Browser-Solidity

browser-solidity
なんかlocalにコネクトができなくなった...なので、
https://remix.ethereum.org/
からダイレクトに使ってます。

Web3 JavaScript app API

web3.eth.hashrateとかどんなのがあるかみたい時に。
Web3 JavaScript app API for 0.2x.x

Stringの比較

if (keccak256("hoge1") == keccak256("hoge2")) {

とする。

if ("hoge1" == "hoge2") {

ではなく、ハッシュ値で比較。

'is' keyword

Solidityでcontract A Is Bとかあるんだけど、Inheritanceなので継承。以下を読んでみると、Solidity supports multiple inheritanceなので、多重継承可。 インターフェイスではなかったのですね。
例)

contract StandardToken is ERC20, BasicToken {

参考:Solidity in Depth » Contracts

payable

Solidityのpayable modifier はETH の送金処理を受け取る際に使うmodifier。この受け取るがポイント。

BigNumber?

truffle(develop)>  var balance = new web3.BigNumber('1234567890.12345678901234567890');
undefined
truffle(develop)> balance.toString()
'1234567890.1234567890123456789'
truffle(develop)> balance
BigNumber { s: 1, e: 9, c: [ 1234567890, 12345678901234, 56789000000000 ] }

sとかeはなんなんやろ... s + eが整数の桁数ぽいが...

pureとview

view:データの読み取り専用で編集できない

function hoge() public view returns (string) {

pure:この関数の中の値しか使えない。つまり戻り値が関数のパラメーターのみに依存。

function hoge() public pure returns (string) {

リンク

ブロックチェーンの基本的な仕組み
git
[Japanese] Meteorを使ってDappを作ろう
ガスと取引コスト: Gas Limit と Gas Price とは?
技術者向け Ethereum(イーサリアム)の基礎知識
【Solidity基礎】storageとmemory
【Solidity基礎】modifier修飾子について
【Solidity基礎】view、pure関数修飾子
Solidity 言語仕様 コントラクト篇
constantとか調べさせていただきました。
ganache
Web開発者がスマートコントラクト開発で戸惑いがちなポイント7個
Truffle: Contract.call()が返すのはPromiseなのでハマった

crowdsale.token().then(addr => { tokenAddress = addr } )

var tokenAddress = crowdsale.token();

ではまりました... どちらも

truffle(develop)> tokenAddress
'0xf2beae25b23f0ccdd234410354cb42d08ed54981'

と同じ値を返すくせに前者は、

truffle(develop)> tokenAddress.toString()
'0xf2beae25b23f0ccdd234410354cb42d08ed54981'

で後者は、

truffle(develop)> tokenAddress.toString()
'[object Promise]'

になっていた...
【Solidity基礎】型の種類
EthereumのsendTransaction時のvalidationエラー一覧
EthereumのBest Practiceが適用されたICO Crowdsale(クラウドセール)のコードを書いてみる
Ethereumテストネット上でクラウドセール(Crowdsale)を開催する
Truffle で始める Ethereum 入門 - ERC20 トークンを作ってみよう
とても丁寧に説明されています。solidityも0.4.18です。
ContractのEventの仕組み
EventはTransactionReceipt?のLogに書き込まれるのか。
Ropstenのテストネット上でERC20トークンを作成・送付してみる
そのうちやってみよう。
テストネットRopstenで1ETHをもらう
どんぐりコインを作ってみた
これもそのうちやってみる。live環境にデプロイってやつ。
BATトークンのスマートコントラクトを全行コメント解説
ソースにコメントがあるので、ありがたい!
ERC-20 Token Standard に準拠した独自トークンを自前実装する
上と同様にコメントがあり、助かります!後、approveとかわかりやすかったです。
イーサリアム上のDApp開発をゲームを作って学びましょう
むちゃくちゃよく出来ている!

参考書籍

Ethereum入門

コメント

  • #comment

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-05-13 (月) 20:59:56 (1813d)