geth †
Download Geth よりダウンロードしてインストール 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 †ここでは関係ないです。ただのフレームワーク。後で分けます.. meteor add twbs:bootstrap meteor add ethereum:web3 meteor add ethereum:accounts meteor add ethereum:blocks meteor add session EthAccounts? †meteorのethereum:accounts 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 以下のサイトを参考 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_になっているので、変わったのだろう。 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 ] } となった。 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 †コマンド †Browser-Solidity †browser-solidity Web3 JavaScript app API †web3.eth.hashrateとかどんなのがあるかみたい時に。 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) { リンク †ブロックチェーンの基本的な仕組み 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]' になっていた... 参考書籍 †コメント †
|