Commit 1867e2ed authored by vipwzw's avatar vipwzw Committed by 33cn

update chain33 04/25

parent 4c3c8249
......@@ -61,6 +61,7 @@ func (chain *BlockChain) ReExecBlock(startHeight, curHeight int64) {
}
prevStateHash = blockdetail.Block.StateHash
}
for i := startHeight; i <= curHeight; i++ {
blockdetail, err := chain.GetBlock(i)
if err != nil {
......@@ -71,6 +72,20 @@ func (chain *BlockChain) ReExecBlock(startHeight, curHeight int64) {
if err != nil {
panic(fmt.Sprintf("execBlockEx height=%d err=%s, this not allow fail", i, err.Error()))
}
if chain.cfg.EnableReExecLocal {
// 保存tx信息到db中
newbatch := chain.blockStore.NewBatch(false)
err = chain.blockStore.AddTxs(newbatch, blockdetail)
if err != nil {
panic(fmt.Sprintf("execBlockEx connectBlock readd Txs fail height=%d err=%s, this not allow fail", i, err.Error()))
}
err = newbatch.Write()
if err != nil {
panic(err)
}
}
prevStateHash = block.StateHash
//更新高度
err = chain.upgradeMeta(i)
......
......@@ -32,6 +32,8 @@ batchsync=false
# 是否记录添加或者删除区块的序列,若节点作为主链节点,为平行链节点提供服务,需要设置为true
isRecordBlockSequence=false
enableTxQuickIndex=false
# 升级storedb是否重新执行localdb
enableReExecLocal=false
[p2p]
# P2P服务监听端口号
......
......@@ -48,6 +48,8 @@ isRecordBlockSequence=true
# 是否为平行链节点
isParaChain=false
enableTxQuickIndex=false
# 升级storedb是否重新执行localdb
enableReExecLocal=false
[p2p]
# P2P服务监听端口号
......
......@@ -82,6 +82,11 @@ func (bc *BaseClient) GetAPI() client.QueueProtocolAPI {
return bc.api
}
//SetAPI ...
func (bc *BaseClient) SetAPI(api client.QueueProtocolAPI) {
bc.api = api
}
//InitClient 初始化
func (bc *BaseClient) InitClient(c queue.Client, minerstartCB func()) {
log.Info("Enter SetQueueClient method of consensus")
......
......@@ -117,26 +117,41 @@ func (mem *Mempool) checkTxs(msg *queue.Message) *queue.Message {
//checkTxList 检查账户余额是否足够,并加入到Mempool,成功则传入goodChan,若加入Mempool失败则传入badChan
func (mem *Mempool) checkTxRemote(msg *queue.Message) *queue.Message {
tx := msg.GetData().(types.TxGroup)
txlist := &types.ExecTxList{}
txlist.Txs = append(txlist.Txs, tx.Tx())
//检查是否重复
lastheader := mem.GetHeader()
txlist.BlockTime = lastheader.BlockTime
txlist.Height = lastheader.Height
txlist.StateHash = lastheader.StateHash
// 增加这个属性,在执行器中会使用到
txlist.Difficulty = uint64(lastheader.Difficulty)
txlist.IsMempool = true
//add check dup tx
newtxs, err := util.CheckDupTx(mem.client, txlist.Txs, txlist.Height)
//add check dup tx需要区分单笔交易/交易组
temtxlist := &types.ExecTxList{}
txGroup, err := tx.GetTxGroup()
if err != nil {
msg.Data = err
return msg
}
if txGroup == nil {
temtxlist.Txs = append(temtxlist.Txs, tx.Tx())
} else {
temtxlist.Txs = append(temtxlist.Txs, txGroup.GetTxs()...)
}
temtxlist.Height = lastheader.Height
newtxs, err := util.CheckDupTx(mem.client, temtxlist.Txs, temtxlist.Height)
if err != nil {
msg.Data = err
return msg
}
if len(newtxs) != len(txlist.Txs) {
if len(newtxs) != len(temtxlist.Txs) {
msg.Data = types.ErrDupTx
return msg
}
//exec模块检查交易
txlist := &types.ExecTxList{}
txlist.Txs = append(txlist.Txs, tx.Tx())
txlist.BlockTime = lastheader.BlockTime
txlist.Height = lastheader.Height
txlist.StateHash = lastheader.StateHash
// 增加这个属性,在执行器中会使用到
txlist.Difficulty = uint64(lastheader.Difficulty)
txlist.IsMempool = true
result, err := mem.checkTxListRemote(txlist)
if err != nil {
msg.Data = err
......
......@@ -16,4 +16,6 @@ message Ticket {
string minerAddress = 6;
// return wallet
string returnAddress = 7;
// miner Price
int64 price = 9;
}
\ No newline at end of file
......@@ -36,6 +36,8 @@ type Ticket struct {
MinerAddress string `protobuf:"bytes,6,opt,name=minerAddress,proto3" json:"minerAddress,omitempty"`
// return wallet
ReturnAddress string `protobuf:"bytes,7,opt,name=returnAddress,proto3" json:"returnAddress,omitempty"`
// miner Price
Price int64 `protobuf:"varint,9,opt,name=price,proto3" json:"price,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -122,6 +124,13 @@ func (m *Ticket) GetReturnAddress() string {
return ""
}
func (m *Ticket) GetPrice() int64 {
if m != nil {
return m.Price
}
return 0
}
func init() {
proto.RegisterType((*Ticket)(nil), "ticket.Ticket")
}
......@@ -129,18 +138,18 @@ func init() {
func init() { proto.RegisterFile("ticket.proto", fileDescriptor_98a6c21780e82d22) }
var fileDescriptor_98a6c21780e82d22 = []byte{
// 196 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x54, 0x90, 0xb1, 0xae, 0x82, 0x30,
0x14, 0x86, 0x53, 0xb8, 0xf4, 0xc2, 0x09, 0x77, 0xe9, 0x70, 0xd3, 0x18, 0x63, 0x1a, 0xe2, 0xd0,
0xc9, 0xc5, 0x27, 0x70, 0x32, 0xae, 0x0d, 0x71, 0x47, 0x38, 0x43, 0xa3, 0x80, 0x69, 0xcb, 0x0b,
0xf8, 0xe4, 0x86, 0x83, 0x8a, 0x6c, 0xfd, 0xbe, 0xff, 0xff, 0x93, 0xe6, 0x40, 0x1e, 0x6c, 0x7d,
0xc5, 0xb0, 0xbb, 0xbb, 0x3e, 0xf4, 0x82, 0x4f, 0x54, 0x3c, 0x22, 0xe0, 0x25, 0x3d, 0xc5, 0x0a,
0xd2, 0x49, 0x9e, 0x1a, 0xc9, 0x14, 0xd3, 0x99, 0xf9, 0xb0, 0xf8, 0x07, 0xee, 0x43, 0x15, 0x06,
0x2f, 0x23, 0xc5, 0x74, 0x62, 0x5e, 0x24, 0xd6, 0x90, 0x59, 0x7f, 0xc4, 0x0e, 0xbd, 0xf5, 0x32,
0x56, 0x4c, 0xa7, 0x66, 0x16, 0x62, 0x03, 0x50, 0x3b, 0xac, 0x02, 0x96, 0xb6, 0x45, 0xf9, 0xa3,
0x98, 0x8e, 0xcd, 0x97, 0x19, 0xd7, 0xad, 0xed, 0xd0, 0x51, 0x9c, 0x50, 0x3c, 0x8b, 0x71, 0x4d,
0x70, 0xae, 0x6e, 0x03, 0xca, 0x74, 0x5a, 0xcf, 0x46, 0x14, 0x90, 0x13, 0x1d, 0x9a, 0xc6, 0xa1,
0xf7, 0x92, 0xd3, 0x9f, 0x17, 0x4e, 0x6c, 0xe1, 0xcf, 0x61, 0x18, 0x5c, 0xf7, 0x2e, 0xfd, 0x52,
0x69, 0x29, 0x2f, 0x9c, 0x6e, 0xb2, 0x7f, 0x06, 0x00, 0x00, 0xff, 0xff, 0x90, 0x22, 0xb8, 0x7d,
0x23, 0x01, 0x00, 0x00,
// 207 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x54, 0x90, 0xcd, 0x4a, 0xc4, 0x30,
0x14, 0x85, 0x49, 0x6b, 0x63, 0x7b, 0xa9, 0x9b, 0x8b, 0x48, 0x10, 0x91, 0x50, 0x5c, 0x64, 0xe5,
0xc6, 0x27, 0x70, 0x25, 0x6e, 0x43, 0x71, 0x5f, 0xdb, 0xbb, 0x08, 0xda, 0x1f, 0x92, 0xf4, 0x5d,
0x7c, 0x5c, 0xe9, 0xcd, 0xcc, 0x74, 0xba, 0xcb, 0xf7, 0x9d, 0x73, 0x48, 0x08, 0xd4, 0xd1, 0xf5,
0x3f, 0x14, 0x5f, 0x17, 0x3f, 0xc7, 0x19, 0x65, 0xa2, 0xe6, 0x2f, 0x03, 0xd9, 0xf2, 0x11, 0x1f,
0xa1, 0x4c, 0xf2, 0x73, 0x50, 0x42, 0x0b, 0x53, 0xd9, 0x0b, 0xe3, 0x03, 0xc8, 0x10, 0xbb, 0xb8,
0x06, 0x95, 0x69, 0x61, 0x0a, 0x7b, 0x22, 0x7c, 0x82, 0xca, 0x85, 0x0f, 0x9a, 0x28, 0xb8, 0xa0,
0x72, 0x2d, 0x4c, 0x69, 0x77, 0x81, 0xcf, 0x00, 0xbd, 0xa7, 0x2e, 0x52, 0xeb, 0x46, 0x52, 0x37,
0x5a, 0x98, 0xdc, 0x5e, 0x99, 0x6d, 0x3d, 0xba, 0x89, 0x3c, 0xc7, 0x05, 0xc7, 0xbb, 0xd8, 0xd6,
0x0c, 0x5f, 0xdd, 0xef, 0x4a, 0xaa, 0x4c, 0xeb, 0xdd, 0x60, 0x03, 0x35, 0xd3, 0xfb, 0x30, 0x78,
0x0a, 0x41, 0x49, 0x7e, 0xf3, 0xc1, 0xe1, 0x0b, 0xdc, 0x79, 0x8a, 0xab, 0x9f, 0xce, 0xa5, 0x5b,
0x2e, 0x1d, 0x25, 0xde, 0x43, 0xb1, 0x78, 0xd7, 0x93, 0xaa, 0xf8, 0x92, 0x04, 0xdf, 0x92, 0x7f,
0xea, 0xed, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xb6, 0xb4, 0xe8, 0x04, 0x39, 0x01, 0x00, 0x00,
}
......@@ -140,6 +140,8 @@ type BlockChain struct {
// 是否为平行链节点
IsParaChain bool `protobuf:"varint,12,opt,name=isParaChain" json:"isParaChain,omitempty"`
EnableTxQuickIndex bool `protobuf:"varint,13,opt,name=enableTxQuickIndex" json:"enableTxQuickIndex,omitempty"`
// 升级storedb是否重新执行localdb
EnableReExecLocal bool `protobuf:"varint,13,opt,name=enableReExecLocal" json:"enableReExecLocal,omitempty"`
}
// P2P 配置
......
......@@ -207,12 +207,12 @@ func SetTestNetFork() {
systemFork.SetFork("chain33", "ForkResetTx0", 453400)
systemFork.SetFork("chain33", "ForkExecRollback", 706531)
systemFork.SetFork("chain33", "ForkTxHeight", 806578)
systemFork.SetFork("chain33", "ForkTxGroupPara", 806578)
systemFork.SetFork("chain33", "ForkCheckBlockTime", 1200000)
systemFork.SetFork("chain33", "ForkMultiSignAddress", 1298600)
systemFork.SetFork("chain33", "ForkStateDBSet", 1572391)
systemFork.SetFork("chain33", "ForkBlockCheck", 1560000)
systemFork.SetFork("chain33", "ForkLocalDBAccess", 1572391)
systemFork.SetFork("chain33", "ForkTxGroupPara", 1687250)
}
func setLocalFork() {
......
......@@ -168,6 +168,7 @@ func (txgroup *Transactions) Check(height, minfee, maxFee int64) error {
}
}
//txgroup 只允许一条平行链的交易, 且平行链txgroup须全部是平行链tx
//如果平行链已经在主链分叉高度前运行了一段时间且有跨链交易,平行链需要自己设置这个fork
if IsFork(height, "ForkTxGroupPara") {
if len(para) > 1 {
tlog.Info("txgroup has multi para transaction")
......
......@@ -50,7 +50,7 @@ func TestCreateGroupTx(t *testing.T) {
func TestCreateParaGroupTx(t *testing.T) {
tempTitle := GetTitle()
SetTitleOnlyForTest("chain33")
testHeight := int64(806578 + 1)
testHeight := int64(1687250 + 1)
tx1 := "0a05636f696e73120e18010a0a1080c2d72f1a036f746520a08d0630f1cdebc8f7efa5e9283a22313271796f6361794e46374c7636433971573461767873324537553431664b536676"
tx2 := "0a05636f696e73120e18010a0a1080c2d72f1a036f746520a08d0630de92c3828ad194b26d3a22313271796f6361794e46374c7636433971573461767873324537553431664b536676"
tx3 := "0a05636f696e73120e18010a0a1080c2d72f1a036f746520a08d0630b0d6c895c4d28efe5d3a22313271796f6361794e46374c7636433971573461767873324537553431664b536676"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment