soudegesu / blog

soudegesu's blog post
https://www.soudegesu.com/
1 stars 0 forks source link

Chainlistアプリケーションを作ってみる #59

Closed soudegesu closed 6 years ago

soudegesu commented 6 years ago

ここを参考にする

soudegesu commented 6 years ago
            if (typeof web3 !== 'undefined') {
                  // reuse the provider of the web3 object injected by Metamask
                  App.web3Provider = web3.currentProvider;
            }
soudegesu commented 6 years ago

submitする時に MetaMaskがインターセプトする

soudegesu commented 6 years ago

MetaMaskはだいぶbuggyなのね

soudegesu commented 6 years ago

npm run truffle-console ではよくこれを実行する

ChainList.deployed().then(function(instance){app = instance;})
soudegesu commented 6 years ago
sellEvent = app.LogSellArticle({},{}).watch(function(error, event){console.log(event);})
app.sellArticle("article 1", "Description of article 1", web3.toWei(10, "ether"), {from: web3.eth.accounts[1]})
soudegesu commented 6 years ago

solidity におけるイベントは特定の処置をwatchしたりフックしたりしたい場合に定義すればよいのか? なぜ普通にfunctionに書かないのだろうか。。

トランザクションの情報も合わせて取得したい場合なのだろうか

{ logIndex: 0,
  transactionIndex: 0,
  transactionHash: '0xb6a93bc00b33c6db4bcfc79f4d33b9cba7830f0ecfbc0f5f292de2cab42263e5',
  blockHash: '0x2b3ff8d7a31bd93463af646babc82d6cd5f020090e2f22f6ba9397779f651950',
  blockNumber: 3,
  address: '0x345ca3e014aaf5dca488057592ee47305d9b3e10',
  type: 'mined',
  event: 'LogSellArticle',
  args:
   { _seller: '0x627306090abab3a6e1400e9345bc60c78a8bef57',
     _name: 'Default article',
     _price: BigNumber { s: 1, e: 19, c: [Array] } } }
soudegesu commented 6 years ago

BigNumber { s: 1, e: 0, c: [ 1 ] } って何よ

soudegesu commented 6 years ago

storage って何よ

soudegesu commented 6 years ago

memoryって何よ

soudegesu commented 6 years ago

Event てどうして必要よ

soudegesu commented 6 years ago

後で読む https://solidity.readthedocs.io/en/v0.4.21/index.html

soudegesu commented 6 years ago

deactivateの仕方

soudegesu commented 6 years ago

deactivateはコントラクトオーナーだけが実行可能

soudegesu commented 6 years ago

こんなfunctionを作成して実行してみる

  // deactivate the contract
  function kill() {
    // only allow the contract owner
    require(msg.sender == owner);

    selfdestruct(owner);
  }
truffle(ganache)> app.kill({from: web3.eth.accounts[1]})
Error: VM Exception while processing transaction: revert
    at Object.InvalidResponse (/Users/takaaki-suzuki/private/chainlist-sample/node_modules/truffle/build/cli.bundled.js:41484:16)
    at /Users/takaaki-suzuki/private/chainlist-sample/node_modules/truffle/build/cli.bundled.js:329530:36
    at /Users/takaaki-suzuki/private/chainlist-sample/node_modules/truffle/build/cli.bundled.js:325200:9
    at XMLHttpRequest.request.onreadystatechange (/Users/takaaki-suzuki/private/chainlist-sample/node_modules/truffle/build/cli.bundled.js:328229:7)
    at XMLHttpRequestEventTarget.dispatchEvent (/Users/takaaki-suzuki/private/chainlist-sample/node_modules/truffle/build/cli.bundled.js:176415:18)
    at XMLHttpRequest._setReadyState (/Users/takaaki-suzuki/private/chainlist-sample/node_modules/truffle/build/cli.bundled.js:176705:12)
    at XMLHttpRequest._onHttpResponseEnd (/Users/takaaki-suzuki/private/chainlist-sample/node_modules/truffle/build/cli.bundled.js:176860:12)
soudegesu commented 6 years ago

自分のアカウントであればいける

truffle(ganache)> app.kill({from: web3.eth.accounts[0]})
{ tx: '0x20dd7863da4d79939c026e890e21a16832e55b0410adc8d9826414e806928f96',
  receipt:
   { transactionHash: '0x20dd7863da4d79939c026e890e21a16832e55b0410adc8d9826414e806928f96',
     transactionIndex: 0,
     blockHash: '0x9d5a1f050bb9b14c3dfb5061e82584050fce8d7636e93d93186b1c4f5b4825dd',
     blockNumber: 8,
     gasUsed: 13467,
     cumulativeGasUsed: 13467,
     contractAddress: null,
     logs: [],
     status: 1 },
  logs: [] }
soudegesu commented 6 years ago

全ての自身のコントラクトがresetされた

truffle(ganache)> app.getArticlesForSale()
[]
soudegesu commented 6 years ago

selfdestruct されたアカウントからのETHの出入りは動かなくなるが、 他アカウントでは問題なく動かせる。

soudegesu commented 6 years ago

アカウントアドレスのDNSサービスがある https://ens.domains/#

soudegesu commented 6 years ago

関数の修正に使う modifier 宣言

soudegesu commented 6 years ago

modifierは何もreturnしない。引数もとらない。 modifier内の _ はmodifierが適用される関数を表すplaceholderになる

soudegesu commented 6 years ago

modifier はAOPみたいな動きをするのね。

  // modifiers
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  // deactivate the contract
  function kill() public onlyOwner {
    selfdestruct(owner);
  }
soudegesu commented 6 years ago

https://github.com/soudegesu/chainlist-sample