/iblockchain

Learn blockchain by building one in node.js

Primary LanguageJavaScriptMIT LicenseMIT

iblockchain logo

Downloads Version License

功能

  • 学习区块链的演示demo
  • 简单的挖矿、交易、P2P网络的实现
  • 一系列demo演示命令,辅助理解blockchain

安装

npm install -g iblockchain

上手

执行iblockchain 后 进入demo页面

Welcome to iblockchain !

  Commands:

    help [command...]             Provides help for a given command.
    exit                          Exits application.
    mine                          开始挖矿
    blockchain                    查看整个区块链 [bc]
    pending                       查看还没有打包进区块的交易
    trans <to> <amount>           给人转账
    blance [address]              查看地址的余额
    pub                           本地公钥(公钥就是地址)
    prv                           本地私钥
    detail <index>                查看第n个区块的详情
    peer                          查看P2P网络节点
    --------我是分割线--------
    hash <value>                  [演示] 计算sha256哈希
    minedemo <data> <difficulty>  [演示] 挖矿计算逻辑
    getpub <value>                [演示] 根据私钥计算出公钥(私钥加密 公钥解密,公钥可以从私钥计算出来)
    sign <value> <prv>            [演示] 用私钥加密信息 得到签名
    verify <value> <pub> <sig>    [演示] 使用签名 校验信息 <消息> <公钥> <签名>
    valid                         [演示] 区块链是否合法
    update <index>                [演示] 篡改<index>个block的数据,第一个转账信息amount+1
    mineblock <index>             [演示] 对<index>个上的区块数据重新挖矿,使其变成合法的小块块

iblockchain => [信息]: UDP服务监听完毕: 0.0.0.0:51881
[信息]: 更新本地区块链
iblockchain => 
// 继续输入命令 体验功能

体验一下下

查看整个区块链数据

iblockchain => blockchain

// output

┌────────────────────┬────────────────────┬────────────────────┬────────────────────┬────────────────────┬────────────────────┐
│ index              │ previousHash       │ timestamp          │ data               │ hash               │ nonce              │
├────────────────────┼────────────────────┼────────────────────┼────────────────────┼────────────────────┼────────────────────┤
│ 0                  │ "0"                │ 1538669227813      │ "Welcome to ibloc… │ "00000aa1fbf27775… │ 979911             │
├────────────────────┼────────────────────┼────────────────────┼────────────────────┼────────────────────┼────────────────────┤
│ 1                  │ "00000aa1fbf27775… │ 1538988895613      │ [                  │ "0000050c2b1b65a0… │ 69438              │
│                    │                    │                    │  {                 │                    │                    │
│                    │                    │                    │   "from": "0",     │                    │                    │
│                    │                    │                    │   "to": "0414b351… │                    │                    │
│                    │                    │                    │   "amount": 100,   │                    │                    │
│                    │                    │                    │   "sig": "3046022… │                    │                    │
│                    │                    │                    │   "timestamp": 15… │                    │                    │
│                    │                    │                    │  }                 │                    │                    │
│                    │                    │                    │ ]                  │                    │                    │
├────────────────────┼────────────────────┼────────────────────┼────────────────────┼────────────────────┼────────────────────┤
│ 2                  │ "0000050c2b1b65a0… │ 1538988929584      │ [                  │ "000001ee70cd40e8… │ 766700             │
│                    │                    │                    │  {                 │                    │                    │
│                    │                    │                    │   "from": "0",     │                    │                    │
│                    │                    │                    │   "to": "0429b0e2… │                    │                    │
│                    │                    │                    │   "amount": 100,   │                    │                    │
│                    │                    │                    │   "sig": "3044022… │                    │                    │
│                    │                    │                    │   "timestamp": 15… │                    │                    │
│                    │                    │                    │  }                 │                    │                    │
│                    │                    │                    │ ]                  │                    │                    │
└────────────────────┴────────────────────┴────────────────────┴────────────────────┴────────────────────┴────────────────────┘

挖矿,新增区块 mine

iblockchain => mine

// output
[信息]: 挖矿结束 用时4.30s , 算了806180次, 哈希值是00000c3633bd15a4b2c45bbc9373658694b55c078de4777bec28e10cea9e53fd,入账100 请笑纳

┌────────────────────┬────────────────────┬────────────────────┬────────────────────┬────────────────────┬────────────────────┐
│ index              │ previousHash       │ timestamp          │ nonce              │ hash               │ data               │
├────────────────────┼────────────────────┼────────────────────┼────────────────────┼────────────────────┼────────────────────┤
│ 14                 │ "00000b93ccf0c0b6… │ 1539017632369      │ 806180             │ "00000c3633bd15a4… │ [                  │
│                    │                    │                    │                    │                    │  {                 │
│                    │                    │                    │                    │                    │   "from": "0",     │
│                    │                    │                    │                    │                    │   "to": "041ad79c… │
│                    │                    │                    │                    │                    │   "amount": 100,   │
│                    │                    │                    │                    │                    │   "sig": "3045022… │
│                    │                    │                    │                    │                    │   "timestamp": 15… │
│                    │                    │                    │                    │                    │  }                 │
│                    │                    │                    │                    │                    │ ]                  │
└────────────────────┴────────────────────┴────────────────────┴────────────────────┴────────────────────┴────────────────────┘

查看本地地址(公钥) pub

iblockchain => pub
//output
041ad79cddfcc575efdae26e46e14a13c600967aff1db6d7eba66f770d585c542dfaed897f72b5bc40595f5601a868837f63bface539350ac6d013b99d17a0fbeb

转账 trans

iblockchain => trans 0446b3de736bca3db5e19a7db06e56851a0a45fd07bbf74a355ef91f480151ff9ee7720367b4010c525bada702df62c98768d6a34bdd066e69653ad92e8f99f065 20

//output
┌────────────────────┬────────────────────┬────────────────────┬────────────────────┬────────────────────┐
│ from               │ to                 │ amount             │ sig                │ timestamp          │
├────────────────────┼────────────────────┼────────────────────┼────────────────────┼────────────────────┤
│ "041ad79cddfcc575… │ "0446b3de736bca3d… │ 20                 │ "3045022100804809… │ 1539017836747      │
└────────────────────┴────────────────────┴────────────────────┴────────────────────┴────────────────────┘

查看还没打包的交易 pending

iblockchain => pending

//output
┌────────────────────┬────────────────────┬────────────────────┬────────────────────┬────────────────────┐
│ from               │ to                 │ amount             │ sig                │ timestamp          │
├────────────────────┼────────────────────┼────────────────────┼────────────────────┼────────────────────┤
│ "041ad79cddfcc575… │ "0446b3de736bca3d… │ 20                 │ "3045022100804809… │ 1539017836747      │
├────────────────────┼────────────────────┼────────────────────┼────────────────────┼────────────────────┤
"041ad79cddfcc575… │ "0446b3de736bca3d… │ 12                 │ "30460221008b13a5… │ 1539017874219      │
└────────────────────┴────────────────────┴────────────────────┴────────────────────┴────────────────────┘

查看地址余额(默认本地)) blance

iblockchain => blance 041ad79cddfcc575efdae26e46e14a13c600967aff1db6d7eba66f770d585c542dfaed897f72b5bc40595f5601a868837f63bface539350ac6d013b99d17a0fbeb
{
  "address": "041ad79cddfcc575efdae26e46e14a13c600967aff1db6d7eba66f770d585c542dfaed897f72b5bc40595f5601a868837f63bface539350ac6d013b99d17a0fbeb",
  "blance": 168
}
┌────────────────────┬────────────────────┐
│ address            │ blance             │
├────────────────────┼────────────────────┤
│ "041ad79cddfcc575… │ 168                │
└────────────────────┴────────────────────┘

查看网络节点列表 peer

iblockchain => peer
//output
┌────────────────────┬────────────────────┐
│ port               │ address            │
├────────────────────┼────────────────────┤
│ 8001               │ "47.94.5.240"      │
├────────────────────┼────────────────────┤
│ 8002               │ "42.56.89.132"     │
├────────────────────┼────────────────────┤
│ 59838              │ "124.127.208.135"  │
├────────────────────┼────────────────────┤
│ 27122              │ "123.114.48.94"    │
└────────────────────┴────────────────────┘

演示命令

帮助 help

iblockchain => help

计算sha256哈希 hash

iblockchain => hash imooc

//output
5401cc2e57b309427fd10963f8b8ee58545284e35bfba0e00780369307e54849
┌────────────────────┬────────────────────┐
│ hash               │ value              │
├────────────────────┼────────────────────┤
│ "5401cc2e57b30942… │ "imooc"
└────────────────────┴────────────────────┘

演示挖矿逻辑 minedemo

iblockchain => minedemo imooc 2

// output
[信息] 数据是 imooc0 哈希值是25c771cbd916307a0417ebf4f8a705e8319bb100c93db4cde74f4fbca7da54d6
[信息] 数据是 imooc1 哈希值是3b8368f43662598160ade6788b0504d789700c59574613c3dffb8b467aab8d5f
[信息] 数据是 imooc2 哈希值是f3cf53d3b2d6f83ac857e8e018ee4bbd78c1fdd5d96660b20116d2bc6a4e281e
...省略很多条
[信息] 数据是 imooc248 哈希值是e6e8c271edec6c1b6f2b4bfa9725fecc0fe50356dcec47766440da2e29837e88
[信息] 数据是 imooc249 哈希值是d1e79e718588ae125252d88c4a373934ebab3a9b1015f50d89329a151b78e406
[信息] 数据是 imooc250 哈希值是008781ebdfdff9e1660841b4ab159f2cb6c3fca3217865366c30a1912d620cc5

根据私钥算出公钥 getpub

iblockchain => getpub imooc
私钥imooc计算出的公钥 04c8d1d62200e93e7bbf4b0c65da66d343656a6aebd51c146ed60f9dbbe39a4beededb5bbeeb1660269695d5a6959470c411c07545952e93f80460e76e31fcdde0

RSA私钥加密 sign

// 字符imooc作为私钥 对信息imoocrocks进行签名
iblockchain => sign imoocrocks imooc
签名 304402206cc8d37c9e9ac3d679267aa0203550e04e7bb7ee6ba3f6c2193b597aa9bdaa58022029e54e94065c2a377a7632bdda0f51b6bd8e28c8667568459b2329683deb8db8

RSA公钥验证签名 verify

iblockchain => verify imoocrocks 04c8d....dde0 3044....8db8
true

校验区块链是否合法 valid

iblockchain => valid
校验结果: true

篡改blockchain交易数据 update

iblockchain => update 16
修改了 转账金额从20=>21

iblockchain => valid
[错误]: 第 16个区块hash不对,算出的是b2f20b3bde5fe69ab5d5092f50222ea57c980902d4709de19563e2e797759efd 区块里本来的hash是000001b0538910078e426c2989d561a4f715ab11838545ce4efe7838754f5fef 看来数据被篡改了
[错误]: 第16个区块不合法
校验结果: false

重新对一个区块挖矿修复 mineblock

iblockchain => mineblock 16
[错误]: 第 16个区块hash不对,算出的是b2f20b3bde5fe69ab5d5092f50222ea57c980902d4709de19563e2e797759efd 区块里本来的hash是000001b0538910078e426c2989d561a4f715ab11838545ce4efe7838754f5fef 看来数据被篡改了
[信息]: 区块16修复完毕

退出 exit

iblockchain => exit
[信息]: 网络一线牵,珍惜这段缘 再见

一些p2p网络传递的信息

[信息]: 交易合法 新增一下 { from: '0444d....bcf1'
[信息]: 挖矿结束 用时0.50s , 算了69438次, 哈希值是0000050c2b1b65a01659e85a17dfc3ad96fe8548dfaf694ff88ae478832ac37d,入账100 请笑纳
[信息]: 大家快去和新朋友打个招呼
[信息]: 有人挖矿成功,我们恭喜这位幸运儿
 ....

更多信息

  • 知乎
  • 如何写出这个demo(教程)

联系

大家可以加我微信

或者直接捐赠

协议

MIT