ブロックチェーン学習一MAC上の太坊私有チェーン構築

11972 ワード

ブロックチェーン学習一MAC上の太坊私有チェーン構築
ラベル(スペース区切り):ブロックチェーン
MAC上のイーサー坊プライベートチェーン構築
go-ethereumクライアントインストール
brew tap ethereum/ethereum
brew install ethereum

インストールが完了したらコマンドラインに入力
geth --help //         ,         

プライベートチェーンの構築
イーサー坊はカスタム創世ブロックをサポートし、プライベートチェーンを実行するには、独自の創世ブロックを定義し、創世ブロック情報をjson形式のプロファイルに書く必要があります.まず、genesis.jsonなどのjsonファイルに次の内容を保存します.ps:詳細は参照:here
{
  "config": {
        "chainId": 10, 
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
  "alloc"      : {},
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x20000",
  "extraData"  : "",
  "gasLimit"   : "0x2fefd8",
  "nonce"      : "0x0000000000000042",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00"
}

ps:公式サイトから直接コピーし、chainIdは0ですが、契約配置に問題が発生するため、ここで10に変更します.
二、初期化:創世ブロックに書き込む
創世ブロック構成ファイルを準備したら、ブロックチェーンを初期化し、上の創世ブロック情報をブロックチェーンに書き込む必要があります.まず、ブロックチェーンデータを格納するためのディレクトリを新規作成します.新規のデータディレクトリが~/privatechain/data0であると仮定します.genesis.jsonは~/privatechainに保存されます.この場合、ディレクトリ構造は次のようになります.
privatechain
├── data0
└── genesis.json

次にprivatechainに入り、初期化コマンドを実行します.
$ cd privatechain
$ geth --datadir data0 init genesis.json

上のコマンドの主体はgeth init初期化ブロックチェーンを示し、コマンドにはオプションとパラメータが付いていてもよいが、そのうち--datadirオプションの後にディレクトリ名が付いている.ここでdata 0で、指定データ格納ディレクトリがdata0genesis.jsoninitコマンドのパラメータである.
上記のコマンドを実行するとgenesis.jsonファイルが読み込まれ、その内容に基づいて創世ブロックがブロックチェーンに書き込まれます.以下の出力が表示された場合は、初期化に成功しました.
WARN [02-27|15:54:14] No etherbase set and no accounts found as default 
INFO [02-27|15:54:14] Allocated cache and file handles         database=/Users/wangsanjun/privatechain/data0/geth/chaindata cache=16 handles=16
INFO [02-27|15:54:14] Writing custom genesis block 
INFO [02-27|15:54:14] Successfully wrote genesis state         database=chaindata                                           hash=5e1fc7…d790e0
INFO [02-27|15:54:14] Allocated cache and file handles         database=/Users/wangsanjun/privatechain/data0/geth/lightchaindata cache=16 handles=16
INFO [02-27|15:54:14] Writing custom genesis block 
INFO [02-27|15:54:14] Successfully wrote genesis state         database=lightchaindata                                           hash=5e1fc7…d790e0

初期化に成功すると、gethとkeystoreの2つのフォルダがデータディレクトリdata 0に生成され、ディレクトリ構造は次のようになります.
privatechain
├── data0
│   ├── geth
│   │   └── chaindata
│   │       ├── 000002.ldb
│   │       ├── 000003.log
│   │       ├── CURRENT
│   │       ├── LOCK
│   │       ├── LOG
│   │       └── MANIFEST-000004
│   └── keystore
└── genesis.json

ここでgeth/chaindataにはブロックデータが格納され、keystoreにはアカウントデータが格納されます.
三、プライベートチェーンノードの起動
初期化が完了すると、独自のプライベートチェーンがあり、その後、独自のプライベートチェーンノードを起動し、いくつかの操作を行うことができます.端末に次のコマンドを入力すると、ノードを起動できます.
geth --datadir data0 --networkid 1108 console

上のコマンドの主体はgeth console、ノードを起動してインタラクティブコンソールに入ることを示す--datadirオプション指定使用data0データディレクトリとして--networkidオプションの後ろに数字が付いている.ここで1108、このプライベートチェーンを指定するネットワークidが1108であることを示す.ネットワークidは他のノードに接続する際に用いられるが,イーサ坊パブリックネットワークのネットワークidは1であり,パブリックチェーンネットワークと衝突しないようにプライベートチェーンノードを実行する際には独自のネットワークidを指定する.
上のコマンドを実行すると、ブロックチェーンノードが起動し、Javascript Consoleに入ります.
...
Welcome to the Geth JavaScript console!

instance: Geth/v1.7.3-stable/darwin-amd64/go1.9.2
 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

これはインタラクティブなJavascript実行環境で、>がコマンドプロンプトであるJavascriptコードを実行できます.この環境には、エーテル坊を操作するためのJavascriptオブジェクトも内蔵されており、これらのオブジェクトを直接使用することができます.これらのオブジェクトは主に次のとおりです.
  • eth:操作ブロックチェーンに関するいくつかの方法を含む
  • net:以下のp 2 pネットワークの状態を見る方法を含む
  • admin:管理ノードに関するいくつかの方法を含む
  • miner:掘削開始&停止の方法を含む
  • personal:主に口座の管理方法が含まれている
  • txpool:取引メモリプールの表示方法を含む
  • web 3:上記の対象を含め、単位換算の方法もいくつか含まれる
  • Javascript Consoleの探索
    エーテル坊Javascript Consoleに入ると、ブロックや取引の表示、口座の作成、鉱山の掘削、取引の送信、スマート契約の導入など、内蔵オブジェクトを使用して操作することができます.次に、Javascript Consoleで実行されるコマンドを前に示すいくつかの一般的な機能について説明します.
    一、口座の作成
    以前はプライベートチェーンを構築しただけで、自分のアカウントはありません.js consoleにeth.accountsを入力して検証することができます.
    > eth.accounts
    []
    

    次にpersonalオブジェクトを使用してアカウントを作成します.
    > personal.newAccount()
    Passphrase: 
    Repeat passphrase: 
    "0x0416f04c403099184689990674f5b4259dc46bd8"
    

    パスワードの入力とパスワードの確認を求めるメッセージが表示されます.パスワードを入力しても表示されません.入力すればいいです.その後、新しく作成したアカウントアドレスが表示されます.
    複数のアカウントを作成して、アカウントを作成します.
    > personal.newAccount()
    Passphrase: 
    Repeat passphrase: 
    "0xb89bf2a212484ef9f1bd09efcd57cf37dbb1e52f"
    

    次に、作成した2つのアカウントを表示します.
    > eth.accounts
    ["0x0416f04c403099184689990674f5b4259dc46bd8", "0xb89bf2a212484ef9f1bd09efcd57cf37dbb1e52f"]
    

    アカウントはデフォルトでデータディレクトリのkeystoreフォルダに保存されます.ディレクトリ構造を見ると、data 0/keystoreに2つのファイルが追加されていることがわかります.この2つのファイルは、さっき作成した2つのアカウントに対応しています.これはjson形式のテキストファイルです.表示を開くことができます.秘密鍵がパスワードで暗号化された情報が保存されています.
    > eth.accounts
    data0
    ├── geth
    │   ├── chaindata
    │   ├── LOCK
    │   ├── nodekey
    │   └── nodes
    ├── geth.ipc
    ├── history
    └── keystore
        ├── UTC--2018-02-27T07-57-28.597232912Z--0416f04c403099184689990674f5b4259dc46bd8
        └── UTC--2018-02-27T07-57-56.330785628Z--b89bf2a212484ef9f1bd09efcd57cf37dbb1e52f
    

    ヒント:コマンドはすべてTabキーを押して自動的に補完することができます.
    二、口座残高の表示
    ethオブジェクトは、口座残高を表示する方法を提供します.
    > eth.getBalance(eth.accounts[0])
    0
    > eth.getBalance(eth.accounts[1])
    0
    

    現在、2つの口座のエーテルコインの残高はいずれも0で、口座に残高を持たせるには、他の口座から振り替えたり、鉱山を掘ったりしてエーテルコインの奨励金を得ることができます.
    三、起動&掘削停止
    miner.start()を使用して掘削を開始します.
    > miner.start(1)
    

    このうちstartのパラメータは、掘削に使用するスレッド数を示している.初めて掘削会さんが掘削に必要なDAGファイルを起動します.この過程は少し遅く、進度が100%に達すると、掘削を開始します.この時、スクリーンは掘削情報で表示されます.
    掘削を停止したい場合は、js consoleに入力miner.stop():
    > miner.stop()
    

    注意:入力された文字は、掘削画面の情報に流されます.大丈夫です.完全なminer.stop()を入力してから車に戻れば、掘削を停止できます.
    1つのブロックを掘ると5つのエーテルドルが奨励され、鉱山を掘って得た奨励金は鉱夫の口座に入ります.この口座はcoinbaseと呼ばれ、デフォルトではcoinbaseはローカル口座の最初の口座です.
    > eth.coinbase
    "0x0416f04c403099184689990674f5b4259dc46bd8"
    

    現在のcoinbaseはアカウント0ですので、マイニング奨励金を他のアカウントに入れるには、miner.setEtherbase()で他のアカウントをcoinbaseに設定すればいいです.
    > miner.setEtherbase(eth.accounts[1])
    true
    > eth.coinbase
    "0xb89bf2a212484ef9f1bd09efcd57cf37dbb1e52f"
    

    私たちはやはり口座0をcoinbaseとして、ブロックを掘った後、口座0の中に残高があるはずです.
    > eth.getBalance(eth.accounts[0])
    340000000000000000000
    
    getBalance()戻り値の単位はweiweiエーテルの最小単位で、1個エーテル=10の18次方wei.Ethernet通貨の数を確認するには、web3.fromWei()戻り値をEthernet通貨に換算します.
    > web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
    340
    

    四、取引の発送
    現在、口座1の残高は0です.
    > eth.getBalance(eth.accounts[1])
    0
    

    取引を送信することで、口座0から5つのエーテルドルを口座1に移すことができます.
    > amount = web3.toWei(5,'ether')
    "5000000000000000000"
    > eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
    Error: authentication needed: password or unlock
        at web3.js:3143:20
        at web3.js:6347:15
        at web3.js:5081:36
        at :1:1
    

    ここでは、口座が一定時間ごとにロックされているため、取引を送信するには、まず口座をロック解除しなければなりません.口座0から取引を送信するため、口座0をロック解除します.
    > personal.unlockAccount(eth.accounts[0])
    Unlock account 0x0416f04c403099184689990674f5b4259dc46bd8
    Passphrase: 
    true
    

    アカウントの作成時に設定したパスワードを入力すると、アカウントのロック解除に成功します.取引を送信します.
    > amount = web3.toWei(5,'ether')
    "5000000000000000000"
    > eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
    INFO [02-27|16:12:33] Submitted transaction                    fullhash=0x94a9bacda11313ddce58d1a47555aaf59ab5614bb3c8eb4b423f46464b8507f9 recipient=0xb89bf2a212484ef9f1bd09eFcd57Cf37dBb1E52f
    "0x94a9bacda11313ddce58d1a47555aaf59ab5614bb3c8eb4b423f46464b8507f9"
    

    この時点で、トランザクションはブロックチェーンにコミットされ、トランザクションのhashが返されますが、まだ処理されていません.これは、txpoolを表示することによって検証できます.
    > txpool.status
    {
      pending: 1,
      queued: 0
    }
    

    pendingの取引があり、pendingはコミットされたがまだ処理されていない取引を表します.
    取引を処理するには、鉱山を掘らなければならない.ここでは掘削を開始し、ブロックが掘られるのを待ってから掘削を停止します.
    > miner.start(1);admin.sleepBlocks(1);miner.stop();
    
    miner.stop()trueに戻ると、txpoolpendingの取引数は0となり、取引が処理されたことを示します.
    > txpool.status
    {
      pending: 0,
      queued: 0
    }
    

    この時、取引はすでに発効し、口座1はすでに5つのエーテルドルを受け取ったはずです.
    > web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')
    5
    

    五、取引とブロックの表示
    ethオブジェクトは、トランザクションとブロック情報を表示する方法をカプセル化します.
    現在のブロックの合計数を表示するには、次の手順に従います.
    > eth.blockNumber
    69
    

    取引hashによる取引の表示:
    > eth.getTransaction("0x94a9bacda11313ddce58d1a47555aaf59ab5614bb3c8eb4b423f46464b8507f9")
    {
      blockHash: "0x5d410b4147a06bf4e0cfc27ca84f9854f6e879cd254185ef811a81f799ed0eb6",
      blockNumber: 69,
      from: "0x0416f04c403099184689990674f5b4259dc46bd8",
      gas: 90000,
      gasPrice: 18000000000,
      hash: "0x94a9bacda11313ddce58d1a47555aaf59ab5614bb3c8eb4b423f46464b8507f9",
      input: "0x",
      nonce: 0,
      r: "0xbb46294248e5c31ae6d371fd5a6dedbad4d346383b5eff94066e69e927c9cb5e",
      s: "0x4ece28bd523c97ac2a7089693a217bc0092a482c27d50a435dcd2421ec66b5e7",
      to: "0xb89bf2a212484ef9f1bd09efcd57cf37dbb1e52f",
      transactionIndex: 0,
      v: "0x37",
      value: 5000000000000000000
    }
    

    ブロック番号でブロックを表示するには、次の手順に従います.
    > eth.getBlock(33)
    {
      difficulty: 133056,
      extraData: "0xd883010703846765746887676f312e392e328664617277696e",
      gasLimit: 3244382,
      gasUsed: 0,
      hash: "0x198ec33f48858979195c6bfab631cd516a10ff5473f26598398c9d445a0e2d01",
      logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
      miner: "0x0416f04c403099184689990674f5b4259dc46bd8",
      mixHash: "0xe43e60cbbb0063e712a4c3900808deff5ef582b690c17ecadbbb32dd44bc7956",
      nonce: "0x3dabcace6101360d",
      number: 33,
      parentHash: "0x922551d1ea1f63845b2662370f1334eb9b7554605985a93121cd32d12f5950ae",
      receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
      sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
      size: 536,
      stateRoot: "0x24bd5ceedf75a25e8e065cf9553e097e405ef4d6cf38ddf64f621244aa229898",
      timestamp: 1519718647,
      totalDifficulty: 4488192,
      transactions: [],
      transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
      uncles: []
    }
    

    リファレンスドキュメント
  • MAC上に太坊プライベートチェーン構築
  • 以太坊開発実戦:私有チェーン構築操作マニュアル