Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions chain33.fork.toml
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ Enable=0

[fork.sub.multisig]
Enable=0
ForkMultiSigFixStaleWeight=0

[fork.sub.norm]
Enable=0
Expand Down
1 change: 1 addition & 0 deletions chain33.para.toml
Original file line number Diff line number Diff line change
Expand Up @@ -500,6 +500,7 @@ Enable=0

[fork.sub.multisig]
Enable=0
ForkMultiSigFixStaleWeight=0

[fork.sub.mix]
Enable=0
Expand Down
1 change: 1 addition & 0 deletions plugin/dapp/evm/cmd/ci2/chain33.proxyminer.toml
Original file line number Diff line number Diff line change
Expand Up @@ -676,6 +676,7 @@ Enable=0

[fork.sub.multisig]
Enable=0
ForkMultiSigFixStaleWeight=0

[fork.sub.norm]
Enable=0
Expand Down
13 changes: 9 additions & 4 deletions plugin/dapp/multisig/executor/action.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@ func newAction(t *MultiSig, tx *types.Transaction, index int32) *action {
t.GetBlockTime(), t.GetHeight(), index, dapp.ExecAddress(string(tx.Execer)), t.GetAPI()}
}

// isFixStaleWeight 判定当前高度是否启用确认权重按owner当前权重重算的修复分叉
func (a *action) isFixStaleWeight() bool {
return a.api.GetConfig().IsDappFork(a.height, mty.MultiSigX, mty.ForkMultiSigFixStaleWeight)
}

// MultiSigAccCreate 创建多重签名账户
func (a *action) MultiSigAccCreate(accountCreate *mty.MultiSigAccCreate) (*types.Receipt, error) {
var logs []*types.ReceiptLog
Expand Down Expand Up @@ -364,7 +369,7 @@ func (a *action) MultiSigConfirmTx(ConfirmTx *mty.MultiSigConfirmTx) (*types.Rec
}

multiSigTxOwner := &mty.MultiSigTxOwner{MultiSigAddr: multiSigAccAddr, Txid: ConfirmTx.TxId, ConfirmedOwner: owner}
isConfirm := isConfirmed(multiSigAcc.RequiredWeight, multiSigTx)
isConfirm := isConfirmed(multiSigAcc.RequiredWeight, multiSigTx, multiSigAcc, a.isFixStaleWeight())

//权重未达到要求或者撤销确认交易,构造MultiSigConfirmTx的receiptLog
if !isConfirm || !ConfirmTx.ConfirmOrRevoke {
Expand Down Expand Up @@ -757,7 +762,7 @@ func (a *action) executeTransferTx(multiSigAcc *mty.MultiSig, newMultiSigTx *mty

//确认此交易额度是否在每日限额之内,或者权重已达到要求
amount := transfer.Amount
confirmed := isConfirmed(multiSigAcc.RequiredWeight, newMultiSigTx)
confirmed := isConfirmed(multiSigAcc.RequiredWeight, newMultiSigTx, multiSigAcc, a.isFixStaleWeight())
underLimit, newlastday := isUnderLimit(a.blocktime, uint64(amount), curDailyLimit)

//新的一天更新lastday和spenttoday的值
Expand Down Expand Up @@ -838,7 +843,7 @@ func (a *action) executeTransferTx(multiSigAcc *mty.MultiSig, newMultiSigTx *mty
func (a *action) executeAccOperateTx(multiSigAcc *mty.MultiSig, newMultiSigTx *mty.MultiSigTx, accountOperate *mty.MultiSigAccOperate, confOwner *mty.Owner, subOrConfirm bool) (*types.Receipt, error) {

//确认权重是否已达到要求
confirmed := isConfirmed(multiSigAcc.RequiredWeight, newMultiSigTx)
confirmed := isConfirmed(multiSigAcc.RequiredWeight, newMultiSigTx, multiSigAcc, a.isFixStaleWeight())
prevExecuted := newMultiSigTx.Executed

var logs []*types.ReceiptLog
Expand Down Expand Up @@ -899,7 +904,7 @@ func (a *action) executeOwnerOperateTx(multiSigAccount *mty.MultiSig, newMultiSi
var receiptLog *types.ReceiptLog
var err error
//确认权重是否已达到要求
confirmed := isConfirmed(multiSigAccount.RequiredWeight, newMultiSigTx)
confirmed := isConfirmed(multiSigAccount.RequiredWeight, newMultiSigTx, multiSigAccount, a.isFixStaleWeight())
prevExecuted := newMultiSigTx.Executed

flag := accountOperate.OperateFlag
Expand Down
14 changes: 12 additions & 2 deletions plugin/dapp/multisig/executor/multisig.go
Original file line number Diff line number Diff line change
Expand Up @@ -931,10 +931,20 @@ func getOwnerInfoByAddr(multiSigAcc *mty.MultiSig, oldowner string) (uint64, int
}

// 确认某笔交易是否已经达到确认需要的权重
func isConfirmed(requiredWeight uint64, multiSigTx *mty.MultiSigTx) bool {
// useCurWeight为true时忽略确认时记录的权重快照,按owner当前权重重新累计,
// 防止owner权重被modify/del/replace后仍按过期权重凑足阈值执行交易
func isConfirmed(requiredWeight uint64, multiSigTx *mty.MultiSigTx, multiSigAcc *mty.MultiSig, useCurWeight bool) bool {
var totalweight uint64
for _, owner := range multiSigTx.ConfirmedOwner {
totalweight += owner.Weight
weight := owner.Weight
if useCurWeight {
curWeight, isowner := isOwner(multiSigAcc, owner.OwnerAddr)
if !isowner {
continue
}
weight = curWeight
}
totalweight += weight
}
return totalweight >= requiredWeight
}
Expand Down
37 changes: 37 additions & 0 deletions plugin/dapp/multisig/executor/security_fix_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package executor

import (
"testing"

mty "github.com/33cn/plugin/plugin/dapp/multisig/types"
"github.com/stretchr/testify/assert"
)

// TestIsConfirmedUsesCurrentWeight 确认修复分叉后按 owner 当前权重累计,不再使用确认时的过期快照
func TestIsConfirmedUsesCurrentWeight(t *testing.T) {
acc := &mty.MultiSig{
RequiredWeight: 10,
Owners: []*mty.Owner{
{OwnerAddr: "ownerA", Weight: 5},
{OwnerAddr: "ownerB", Weight: 5},
},
}
tx := &mty.MultiSigTx{
ConfirmedOwner: []*mty.Owner{
{OwnerAddr: "ownerA", Weight: 5},
{OwnerAddr: "ownerB", Weight: 5},
},
}
assert.True(t, isConfirmed(10, tx, acc, false))
assert.True(t, isConfirmed(10, tx, acc, true))

// ownerB 被删除后:旧快照仍能凑足阈值,按当前 owner 权重则不能
acc.Owners = acc.Owners[:1]
assert.True(t, isConfirmed(10, tx, acc, false), "pre-fork keeps the stale snapshot behavior")
assert.False(t, isConfirmed(10, tx, acc, true), "post-fork must ignore removed owner")

// ownerA 被降权后,按当前权重重新累计也不能凑足阈值
acc2 := &mty.MultiSig{RequiredWeight: 10, Owners: []*mty.Owner{{OwnerAddr: "ownerA", Weight: 2}}}
assert.True(t, isConfirmed(10, tx, acc2, false))
assert.False(t, isConfirmed(10, tx, acc2, true))
}
5 changes: 5 additions & 0 deletions plugin/dapp/multisig/types/const.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@ var (
Multisiglog = log15.New("module", MultiSigX)
)

const (
// ForkMultiSigFixStaleWeight 修复确认权重判定使用过期权重快照的问题,按owner当前权重重新累计确认权重
ForkMultiSigFixStaleWeight = "ForkMultiSigFixStaleWeight"
)

// MultiSig 交易的actionid
const (
ActionMultiSigAccCreate = 10000
Expand Down
1 change: 1 addition & 0 deletions plugin/dapp/multisig/types/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ func init() {
// InitFork ...
func InitFork(cfg *types.Chain33Config) {
cfg.RegisterDappFork(MultiSigX, "Enable", 0)
cfg.RegisterDappFork(MultiSigX, ForkMultiSigFixStaleWeight, 0)
}

// InitExecutor ...
Expand Down
Loading