ゼロから始めるEthereum

# はじまりは・・・。
まず、はじめた経緯はお仕事。
おおよそ1ヶ月ほど四苦八苦して独自トークンをRopstenにデプロイするところまでは行けた。

でも、そこまで。
やはり少し困ったこともある。
基本的に今までやって来たｗｅｂアプリの概念が抜けないこと。
IDとかアカウントとかオーナーとか、そのへんどうなってんの？

# トークンを作る
作ったトークンはこんな感じ
ICOやSolidityのことを書いてるブログをいくつも参考して書いてみた。

+ [truffle](https://github.com/trufflesuite/truffle)
+ [zeppelin-solidity](https://github.com/OpenZeppelin/zeppelin-solidity)
+ [truffle-hdwallet-provider](https://github.com/trufflesuite/truffle-hdwallet-provider)

```console.
$ npm install -g truffle
$ truffle init
$ npm install zeppelin-solidity --save
```

```minaToken.sol
pragma solidity ^0.4.18;
import "zeppelin-solidity/contracts/token/ERC20/StandardToken.sol";

contract minaToken is StandardToken {
  string public name = "minaToken";
  string public symbol = "MNTK";
  uint public decimals = 3;
  uint public INITIAL_SUPPLY = 10000 * (10 ** decimals);
  address public owner;

  function minaToken() public {
    totalSupply_ = INITIAL_SUPPLY;
    balances[msg.sender] = INITIAL_SUPPLY;
    owner = msg.sender;
  }
}
```

```2_deploy_contract.js
const minaToken = artifacts.require('./minaToken.sol')

module.exports = function(deployer) {
  deployer.deploy(minaToken)
}
```

基本的にこれくらいであとは、truffle.jsに、Ropstenの設定。
Privateは、別に入れてる[Ganache-cli](https://github.com/trufflesuite/ganache-core)だったりするけけど、その辺は割愛。
あとはRopstenにデプロイするのに[INFURA](https://infura.io/)に登録したのと[METAMASK](https://metamask.io/)を入れたことくらい。このあたりの解説は他でも沢山やってる。

```truffle.js
var HDWalletProvider = require("truffle-hdwallet-provider");
var mnemonic = process.env.ROPSTEN_MNEMONIC;
var accessToken = process.env.INFURA_ACCESS_TOKEN;

module.exports = {
    // See <http://truffleframework.com/docs/advanced/configuration>
    // to customize your Truffle configuration!
  networks: {
    private: {
        host: "localhost",
        port: 7545,
        network_id: "*",
        gas: 4721975,
        gasPrice: 20000000000
    },
    ropsten: {
      provider: function() {
        return new HDWalletProvider(
          mnemonic,
          "https://ropsten.infura.io/" + accessToken
        );
      },
      network_id: 3,
      gas: 4721975,
      gasPrice: 20000000000
    }
  }
};
```

それでこれを・・・

```console.
$ truffle compile
$ truffle migrate --network ropsten
```
して、Ropstenにデプロイする訳だけど、その前にｐｒｉｖａｔｅにデプロイして問題がないかは確認は行う。
ここまでは、良い。

ここから・・なのですよね。

#前置き長くて何がしたいか？
基本的にここまではいろんなBlogや何かで書かれてること。
これを元に知りたいことがいくつか

##「Tokenが足りないから、もう一度追加発行してみたい」
zeppelin-solidityのMintableが使えるかもと、試行錯誤。

```minaMintable.sol
pragma solidity ^0.4.18;

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

contract minaMintable is MintableToken, minaToken {
    address public owner;
    function minaMintable() public {

        owner = msg.sender;
    }
}
```

```3_deploy_mintable.js
const Mintable = artifacts.require('./minaMintable.sol')

module.exports = function(deployer) {
    deployer.deploy(Mintable)
}
```
こういうのをやってみたけど、元のところでなくて新しいトークンが発行されてた。
Migrationのところが同じだから続いてるのじゃないか？という考えだったけど、別っぽい。
あとはTokenのコントラクトアドレスを、これのOwnerに指定してみたりとか・・・何だかうまく行かなかった。
考え方が違うのだろうな・・・。

## 「一度デプロイしたトークンを破棄してみたい」
これ以前に実験でデプロイしたminaTokenがあって、別のコントラクトアドレスで存在するのだけど、そこのトークンを操作しようとできないから、いっそ無駄だし破棄しちゃいたい。
・・・でも、コントラクトアドレスが分かるだけで破棄もできない。

## 「ハードフォークとかソフトフォークとかってことよね」
実際、元のスマートコントラクト相手にちょっと追加したいとか、取り消ししたいとか、できるはずなんだけど・・・やり方がいまいち不明。

そんな感じにちょっと困ってる。
調べてみようかと、でも、分かってることをとりあえず残すこととしたのが、これ、きっかけ。