#author("2018-04-05T13:40:40+09:00","default:zzr12000","zzr12000")
#author("2019-05-13T20:59:55+09:00","default:zzr12000","zzr12000")
* [[geth]] [#hd342b09]
#contents
[[Download Geth >https://geth.ethereum.org/downloads/]]よりダウンロードしてインストール~
実行~
毎回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
でもよし

**コマンド [#ja9545e2]
***アカウント作成 [#jf5d561d]
 personal.newAccount("test1")
***アカウント一覧 [#i5005558]
 eth.accounts
***マイニングするアカウントの確認 [#o3153b15]
 eth.coinbase
***送金 [#e404ba13]
 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のパスワード
***残高 [#n23cce39]
 web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
***アンロック アンロックの時間はデフォルト300秒 [#qc01fe66]
 personal.unlockAccount(アドレス, "パスワード", "アンロックの時間(秒)")
 personal.unlockAccount(アドレス)
***トランザクション確認 #送金でトランザクションIDが表示されている [#q6cbbb9d]
 eth.getTransaction('トランザクションID')
***トランザクションレシート [#u2085276]
トランザクションが発行されて、マイニングが行われたら、確認できる。それまではnull
 eth.getTransactionReceipt('トランザクションID')
***ブロック確認 [#e03e4cc1]
 eth.getBlock(ブロック番号);
***ブロックの中身を取得 [#pf008a01]
 eth.getTransactionFromBlock()
***ペンディングトランザクションを確認 [#xf6bbc90]
送金処理が完了しブロックに取り込まれると発行
 eth.pendingTransactions
***ハッシュレート [#e5e905c3]
 eth.hashrate
***トランザクションのトレース [#te4e8a29]
なんかわかるかも
 debug.traceTransaction('アドレス');
こんな感じでfailedの情報が表示されていた。
 {
  failed: false,
  gas: 61484,

接続数確認
 net.peerCount
**meteor [#pa33047f]
ここでは関係ないです。ただのフレームワーク。後で分けます..~
bootstrapとsessionはどうでもいいけど、いつもつかっているので。
 meteor add twbs:bootstrap 
 meteor add ethereum:web3
 meteor add ethereum:accounts
 meteor add ethereum:blocks
 meteor add session
**EthAccounts [#gc283b26]
meteorのethereum:accounts~
1番目のアカウントの名前
 EthAccounts.find().fetch()[0].name
1番目のアカウントのアドレス
 EthAccounts.find().fetch()[0].address
1番目のアカウントのEtherの残高
 EthAccounts.find().fetch()[0].balance

**EthBlocks [#b1f85ebb]
meteorのethereum:blocks~
最新のブロック番号
 EthBlocks.latest.number
最新ブロックのハッシュ値
 EthBlocks.latest.hash
最新ブロックを採掘した採掘者のアドレス
 EthBlocks.latest.miner

**truffle [#q96f89da]
イーサリアムの開発フレームワークです。まずはインストール
 npm install -g truffle
以下のサイトを参考~
参考[[Ethereumアプリの開発フレームワークTruffle入門>http://ykubot.com/2018/01/02/ethereum-truffle/]]~
参考[[【イーサリアム】 SolidityとTruffleでペットショップのDappをつくる!>https://zoom-blc.com/how-to-create-first-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 [#v6224ab0]
 import "../node_modules/zeppelin-solidity/contracts/token/ERC20/MintableToken.sol";
にしてやる。ようはディレクトリ階層が違っていると当然駄目。
***Error: VM Exception while processing transaction: revert [#bcd3eb26]
 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 [#k846e56b]
 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 エラー [#cd7ab2d3]
***errored: Error encoding arguments: SyntaxError: Unexpected token e in JSON at position 2 [#f7e875da]
setMsg1とかでtestとかをセットしてやるとエラー。"test"とすると大丈夫
***Warning: No visibility specified. Defaulting to "public". function Hoge() { [#lbab7bd1]
 function Hoge() public {
とpublicをつける
***Warning: "throw" is deprecated in favour of "revert()", "require()" and "assert()".	throw; [#wc645a52]
throwは使うなということらしい。
 if(!owner.send(this.balance)) {
   throw;
 }
を
 require(owner.send(this.balance));
にする。
***ParserError: Expected token Semicolon got 'Identifier' i++; [#kb9df5d0]
 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++]; [#pdd7ad21]
[[【Solidity基礎】storageとmemory>https://tomokazu-kozuma.com/what-is-storage-and-memory-in-solidity/]]を参考にstorageとmemoryの違いを確認しながら、明示的に書けとのことなので、
 Investor storage inv = investors[numInvestors++];
***Warning: Function state mutability can be restricted to view [#s7d860ea]
 function getAdopters() public returns (address[16]) {
でワーニング
 function getAdopters() public view returns (address[16]) {
に変更
[[【Ethereum】【Solidity0.4.16】viewとpure修飾子>https://inon29.hateblo.jp/entry/2017/11/21/093318]]
***Error: Attempting to run transaction which calls a contract function, but recipient address 0x8cdaf0cd259887258bc13a92c0a6da92698644c0 is not a contract address [#o05999c3]
これは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); [#yb73f70e]
 to.transfer(this.balance);
を
 to.transfer(address(this).balance);
に修正
*** "sha3" has been deprecated in favour of "keccak256" [#o1946103]
sha3をkeccak256に書き換える
***Function with same name and arguments defined twice. [#cf8e7255]
 function () public {
 }
 function () payable public {
 }    
どっちかにしろってこと。
***base fee exceeds gas limit [#yd13089b]
intrinsic gas too lowと表示されることもあるらしいのですが、transactionに設定されているgas limitが最小値よりも小さい時に発生します。
** 調査 [#d9f57302]
***fallback [#v138787e]
 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>https://openzeppelin.org/]]を見ていると、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と逸れた...


***補完してくれない。 [#o352e3d6]
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で失敗する。 [#ffa4130c]
 truffle unbox tutorialtoken
で作ったやつで、[[OpenZeppelinを活用してセキュアのコントラクトを書く>https://qiita.com/blueplanet/items/c372ff82efc9f82268de]]
を参考にやってみたのだが、
 tt.transfer(web3.eth.accounts[3], 600e18)
した後でないと、MetaMaskでエラーがでる。
 vm exception while processing transaction:revert
なぜだ...→単純に元のbalanceが0だったのでした...

** TIPS [#u718817d]
***コマンド [#n7828c90]
[[Ethereum Geth コンソールコマンド一覧>https://qiita.com/toshikase/items/fa7a826db483177d1e80]]~
***Browser-Solidity [#n44aaccb]
[[browser-solidity>https://ethereum.github.io/browser-solidity/]]~
なんかlocalにコネクトができなくなった...なので、~
[[https://remix.ethereum.org/]]~
からダイレクトに使ってます。

***Web3 JavaScript app API [#i624d05e]
web3.eth.hashrateとかどんなのがあるかみたい時に。~
[[Web3 JavaScript app API for 0.2x.x>https://github.com/ethereum/wiki/wiki/JavaScript-API]]
***Stringの比較 [#ne8bc504]
 if (keccak256("hoge1") == keccak256("hoge2")) {
とする。
 if ("hoge1" == "hoge2") {
ではなく、ハッシュ値で比較。

*** 'is' keyword [#tff2afbe]
Solidityでcontract A Is Bとかあるんだけど、Inheritanceなので継承。[[以下>http://solidity.readthedocs.io/en/develop/contracts.html#inheritance]]を読んでみると、Solidity supports multiple inheritanceなので、多重継承可。
インターフェイスではなかったのですね。~
例)
 contract StandardToken is ERC20, BasicToken {
参考:[[Solidity in Depth » Contracts>http://solidity.readthedocs.io/en/develop/contracts.html#inheritance]]~

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

***BigNumber [#vd6ba3ef]
 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 [#s58be52d]
view:データの読み取り専用で編集できない
 function hoge() public view returns (string) {
pure:この関数の中の値しか使えない。つまり戻り値が関数のパラメーターのみに依存。
 function hoge() public pure returns (string) {

** リンク [#u3762743]
[[ブロックチェーンの基本的な仕組み>https://blockchain-jp.com/guides/4]]~
[[git>https://git-scm.com/download/win]]~
[[[Japanese] Meteorを使ってDappを作ろう>https://github.com/ethereum/wiki/wiki/%5BJapanese%5D-Meteor%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6Dapp%E3%82%92%E4%BD%9C%E3%82%8D%E3%81%86]]~
[[ガスと取引コスト: Gas Limit と Gas Price とは?>http://block-chain.jp/tech/gas-limit-gas-price/]]~
[[技術者向け Ethereum(イーサリアム)の基礎知識>http://block-chain.jp/ethereum/ethereum-basics-for-engineer/]]~
[[【Solidity基礎】storageとmemory>https://tomokazu-kozuma.com/what-is-storage-and-memory-in-solidity/]]~
[[【Solidity基礎】modifier修飾子について>https://tomokazu-kozuma.com/what-is-modifier-in-solidity/]]~
[[【Solidity基礎】view、pure関数修飾子>https://tomokazu-kozuma.com/what-is-view-and-pure-modifiers-in-solidity/]]~
[[Solidity 言語仕様 コントラクト篇>https://qiita.com/blueplanet/items/08a86785f8dcdc6cffe9]]~
constantとか調べさせていただきました。~
[[ganache>http://truffleframework.com/ganache/]]~
[[Web開発者がスマートコントラクト開発で戸惑いがちなポイント7個>https://qiita.com/kyamuise/items/a5bdd0787b1820f84e7a]]~
[[Truffle: Contract.call()が返すのはPromiseなのでハマった>https://qiita.com/bathtimefish/items/c4b93a7f8d8ae3f76de8]]~
 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基礎】型の種類>https://tomokazu-kozuma.com/data-type-of-solidity/]]~
[[EthereumのsendTransaction時のvalidationエラー一覧>http://y-nakajo.hatenablog.com/entry/2018/01/26/173543]]~
[[EthereumのBest Practiceが適用されたICO Crowdsale(クラウドセール)のコードを書いてみる>https://wakuwaku-currency.com/investment/ico/ico-crowdsale-openzeppelin-truffle-html.html]]~
[[Ethereumテストネット上でクラウドセール(Crowdsale)を開催する>https://wakuwaku-currency.com/virtual-currency/ethereum/testnet-crowdsale-ethereum.html]]~
[[Truffle で始める Ethereum 入門 - ERC20 トークンを作ってみよう>https://qiita.com/amachino/items/8cf609f6345959ffc450]]~
とても丁寧に説明されています。solidityも0.4.18です。~
[[ContractのEventの仕組み>http://y-nakajo.hatenablog.com/entry/2017/12/06/144220]]~
EventはTransactionReceiptのLogに書き込まれるのか。~
[[Ropstenのテストネット上でERC20トークンを作成・送付してみる>https://tech.pepabo.com/2017/12/06/erc20-token-on-ropsten/]]~
そのうちやってみよう。~
[[テストネットRopstenで1ETHをもらう>https://qiita.com/benridane/items/92a4af35d9b8a96b7d6f]]~
[[どんぐりコインを作ってみた>https://dongri.github.io/2018/03/%E3%81%A9%E3%82%93%E3%81%90%E3%82%8A%E3%82%B3%E3%82%A4%E3%83%B3%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/]]~
これもそのうちやってみる。live環境にデプロイってやつ。~
[[BATトークンのスマートコントラクトを全行コメント解説>https://qiita.com/ggtmtmgg/items/593f19310499225bb7ad]]~
ソースにコメントがあるので、ありがたい!~
[[ERC-20 Token Standard に準拠した独自トークンを自前実装する>https://qiita.com/kyrieleison/items/a5c049097c165cd792bf]]~
上と同様にコメントがあり、助かります!後、approveとかわかりやすかったです。~
[[イーサリアム上のDApp開発をゲームを作って学びましょう>https://cryptozombies.io/jp/]]~
むちゃくちゃよく出来ている!~
** 参考書籍 [#i8720c14]
[[Ethereum入門>https://book.ethereum-jp.net/]]

** コメント [#s2a63701]
-#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS