Edit me

节点运行

首先运行主节点:

pct@Chandler:~/go/src/github.com/Baptist-Publication/chorus/build$ ./chorus init
pct@Chandler:~/go/src/github.com/Baptist-Publication/chorus/build$ ./chorus run
Using config file: /home/pct/.chorus.toml
event_external_address: 192.168.8.167:46658
node (chorus) is running on 192.168.8.167:46656 ......

然后运行客户端工具:

pct@Chandler:~/go/src/github.com/Baptist-Publication/chorus/build$ ./chorustool --backend="tcp://localhost:46657" --target="chorus" info net 
listening : true
listener : Listener(@192.168.8.167:46656)
pct@Chandler:~/go/src/github.com/Baptist-Publication/chorus/build$ ./chorustool --backend="tcp://localhost:46657" --target="chorus" info num_unconfirmed_txs
num of unconfirmed txs:  0

节点已经运行。 生成一个账户:

pct@Chandler:~/go/src/github.com/Baptist-Publication/chorus/build$ ./chorustool --backend="tcp://localhost:46657" --target="chorus" account gen pct
privkey: 16F2018E5A1DBDC82A9D0B5870A057F5A07F0347C468226167824B9BDC14C98D386563CE3189C39850970AB7528BE165DEFF3B473F70E8BB5F7A1CDE31BD950A
pubkey: 386563CE3189C39850970AB7528BE165DEFF3B473F70E8BB5F7A1CDE31BD950A

命令解析部分

Account

命令从client下main函数部分进入:

app.Commands = []cli.Command{
   commands.AccountCommands,
   commands.QueryCommands,
   commands.NodeCommands,
   commands.InfoCommand,
}

输入account gen后会调用下面函数生成秘钥:

func generatePrivPubAddr(ctx *cli.Context) error {
   sk := crypto.GenPrivKeyEd25519()
   pk := sk.PubKey().(*crypto.PubKeyEd25519)

   fmt.Printf("privkey: %X\n", sk[:])
   fmt.Printf("pubkey: %X\n", pk[:])

   return nil
}

这里用到了作者的另一个库github.com/Baptist-Publication/chorus-module里面的go-crypto来进行秘钥生成。 Ed25519是一个签名算法,内部实现可以放后再看,那么Account命令的实现就很简单了:

http://ed25519.cr.yp.to/Ed25519是一个数字签名算法,签名和验证的性能都极高, 一个4核2.4GHz 的 Westmere cpu,每秒可以验证 71000 个签名,安全性极高,等价于RSA约3000-bit。签名过程不依赖随机数生成器,不依赖hash函数的防碰撞性,没有时间通道攻击的问题,并且签名很小,只有64字节,公钥也很小,只有32字节。 部署情 况:http://ianix.com/pub/ed25519-deployment.html

错误记录

节点死机

在运行双节点的时候,节点会死掉:

pct@Chandler:~/go/src/github.com/Baptist-Publication/chorus/build$ ./chorus run
Using config file: /home/pct/.chorus.toml
event_external_address: 192.168.8.167:46658
node (chorus) is running on 192.168.8.167:46656 ......
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0xb3f0b6]

goroutine 127 [running]:
github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/consensus.(*ConsensusState).enterPropose(0xc42030c000, 0x1, 0x0)
    /home/pct/go/src/github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/consensus/state.go:946 +0x7d6
github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/consensus.(*ConsensusState).enterNewRound(0xc42030c000, 0x1, 0x0)
    /home/pct/go/src/github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/consensus/state.go:914 +0xbe5
github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/consensus.(*ConsensusState).handleTimeout(0xc42030c000, 0x253fe4034, 0x1, 0x0, 0x1, 0x1, 0x0, 0x1, 0xbeab3ed75afaeafa, 0x2580d82cb0, ...)
    /home/pct/go/src/github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/consensus/state.go:845 +0x6e2
github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/consensus.(*ConsensusState).readReplayMessage(0xc42030c000, 0xc4201e34a0, 0x99, 0xa0, 0x0, 0x0, 0x0)
    /home/pct/go/src/github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/consensus/replay.go:94 +0x11bd
github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/consensus.(*ConsensusState).catchupReplay(0xc42030c000, 0x1, 0x0, 0x0)
    /home/pct/go/src/github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/consensus/replay.go:149 +0x9b8
github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/consensus.(*ConsensusState).OnStart(0xc42030c000, 0x0, 0x0)
    /home/pct/go/src/github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/consensus/state.go:464 +0x402
github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/chorus-module/lib/go-common.(*BaseService).Start(0xc42030c000, 0xc420083800, 0x0, 0x0)
    /home/pct/go/src/github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/chorus-module/lib/go-common/service.go:96 +0x3c2
github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/consensus.(*ConsensusReactor).SwitchToConsensus(0xc42012ed90, 0xc420083860)
    /home/pct/go/src/github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/consensus/reactor.go:123 +0x3f1
github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/consensus.(*ConsensusReactor).registerEventCallbacks.func3(0x179cca0, 0xc420042250)
    /home/pct/go/src/github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/consensus/reactor.go:356 +0x48
github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/types.AddListenerForEvent.func1(0xe8d2e0, 0xc420042250)
    /home/pct/go/src/github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/types/events.go:274 +0x83
github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/chorus-module/lib/go-events.(*eventCell).FireEvent(0xc42000d920, 0xe8d2e0, 0xc420042250)
    /home/pct/go/src/github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/chorus-module/lib/go-events/events.go:191 +0xdf
github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/chorus-module/lib/go-events.(*eventSwitch).FireEvent(0xc4201a0900, 0xf57662, 0x11, 0xe8d2e0, 0xc420042250)
    /home/pct/go/src/github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/chorus-module/lib/go-events/events.go:157 +0xb8
github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/types.fireEvent(0x7fcef8401430, 0xc4201a0900, 0xf57662, 0x11, 0x179cca0, 0xc420042250)
    /home/pct/go/src/github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/types/events.go:268 +0x96
github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/types.FireEventSwitchToConsensus(0x7fcef8401430, 0xc4201a0900)
    /home/pct/go/src/github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/types/events.go:336 +0xa5
github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/blockchain.(*BlockchainReactor).poolRoutine(0xc420542540)
    /home/pct/go/src/github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/blockchain/reactor.go:321 +0xb21
created by github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/blockchain.(*BlockchainReactor).OnStart
    /home/pct/go/src/github.com/Baptist-Publication/chorus/vendor/github.com/Baptist-Publication/angine/blockchain/reactor.go:147 +0x172

改成单节点尝试一下: 给自己发起一笔交易:

pct@Chandler:~/go/src/github.com/Baptist-Publication/chorus/build$ ./chorustool  --target="chorus" tx transfer --privkey=16F2018E5A1DBDC82A9D0B5870A057F5A07F0347C468226167824B9BDC14C98D386563CE3189C39850970AB7528BE165DEFF3B473F70E8BB5F7A1CDE31BD950A --peer_pubkey=386563CE3189C39850970AB7528BE165DEFF3B473F70E8BB5F7A1CDE31BD950A --value=10
send ok : 6684fcbdabb41fd5d9302db69d4645a01ecbb278

查询未出块交易:

pct@Chandler:~/go/src/github.com/Baptist-Publication/chorus/build$ ./chorustool  --target="chorus" info num_unconfirmed_txs
num of unconfirmed txs:  1

单节点运行良好,也可能是–backend=”tcp://192.168.8.167:46657” 这个参数的问题,我们去掉这个参数再尝试一下: 不加地址就好了,这个地址在执行交易和查询时不需要加,因为节点并不知道地址存在哪里,地址是用户自己存储的。

Tags: