#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