Skip to content

记账节点更换版本及分叉后设置专用挖矿公钥

suoyc edited this page Dec 12, 2019 · 3 revisions

1.记账节点更换版本

通过浏览器https://m.ft.im/record查看出块情况,可以在自己节点刚刚完成出块后重启节点,这样可以在不丢块的情况下完成版本的切换。
重启步骤和之前启动相同:
生产者节点为了保证出块的稳定性(或者说收益的稳定性),需要为同一个挖矿账户(假设为accout123456)启动主备两个节点程序,分别运行在不同的服务器上。

主节点启动过程:
nohup ./ft --genesis=../genesis.json --p2p_id=1 --miner_start & // 启动节点,数据默认保存在/root/.ft_ledger
./ft miner setcoinbase "accout123456" priKey.txt // 设置coinbase,priKey.txt设置好后可删除

备份节点启动过程:
nohup ./ft --genesis=../genesis.json --p2p_id=1 --miner_start & // 启动节点,数据默认保存在/root/.ft_ledger
./ft miner setcoinbase "accout123456" priKey.txt // 设置coinbase,priKey.txt设置好后可删除
./ft miner setdelay 200 //延迟200ms // 设置挖矿延迟200ms

注意:
(1)在一个周期开始前,一定要将区块同步到最新,之后节点才能出块
(2)如果是租用的阿里云或AWS的服务器,记得要在安全组中打开入站端口(默认P2P的端口是2018),否则其它节点将无法连到你的节点,影响P2P网络的建立

2.分叉后设置专用挖矿公钥

通过浏览器https://m.ft.im/record查看出块情况,自己节点刚刚出块后发送设置专用挖矿公钥并配置私钥。  
(1).不需重启节点,设置coinbase:  
 ./ft miner setcoinbase "accout123456" priKey.txt  
 (2). 分叉后发送配置专用挖矿公钥  
  func UpdateCandidatePubKey(pubKey common.PubKey, from, to common.Name, nonce uint64, prikey *ecdsa.PrivateKey) {  
arg := &args.UpdateCandidatePubKey{  
	PubKey: pubKey,  
}  
payload, err := rlp.EncodeToBytes(arg)  
if err != nil {  
	panic(err)  
}  
key := types.MakeKeyPair(prikey, []uint64{0})  
sendTransferTx(types.UpdateCandidatePubKey, from, to, nonce, 0, big.NewInt(0), payload, []*types.KeyPair{key})  

}
func sendTransferTx(txType types.ActionType, from, to common.Name, nonce, assetID uint64, value *big.Int, input []byte, keys []*types.KeyPair) {
action := types.NewAction(txType, from, to, nonce, assetID, gasLimit, value, input, nil)
gasprice, _ := testcommon.GasPrice()
tx := types.NewTransaction(0, gasprice, action)
signer := types.MakeSigner(big.NewInt(100))
err := types.SignActionWithMultiKey(action, tx, signer, 0, keys)
if err != nil {
jww.ERROR.Fatalln(err)
}
rawtx, err := rlp.EncodeToBytes(tx)
if err != nil {
jww.ERROR.Fatalln(err)
}
hash, err := testcommon.SendRawTx(rawtx)
if err != nil {
jww.INFO.Println("result err: ", err)
}
fmt.Println("result hash: ", hash.Hex())
jww.INFO.Println("result hash: ", hash.Hex())
}