获取Demo

  1. 登陆你的github并fork该项目: git clone https://github.com/buckyos/chainDemo.git
  2. 克隆到本地:git clone https://github.com/${YourGithubAccount}/chainDemo.git
    • ${YourGithubAccount} 是你自己的github账户名。
  3. 进入demo目录: cd chainDemo

构建Demo

  1. 安装Demo的node依赖库:npm install
    • 可以看到目录下创建了node_modules,可以查看package.json里依赖的node库,主要包括
      • package.json里配置了依赖的ChainSDK库:blockchain-sdk
      • package.json里配置了依赖的gulp工具相关的库
      • package.json里配置了TypeScript相关的node库,ChainSDK支持使用TypeScript或原生JavaScript编写DApp。
  2. 使用gulp编译:gulp build
    • 可以看到根目录下自动创建了dist子目录,把src/coinsrc/coin2等DApp源码编译到了dist/coindist/coin2

Hello BlockChain

src目录下内置了几个完整的BlockChain示例,例如src/coin目录下是一个完整的基于chainSDK开发的使用PoW共识机制的BlockChain DApp。ChainSDK是一链一应用的机制,完整运行src/coin,即构建了一条独立的BlockChain。

现在,我们就来快速地把src/coin这个BlockChain DApp跑起来!

创建创世块(genesis)

  1. 打开一个终端,进入到chainDemo所在目录
  2. 创建创世块:node run.js -chain coin -session create
  3. 可以看到根目录下多了一个data子目录,并且创建了coin的数据目录:data/coin/,创世块数据存储在data/coin/genesis下。

运行挖矿(miner)节点

一个BlockChain上有不同类型的节点,最基本的有挖矿节点,同步节点,以及钱包客户端,首先运行一个挖矿节点。

  1. 单独打开一个终端,进入到chainDemo所在目录
  2. 启动挖矿节点:node run.js -chain coin -session miner
  3. 可以看到类似如下的挖矿日志信息:
    2018-11-15T12:17:05.057Z - info: broadcast tip headers from number: 340 hash: 450bc23f399996a6dc2f392b34226d0c3b0750da516b469dc9cb841b8843b7dc to number: 346 hash: 97c7ef9f5bf4f1212a022c20dff5558c9271ffff137dde92fe6049bee1cef5de chain.js:992
    2018-11-15T12:17:05.067Z - info: begin execute block 347 block.js:61
    2018-11-15T12:17:05.073Z - info: runblock time====6, count=0 block.js:32
    2018-11-15T12:17:05.074Z - info: begin mine Block (347) miner.js:44
    2018-11-15T12:17:05.075Z - debug: update header storage cache hash: 97c7ef9f5bf4f1212a022c20dff5558c9271ffff137dde92fe6049bee1cef5de number: 346 verified: 1 header_storage.js:179
    worker params  {\"data\":{\"type\":\"Buffer\",\"data\":[91,1,0,0,193,99,237,91,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,187,129,21,233,158,137,53,192,22,39,46,51,24,198,203,43,158,192,2,233,198,89,47,131,118,61,80,122,242,213,46,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,151,199,239,159,91,244,241,33,42,2,44,32,223,245,85,140,146,113,255,255,19,125,222,146,254,96,73,190,225,206,245,222,34,49,50,76,75,106,102,103,81,87,50,54,100,81,90,77,120,99,74,100,107,106,50,105,86,80,50,114,116,74,83,122,84,56,56,255,255,0,31,0,0,0,0,0,0,0,0]},\"nonce\":{\"start\":0,\"end\":4294967295},\"nonce1\":{\"start\":0,\"end\":4294967295}}
    2018-11-15T12:17:06.511Z - info: mined Block (347) target 520159231 : d14b239522735010fdb8b41388ae71158f8ed1188cb47ec725de130b4e9ec817 miner.js:59
    

注意:不要关闭挖矿节点。

运行同步节点(Peer):

  1. 单独打开一个终端,进入到chainDemo所在目录
  2. 启动同步节点:node run.js -chain coin -session peer
  3. 可以看到类似如下的同步日志信息:
    2018-11-15T12:28:34.675Z - info: begin recycle snanshot log_snapshot_manager.js:28
    2018-11-15T12:28:34.676Z - info: load chain tip from disk, height:331, hash:0236c7fe9f98c67dca6e160b3e99ec69ba6f4b6bb5266646528fb893a6a8eb00 chain.js:505
    2018-11-15T12:28:34.678Z - debug: [network: default peerid: localhost:12313] initialOutbounds random_outbound_network.js:47
    2018-11-15T12:28:34.696Z - debug: [network: default peerid: localhost:12313] will connect to peers from node storage:  Set { 'localhost:12312' } random_outbound_network.js:72
    2018-11-15T12:28:34.697Z - debug: [network: default peerid: localhost:12313] cannot find any peers, ignore connect. random_outbound_network.js:99
    2018-11-15T12:28:34.740Z - debug: emit tipBlock with 0236c7fe9f98c67dca6e160b3e99ec69ba6f4b6bb5266646528fb893a6a8eb00 331 chain.js:1080
    2018-11-15T12:28:34.747Z - info: chain initialized success, tip number: 331 hash: 0236c7fe9f98c67dca6e160b3e99ec69ba6f4b6bb5266646528fb893a6a8eb00 chain.js:430
    

注意:不要关闭同步节点。

运行钱包节点(wallet):

  1. 单独打开一个终端,进入到chainDemo所在目录
  2. 启动钱包客户端:node run.js -chain coin -session wallet
  3. 可以看到钱包客户端执行了一个函数chain.getBalance(),获取到了钱包的余额信息3780000
    chain.getBalance()
    (node:77296) [DEP0025] DeprecationWarning: sys is deprecated. Use util instead.
    3780000
    
  4. 钱包客户端是一个交互式命令行,可以交互式执行chain的其他函数来查询信息或者发送交易(Transaction).
    • 交互式命令行下输入help查看wallet提供的chain方法。

run.js的可选选项

  • 指定-show选项,可以只输出即将要执行的命令本身,而不真正执行,便于开发者理解最终执行的命令行及其参数。
  • 指定--forceclean选项,可以强制清空对应操作的数据
    • 例如,希望只清空miner的数据:node run.js -chain coin -session miner --forceclean
    • 例如,希望创世块、miner、peer、wallet全部都重新执行,则应该每个操作都带--forceclean再执行一遍:
      • node run.js -chain coin -session create --forceclean
      • node run.js -chain coin -session miner --forceclean
      • node run.js -chain coin -session peer --forceclean
      • node run.js -chain coin -session wallet --forceclean
    • 或者直接删除data/coin目录重置

啊哈!BlockChain

Amazing! 恭喜你,成功创建了一条BlockChain,这条BlockChain上运行了你独有的DApp,这就是一链一应用的魔力。想必你已经迫不及待地要更进一步了解DApp的细节了。

results matching ""

    No results matching ""