From 4d95515971d2c1a5d066f52aaa24b815e204dcc9 Mon Sep 17 00:00:00 2001 From: p0p3yee Date: Thu, 31 Oct 2024 10:41:27 -0400 Subject: [PATCH 01/12] Fix pep module array init with not 0 size --- x/pep/module/module.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/pep/module/module.go b/x/pep/module/module.go index f65aa58f..12d9d505 100644 --- a/x/pep/module/module.go +++ b/x/pep/module/module.go @@ -238,7 +238,7 @@ func (am AppModule) BeginBlock(cctx context.Context) error { if len(encryptedTxs.EncryptedTxs) > 0 { am.keeper.SetAllEncryptedTxExpired(ctx, h) am.keeper.Logger().Info(fmt.Sprintf("Updated total %d encrypted txs at block %d to expired", len(encryptedTxs.EncryptedTxs), h)) - indexes := make([]string, len(encryptedTxs.EncryptedTxs)) + indexes := make([]string, 0) for _, v := range encryptedTxs.EncryptedTxs { indexes = append(indexes, strconv.FormatUint(v.Index, 10)) } From 660ebb8cfa530bb13d24dfe7f16dfe700e2b4d6b Mon Sep 17 00:00:00 2001 From: p0p3yee Date: Thu, 31 Oct 2024 10:43:37 -0400 Subject: [PATCH 02/12] Update how to used gas is being calculated --- x/pep/module/module.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/pep/module/module.go b/x/pep/module/module.go index f65aa58f..bed3fb35 100644 --- a/x/pep/module/module.go +++ b/x/pep/module/module.go @@ -774,7 +774,7 @@ func (am AppModule) decryptAndExecuteTx( txFee[0].Denom, // Tx Fee Amount Divide Provide Gas => provided gas price // Provided Gas Price * Gas Used => Amount to deduct as gas fee - txFee[0].Amount.Quo(gasProvided).Mul(gasUsedInBig), + txFee[0].Amount.Mul(gasUsedInBig).Quo(gasProvided), ) if eachTx.ChargedGas == nil { From dff15f5dd375d51e17fe6c321f7021fe716e67be Mon Sep 17 00:00:00 2001 From: p0p3yee Date: Fri, 1 Nov 2024 10:08:24 -0400 Subject: [PATCH 03/12] Fix failed tx gas charging logic --- x/pep/module/module.go | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/x/pep/module/module.go b/x/pep/module/module.go index f65aa58f..9228b204 100644 --- a/x/pep/module/module.go +++ b/x/pep/module/module.go @@ -504,6 +504,11 @@ func (am AppModule) handleGasConsumption(ctx sdk.Context, recipient sdk.AccAddre } if gasUsed.GT(gasCharged.Amount) { + creatorBal := am.bankKeeper.SpendableCoins(ctx, creatorAccount.GetAddress()) + remainingAmount := gasUsed.Sub(gasCharged.Amount) + denomBal := creatorBal.AmountOf(gasCharged.Denom) + finalChargeAmount := cosmosmath.MinInt(denomBal, remainingAmount) + deductFeeErr := ante.DeductFees( am.bankKeeper, ctx, @@ -511,14 +516,23 @@ func (am AppModule) handleGasConsumption(ctx sdk.Context, recipient sdk.AccAddre sdk.NewCoins( sdk.NewCoin( gasCharged.Denom, - gasUsed.Sub(gasCharged.Amount)), + finalChargeAmount, + ), ), ) if deductFeeErr != nil { - am.keeper.Logger().Error("deduct failed tx fee error") + am.keeper.Logger().Error( + fmt.Sprintf("deduct failed tx fee error, remaining amount: %s, denomBal: %s, charged: %s", + remainingAmount.String(), + denomBal.String(), + finalChargeAmount.String()), + ) am.keeper.Logger().Error(deductFeeErr.Error()) } else { - am.keeper.Logger().Info("failed tx fee deducted without error") + am.keeper.Logger().Info(fmt.Sprintf( + "failed tx fee deducted without error, deducted: %s %s", + finalChargeAmount.String(), + gasCharged.Denom)) } } else { amount := gasCharged.Amount.Sub(gasUsed) From c346dcd5101b284f6da0f90ba83bd5cab53b8a11 Mon Sep 17 00:00:00 2001 From: p0p3yee Date: Fri, 1 Nov 2024 10:11:17 -0400 Subject: [PATCH 04/12] Fix return err after failed to deduct fee before execute tx --- x/pep/module/module.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/pep/module/module.go b/x/pep/module/module.go index f65aa58f..48373d42 100644 --- a/x/pep/module/module.go +++ b/x/pep/module/module.go @@ -798,8 +798,8 @@ func (am AppModule) decryptAndExecuteTx( if refundAmount.IsZero() { deductFeeErr := ante.DeductFees(am.bankKeeper, ctx, creatorAccount, sdk.NewCoins(usedGasFee)) if deductFeeErr != nil { - am.keeper.Logger().Error("Deduct fee Err") - am.keeper.Logger().Error(deductFeeErr.Error()) + am.processFailedEncryptedTx(ctx, eachTx, fmt.Sprintf("error while deducting rest of the fee: %s", err.Error()), startConsumedGas) + return deductFeeErr } else { am.keeper.Logger().Info("Fee deducted without error") } From d1b2eda3a48a89de2eb324e08ddff96c927028cb Mon Sep 17 00:00:00 2001 From: ap0calypse644 Date: Tue, 5 Nov 2024 13:57:17 +0530 Subject: [PATCH 05/12] adding a cap on gas for contract callback execution --- api/fairyring/pep/params.pulsar.go | 103 +++++++++++++---- proto/fairyring/pep/params.proto | 1 + scripts/tests/fairyring_contract/Cargo.lock | 66 +++++------ scripts/tests/fairyring_contract/Cargo.toml | 4 +- .../artifacts/checksums.txt | 2 +- .../artifacts/fairyring_contract.wasm | Bin 202420 -> 202500 bytes .../tests/fairyring_contract/src/contract.rs | 7 ++ scripts/tests/pep.sh | 43 +++++++ x/pep/keeper/contract.go | 20 +++- x/pep/keeper/params.go | 4 + x/pep/migrations/v2/store.go | 1 + x/pep/migrations/v3/store.go | 1 + x/pep/types/params.go | 28 ++++- x/pep/types/params.pb.go | 108 ++++++++++++------ 14 files changed, 290 insertions(+), 98 deletions(-) diff --git a/api/fairyring/pep/params.pulsar.go b/api/fairyring/pep/params.pulsar.go index e5fd61a4..c35f73ae 100644 --- a/api/fairyring/pep/params.pulsar.go +++ b/api/fairyring/pep/params.pulsar.go @@ -120,6 +120,7 @@ var ( fd_Params_trusted_addresses protoreflect.FieldDescriptor fd_Params_min_gas_price protoreflect.FieldDescriptor fd_Params_private_decryption_key_price protoreflect.FieldDescriptor + fd_Params_max_contract_gas protoreflect.FieldDescriptor ) func init() { @@ -131,6 +132,7 @@ func init() { fd_Params_trusted_addresses = md_Params.Fields().ByName("trusted_addresses") fd_Params_min_gas_price = md_Params.Fields().ByName("min_gas_price") fd_Params_private_decryption_key_price = md_Params.Fields().ByName("private_decryption_key_price") + fd_Params_max_contract_gas = md_Params.Fields().ByName("max_contract_gas") } var _ protoreflect.Message = (*fastReflection_Params)(nil) @@ -234,6 +236,12 @@ func (x *fastReflection_Params) Range(f func(protoreflect.FieldDescriptor, proto return } } + if x.MaxContractGas != uint64(0) { + value := protoreflect.ValueOfUint64(x.MaxContractGas) + if !f(fd_Params_max_contract_gas, value) { + return + } + } } // Has reports whether a field is populated. @@ -261,6 +269,8 @@ func (x *fastReflection_Params) Has(fd protoreflect.FieldDescriptor) bool { return x.MinGasPrice != nil case "fairyring.pep.Params.private_decryption_key_price": return x.PrivateDecryptionKeyPrice != nil + case "fairyring.pep.Params.max_contract_gas": + return x.MaxContractGas != uint64(0) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.pep.Params")) @@ -289,6 +299,8 @@ func (x *fastReflection_Params) Clear(fd protoreflect.FieldDescriptor) { x.MinGasPrice = nil case "fairyring.pep.Params.private_decryption_key_price": x.PrivateDecryptionKeyPrice = nil + case "fairyring.pep.Params.max_contract_gas": + x.MaxContractGas = uint64(0) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.pep.Params")) @@ -329,6 +341,9 @@ func (x *fastReflection_Params) Get(descriptor protoreflect.FieldDescriptor) pro case "fairyring.pep.Params.private_decryption_key_price": value := x.PrivateDecryptionKeyPrice return protoreflect.ValueOfMessage(value.ProtoReflect()) + case "fairyring.pep.Params.max_contract_gas": + value := x.MaxContractGas + return protoreflect.ValueOfUint64(value) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.pep.Params")) @@ -365,6 +380,8 @@ func (x *fastReflection_Params) Set(fd protoreflect.FieldDescriptor, value proto x.MinGasPrice = value.Message().Interface().(*v1beta1.Coin) case "fairyring.pep.Params.private_decryption_key_price": x.PrivateDecryptionKeyPrice = value.Message().Interface().(*v1beta1.Coin) + case "fairyring.pep.Params.max_contract_gas": + x.MaxContractGas = value.Uint() default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.pep.Params")) @@ -411,6 +428,8 @@ func (x *fastReflection_Params) Mutable(fd protoreflect.FieldDescriptor) protore panic(fmt.Errorf("field keyshare_channel_id of message fairyring.pep.Params is not mutable")) case "fairyring.pep.Params.is_source_chain": panic(fmt.Errorf("field is_source_chain of message fairyring.pep.Params is not mutable")) + case "fairyring.pep.Params.max_contract_gas": + panic(fmt.Errorf("field max_contract_gas of message fairyring.pep.Params is not mutable")) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.pep.Params")) @@ -440,6 +459,8 @@ func (x *fastReflection_Params) NewField(fd protoreflect.FieldDescriptor) protor case "fairyring.pep.Params.private_decryption_key_price": m := new(v1beta1.Coin) return protoreflect.ValueOfMessage(m.ProtoReflect()) + case "fairyring.pep.Params.max_contract_gas": + return protoreflect.ValueOfUint64(uint64(0)) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.pep.Params")) @@ -536,6 +557,9 @@ func (x *fastReflection_Params) ProtoMethods() *protoiface.Methods { l = options.Size(x.PrivateDecryptionKeyPrice) n += 1 + l + runtime.Sov(uint64(l)) } + if x.MaxContractGas != 0 { + n += 1 + runtime.Sov(uint64(x.MaxContractGas)) + } if x.unknownFields != nil { n += len(x.unknownFields) } @@ -565,6 +589,11 @@ func (x *fastReflection_Params) ProtoMethods() *protoiface.Methods { i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } + if x.MaxContractGas != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.MaxContractGas)) + i-- + dAtA[i] = 0x38 + } if x.PrivateDecryptionKeyPrice != nil { encoded, err := options.Marshal(x.PrivateDecryptionKeyPrice) if err != nil { @@ -874,6 +903,25 @@ func (x *fastReflection_Params) ProtoMethods() *protoiface.Methods { return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err } iNdEx = postIndex + case 7: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field MaxContractGas", wireType) + } + x.MaxContractGas = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.MaxContractGas |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -1483,6 +1531,7 @@ type Params struct { TrustedAddresses []string `protobuf:"bytes,4,rep,name=trusted_addresses,json=trustedAddresses,proto3" json:"trusted_addresses,omitempty"` MinGasPrice *v1beta1.Coin `protobuf:"bytes,5,opt,name=min_gas_price,json=minGasPrice,proto3" json:"min_gas_price,omitempty"` PrivateDecryptionKeyPrice *v1beta1.Coin `protobuf:"bytes,6,opt,name=private_decryption_key_price,json=privateDecryptionKeyPrice,proto3" json:"private_decryption_key_price,omitempty"` + MaxContractGas uint64 `protobuf:"varint,7,opt,name=max_contract_gas,json=maxContractGas,proto3" json:"max_contract_gas,omitempty"` } func (x *Params) Reset() { @@ -1547,6 +1596,13 @@ func (x *Params) GetPrivateDecryptionKeyPrice() *v1beta1.Coin { return nil } +func (x *Params) GetMaxContractGas() uint64 { + if x != nil { + return x.MaxContractGas + } + return 0 +} + // TrustedCounterParty defines the structure to store the ibc info // of the source chain (fairyring) to reliably fetch active keys and // general/private decryption keys @@ -1611,7 +1667,7 @@ var file_fairyring_pep_params_proto_rawDesc = []byte{ 0x67, 0x6f, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbf, 0x04, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x86, 0x05, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x4e, 0x0a, 0x13, 0x6b, 0x65, 0x79, 0x73, 0x68, 0x61, 0x72, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1e, 0xf2, 0xde, 0x1f, 0x1a, 0x79, 0x61, 0x6d, 0x6c, 0x3a, 0x22, 0x6b, 0x65, 0x79, 0x73, 0x68, 0x61, 0x72, 0x65, @@ -1645,26 +1701,31 @@ var file_fairyring_pep_params_proto_rawDesc = []byte{ 0x22, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x52, 0x19, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x3a, 0x1b, 0x8a, 0xe7, 0xb0, 0x2a, 0x16, - 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x78, 0x2f, 0x70, 0x65, 0x70, 0x2f, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x76, 0x0a, 0x13, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, - 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x1b, 0x0a, - 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x42, 0x95, - 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, - 0x2e, 0x70, 0x65, 0x70, 0x42, 0x0b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x50, 0x01, 0x5a, 0x1e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, - 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, - 0x70, 0x65, 0x70, 0xa2, 0x02, 0x03, 0x46, 0x50, 0x58, 0xaa, 0x02, 0x0d, 0x46, 0x61, 0x69, 0x72, - 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x70, 0xca, 0x02, 0x0d, 0x46, 0x61, 0x69, 0x72, - 0x79, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x50, 0x65, 0x70, 0xe2, 0x02, 0x19, 0x46, 0x61, 0x69, 0x72, - 0x79, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x50, 0x65, 0x70, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, - 0x67, 0x3a, 0x3a, 0x50, 0x65, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x45, 0x0a, 0x10, 0x6d, 0x61, 0x78, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x04, 0x42, 0x1b, 0xf2, 0xde, 0x1f, 0x17, 0x79, 0x61, 0x6d, 0x6c, 0x3a, 0x22, 0x6d, + 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x67, 0x61, 0x73, 0x22, + 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x47, 0x61, 0x73, + 0x3a, 0x1b, 0x8a, 0xe7, 0xb0, 0x2a, 0x16, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, + 0x2f, 0x78, 0x2f, 0x70, 0x65, 0x70, 0x2f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x76, 0x0a, + 0x13, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x50, + 0x61, 0x72, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x42, 0x95, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x61, + 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x65, 0x70, 0x42, 0x0b, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1e, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x61, 0x69, + 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x65, 0x70, 0xa2, 0x02, 0x03, 0x46, 0x50, 0x58, + 0xaa, 0x02, 0x0d, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x65, 0x70, + 0xca, 0x02, 0x0d, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x50, 0x65, 0x70, + 0xe2, 0x02, 0x19, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x50, 0x65, 0x70, + 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x46, + 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x50, 0x65, 0x70, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/fairyring/pep/params.proto b/proto/fairyring/pep/params.proto index 7e8bdc6e..39e17a92 100644 --- a/proto/fairyring/pep/params.proto +++ b/proto/fairyring/pep/params.proto @@ -17,6 +17,7 @@ message Params { repeated string trusted_addresses = 4 [(gogoproto.moretags) = "yaml:\"trusted_addresses\""]; cosmos.base.v1beta1.Coin min_gas_price = 5 [(gogoproto.moretags) = "yaml:\"min_gas_price\""]; cosmos.base.v1beta1.Coin private_decryption_key_price = 6 [(gogoproto.moretags) = "yaml:\"private_decryption_key_price\""]; + uint64 max_contract_gas = 7 [(gogoproto.moretags) = "yaml:\"max_contract_gas\""]; } // TrustedCounterParty defines the structure to store the ibc info diff --git a/scripts/tests/fairyring_contract/Cargo.lock b/scripts/tests/fairyring_contract/Cargo.lock index 87f3ff3d..55560890 100644 --- a/scripts/tests/fairyring_contract/Cargo.lock +++ b/scripts/tests/fairyring_contract/Cargo.lock @@ -37,9 +37,9 @@ checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "anyhow" -version = "1.0.91" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" +checksum = "74f37166d7d48a0284b99dd824694c26119c700b53bf0d1540cdb147dbdaaf13" [[package]] name = "ark-bls12-381" @@ -170,7 +170,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.87", ] [[package]] @@ -302,7 +302,7 @@ checksum = "1b5658b1dc64e10b56ae7a449f678f96932a96f6cfad1769d608d1d1d656480a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.87", ] [[package]] @@ -326,7 +326,7 @@ checksum = "c8ef1b5835a65fcca3ab8b9a02b4f4dacc78e233a5c2f20b270efb9db0666d12" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.87", ] [[package]] @@ -432,7 +432,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.87", ] [[package]] @@ -526,7 +526,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.87", "unicode-xid", ] @@ -612,7 +612,7 @@ dependencies = [ [[package]] name = "fairblock-proto" version = "0.1.0" -source = "git+https://github.com/Fairblock/fairblock-rust/?branch=audit-2.0#be5cf6dfb949a70c2e5caef65390f804278e3f34" +source = "git+https://github.com/Fairblock/fairblock-rust/?branch=main#3ae44d8174dea2e2372b0724ab18b8b303b7c2d9" dependencies = [ "cosmos-sdk-proto", "prost", @@ -930,29 +930,29 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.87", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -1013,7 +1013,7 @@ dependencies = [ "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.87", ] [[package]] @@ -1135,7 +1135,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.82", + "syn 2.0.87", ] [[package]] @@ -1159,9 +1159,9 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.213" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] @@ -1186,13 +1186,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.213" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.87", ] [[package]] @@ -1203,7 +1203,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.87", ] [[package]] @@ -1273,9 +1273,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.82" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83540f837a8afc019423a8edb95b52a8effe46957ee402287f4292fae35be021" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -1300,22 +1300,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.65" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.65" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.87", ] [[package]] @@ -1420,7 +1420,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.87", ] [[package]] @@ -1544,7 +1544,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.87", ] [[package]] @@ -1564,5 +1564,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.87", ] diff --git a/scripts/tests/fairyring_contract/Cargo.toml b/scripts/tests/fairyring_contract/Cargo.toml index 38d35a7c..d6712b57 100644 --- a/scripts/tests/fairyring_contract/Cargo.toml +++ b/scripts/tests/fairyring_contract/Cargo.toml @@ -25,7 +25,7 @@ library = [] optimize = """docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="$(basename "$(pwd)")_cache",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/optimizer:0.15.0 + cosmwasm/optimizer:0.16.0 """ [dependencies] @@ -42,7 +42,7 @@ thiserror = "1.0" prost = "0.13.3" # Protobuf support prost-types = "0.13" # tonic = { version = "0.12.3", features = ["prost", "tls"] } -fairblock-proto = { git = "https://github.com/Fairblock/fairblock-rust/", branch = "audit-2.0", default-features = false } +fairblock-proto = { git = "https://github.com/Fairblock/fairblock-rust/", branch = "main", default-features = false } # getrandom = { version = "0.2", features = ["js"] } # mio = "1.0.2" # tokio = "1.40.0" diff --git a/scripts/tests/fairyring_contract/artifacts/checksums.txt b/scripts/tests/fairyring_contract/artifacts/checksums.txt index 0d20f445..0ae55ac9 100644 --- a/scripts/tests/fairyring_contract/artifacts/checksums.txt +++ b/scripts/tests/fairyring_contract/artifacts/checksums.txt @@ -1 +1 @@ -8d0f9a419565f07832c886b48a8ec6dc79b374ee94fcaa7291c07ab83cbb9ac6 fairyring_contract.wasm +7c4d15da244b9af07d188fea47e7907fdde3e2a9413b1ecf451bc63d47a2b85d fairyring_contract.wasm diff --git a/scripts/tests/fairyring_contract/artifacts/fairyring_contract.wasm b/scripts/tests/fairyring_contract/artifacts/fairyring_contract.wasm index ee341150c0f5282097936a3c03cc7176e1f1428b..9707a105cb02cbf4f911329d9f7ba530f3443504 100644 GIT binary patch delta 20236 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 delta 20223 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 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxContractGas |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipParams(dAtA[iNdEx:]) From 6358ca95c9f2ad0c9ebbba517ec90569170a2b8d Mon Sep 17 00:00:00 2001 From: p0p3yee Date: Tue, 5 Nov 2024 11:42:20 -0500 Subject: [PATCH 06/12] Add unit tests for testing wasm loop contract --- scripts/tests/loop.wasm | Bin 0 -> 143328 bytes scripts/tests/pep.sh | 122 +++++++++++++++++++++++++++++++++++++++- scripts/tests/start.sh | 4 ++ 3 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 scripts/tests/loop.wasm diff --git a/scripts/tests/loop.wasm b/scripts/tests/loop.wasm new file mode 100644 index 0000000000000000000000000000000000000000..9dd633e53e152ea949e7382995987b7da68135c9 GIT binary patch literal 143328 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 literal 0 HcmV?d00001 diff --git a/scripts/tests/pep.sh b/scripts/tests/pep.sh index 37c1934a..af8e8fc6 100755 --- a/scripts/tests/pep.sh +++ b/scripts/tests/pep.sh @@ -156,6 +156,27 @@ echo "Sending 1 $TARGET_BAL_DENOM to target address" $BINARY tx bank send $VALIDATOR_2 $WALLET_2 1$TARGET_BAL_DENOM --from $VALIDATOR_2 --home $CHAIN_DIR/$CHAINID_2 --chain-id $CHAINID_2 --node $CHAIN2_NODE --keyring-backend test --generate-only -o json -y > unsigned2.json SIGNED_DATA_2=$($BINARY tx sign unsigned2.json --from $VALIDATOR_2 --offline --account-number 0 --sequence $PEP_NONCE_2ND --home $CHAIN_DIR/$CHAINID_2 --chain-id $CHAINID_2 --node $CHAIN2_NODE --keyring-backend test -y) +echo "Creating new account for testing insufficient fund for rest of the gas in encrypted tx" +ACC_INFO=$($BINARY keys add new_temp --home $CHAIN_DIR/$CHAINID_2 --keyring-backend test --output json) +echo $ACC_INFO +NEW_ACC_ADDR=$(echo $ACC_INFO | jq -r '.address') + +echo "Send 300k ufairy to new account for testing" +# 900,000 ufairy for submitting tx +# the underlying tx suppossingly need 200,000ufairy gas +# 1 ufairy for the up front gas cost when submitting encrypted tx +$BINARY tx bank send $VALIDATOR_2 $NEW_ACC_ADDR 1100000ufairy --from $VALIDATOR_2 --gas-prices 1ufairy --home $CHAIN_DIR/$CHAINID_2 --chain-id $CHAINID_2 --node $CHAIN2_NODE --keyring-backend test --yes + +sleep 5 + +NEW_ACC_INFO=$($BINARY q auth account $NEW_ACC_ADDR --home $CHAIN_DIR/$CHAINID_2 --node $CHAIN2_NODE --output json) +echo $NEW_ACC_INFO + +RESULT=$($BINARY query pep show-pep-nonce $NEW_ACC_ADDR --home $CHAIN_DIR/$CHAINID_2 --chain-id $CHAINID_2 --node $CHAIN2_NODE -o json) + +NEW_ACC_PEP_NONCE=$(echo "$RESULT" | jq -r '.pep_nonce.nonce') +$BINARY tx bank send $NEW_ACC_ADDR $VALIDATOR_2 1ufairy --from new_temp --gas-prices 1ufairy --home $CHAIN_DIR/$CHAINID_2 --chain-id $CHAINID_2 --node $CHAIN2_NODE --keyring-backend test --generate-only -o json -y > unsigned3.json +SIGNED_DATA_3=$($BINARY tx sign unsigned3.json --from new_temp --offline --account-number 10 --sequence $NEW_ACC_PEP_NONCE --gas-prices 1ufairy --home $CHAIN_DIR/$CHAINID_2 --chain-id $CHAINID_2 --node $CHAIN2_NODE --keyring-backend test -y) echo "Query aggregated key share from key share module for submitting to pep module on chain fairyring_test_1" CURRENT_BLOCK=$($BINARY query consensus comet block-latest --home $CHAIN_DIR/$CHAINID_1 --node $CHAIN1_NODE -o json | jq -r '.block.header.height') @@ -163,6 +184,8 @@ RESULT=$($BINARY query keyshare list-decryption-keys --node $CHAIN1_NODE -o json AGG_KEY_HEIGHT=$(echo "$RESULT" | jq -r '.decryption_keys | last | .height') AGG_KEY=$(echo "$RESULT" | jq -r '.decryption_keys | last | .data') +sleep 5 + CURRENT_BLOCK=$($BINARY query consensus comet block-latest --home $CHAIN_DIR/$CHAINID_2 --node $CHAIN2_NODE -o json | jq -r '.block.header.height') echo "Chain 2 Current Block: $CURRENT_BLOCK" echo "Submit valid aggregated key to pep module on chain fairyring_test_2 from address: $VALIDATOR_2" @@ -195,10 +218,12 @@ CIPHER=$($BINARY encrypt $AGG_KEY_HEIGHT "" $SIGNED_DATA --node $CHAIN1_NODE) echo "Encrypting 2nd signed tx with Pub key: '$PUB_KEY'" CIPHER_2=$($BINARY encrypt $AGG_KEY_HEIGHT "" $SIGNED_DATA_2 --node $CHAIN1_NODE) +echo "Encrypting 3rd signed tx with Pub key: '$PUB_KEY'" +CIPHER_3=$($BINARY encrypt $AGG_KEY_HEIGHT "" $SIGNED_DATA_3 --node $CHAIN1_NODE) rm -r unsigned.json &> /dev/null rm -r unsigned2.json &> /dev/null - +rm -r unsigned3.json &> /dev/null RESULT=$($BINARY query bank balances $VALIDATOR_2 --node $CHAIN2_NODE -o json) BAL_DENOM=$(echo "$RESULT" | jq -r '.balances[0].denom') @@ -255,6 +280,25 @@ if [ "$VALIDATOR_PEP_NONCE" != "1" ]; then exit 1 fi +echo "Submit 3rd encrypted tx to pep module on chain fairyring_test_2" +RESULT=$($BINARY tx pep submit-encrypted-tx $CIPHER_3 $AGG_KEY_HEIGHT --from new_temp --gas-prices 1ufairy --gas 900000 --home $CHAIN_DIR/$CHAINID_2 --chain-id $CHAINID_2 --node $CHAIN2_NODE --broadcast-mode sync --keyring-backend test -o json -y) +check_tx_code $RESULT +RESULT=$(wait_for_tx $RESULT) +TARGET_HEIGHT=$(echo "$RESULT" | jq '.events' | jq 'map(select(any(.type; contains("new-encrypted-tx-submitted"))))[]' | jq '.attributes' | jq 'map(select(any(.key; contains("height"))))[]' | jq -r '.value') +if [ "$TARGET_HEIGHT" != "$AGG_KEY_HEIGHT" ]; then + echo "ERROR: Pep module submit 3rd encrypted tx error. Expected tx to submitted without error with target height '$AGG_KEY_HEIGHT', got '$TARGET_HEIGHT' and '$EVENT_TYPE' | '$CURRENT_BLOCK'" + echo "ERROR MESSAGE: $(echo "$RESULT" | jq -r '.raw_log')" + echo "ERROR MESSAGE: $(echo "$RESULT" | jq '.')" + echo $RESULT | jq + exit 1 +fi + + +RESULT=$($BINARY query bank balances $NEW_ACC_ADDR --node $CHAIN2_NODE -o json) +BAL_DENOM=$(echo "$RESULT" | jq -r '.balances[0].denom') +BAL_AMT=$(echo "$RESULT" | jq -r '.balances[0].amount') +echo "Balance after submitting second encrypted tx: $BAL_AMT$BAL_DENOM" + CURRENT_BLOCK=$($BINARY query consensus comet block-latest --home $CHAIN_DIR/$CHAINID_2 --node $CHAIN2_NODE -o json | jq -r '.block.header.height') echo "Chain 2 Current Block: $CURRENT_BLOCK" @@ -328,6 +372,7 @@ fi FIRST_ENCRYPTED_TX_HEIGHT=$($BINARY query pep list-encrypted-tx --node $CHAIN2_NODE -o json | jq -r '.encrypted_tx_array[0].encrypted_txs[0].processed_at_chain_height') SECOND_ENCRYPTED_TX_HEIGHT=$($BINARY query pep list-encrypted-tx --node $CHAIN2_NODE -o json | jq -r '.encrypted_tx_array[0].encrypted_txs[1].processed_at_chain_height') +THIRD_ENCRYPTED_TX_HEIGHT=$($BINARY query pep list-encrypted-tx --node $CHAIN2_NODE -o json | jq -r '.encrypted_tx_array[0].encrypted_txs[2].processed_at_chain_height') echo "First Encrypted tx processed at height: $FIRST_ENCRYPTED_TX_HEIGHT, 2nd one processed at: $SECOND_ENCRYPTED_TX_HEIGHT" @@ -343,7 +388,80 @@ if [[ "$SECOND_EVENT" != *"coin_received"* ]]; then echo "ERROR: Pep module expected second encrypted tx succeeded with events, got: $SECOND_EVENT instead" exit 1 fi -echo "Second Encrypted TX succeeded with Events: $(echo $SECOND_EVENT | jq) as expected." +echo "Second Encrypted TX succeeded as expected." + +echo "Third Encrypted TX: " +THIRD_EVENT=$($BINARY q block-results $THIRD_ENCRYPTED_TX_HEIGHT -o json | jq '.finalize_block_events[] | select(.type == "reverted-encrypted-tx") | .attributes[] | select(.key == "reason") | .value') +if [[ "$THIRD_EVENT" != *"insufficient fees"* ]]; then + echo "ERROR: Pep module expected third encrypted tx failed with reason insufficient fee, got: $THIRD_EVENT instead" + exit 1 +fi +echo "Third Encrypted TX Failed with Reason: $THIRD_EVENT as expected." + + +RESULT=$($BINARY query pep show-pep-nonce $VALIDATOR_2 --home $CHAIN_DIR/$CHAINID_2 --chain-id $CHAINID_2 --node $CHAIN2_NODE -o json) +LOOP_PEP_NONCE=$(echo "$RESULT" | jq -r '.pep_nonce.nonce') +echo "PEP Nonce for the wasm contract loop test: $LOOP_PEP_NONCE" +RESULT=$($BINARY tx wasm store ./scripts/tests/loop.wasm -y --output json --home $CHAIN_DIR/$CHAINID_2 --gas-prices 1ufairy --chain-id $CHAINID_2 --node $CHAIN2_NODE --from $VALIDATOR_2 --keyring-backend test --gas 2000000) +check_tx_code $RESULT +RESULT=$(wait_for_tx $RESULT) + +RESULT=$($BINARY tx wasm instantiate 1 '{}' -y --output json --home $CHAIN_DIR/$CHAINID_2 --gas-prices 1ufairy --chain-id $CHAINID_2 --node $CHAIN2_NODE --from $VALIDATOR_2 --keyring-backend test --admin $VALIDATOR_2 --label foo) +check_tx_code $RESULT +RESULT=$(wait_for_tx $RESULT) + +CONTRACT_ADDR=$($BINARY q wasm list-contracts-by-code 1 --output=json | jq -r '.contracts[0]') + +$BINARY tx wasm execute $CONTRACT_ADDR '{"identity": "", "pubkey": "", "decryption_key": ""}' -y --gas-prices 1ufairy --home $CHAIN_DIR/$CHAINID_2 --from $VALIDATOR_2 --keyring-backend test --chain-id $CHAINID_2 --generate-only > execute_loop_unsigned.json + +$BINARY tx sign execute_loop_unsigned.json --home $CHAIN_DIR/$CHAINID_2 --gas-prices 1ufairy --account-number 0 --sequence $LOOP_PEP_NONCE --from $VALIDATOR_2 --keyring-backend test --chain-id $CHAINID_2 > execute_loop.json +TARGET_HEIGHT=$(($($BINARY q pep latest-height --node $CHAIN1_NODE -o json | jq -r '.height') + 15)) + +$BINARY encrypt $TARGET_HEIGHT '' "$(cat execute_loop.json)" --node $CHAIN2_NODE --home $CHAIN_DIR/$CHAINID_2 > execute_loop.hex +RESULT=$($BINARY tx pep submit-encrypted-tx $(cat execute_loop.hex) $TARGET_HEIGHT -y --output json --gas-prices 1ufairy --home $CHAIN_DIR/$CHAINID_2 --from $VALIDATOR_2 --keyring-backend test --chain-id $CHAINID_2) +check_tx_code $RESULT +RESULT=$(wait_for_tx $RESULT) + +while true; do + CURRENT_BLOCK=$($BINARY query consensus comet block-latest --home $CHAIN_DIR/$CHAINID_1 --node $CHAIN1_NODE -o json | jq -r '.block.header.height') + RESULT=$($BINARY query keyshare list-decryption-keys --node $CHAIN1_NODE -o json) + AGG_KEY_HEIGHT=$(echo "$RESULT" | jq -r '.decryption_keys | last | .height') + echo "Getting decryption key on chain 1: aggr key height: $AGG_KEY_HEIGHT & Encrypted TX Target Height: $TARGET_HEIGHT" + AGG_KEY=$(echo "$RESULT" | jq -r '.decryption_keys | last | .data') + if [[ "$AGG_KEY_HEIGHT" -eq "$TARGET_HEIGHT" ]]; then + break + fi + sleep 1 +done + +echo "Submit valid aggregated key to pep module on chain fairyring_test_2 from address: $VALIDATOR_2" +RESULT=$($BINARY tx pep submit-decryption-key $AGG_KEY_HEIGHT $AGG_KEY --from $VALIDATOR_2 --gas-prices 1ufairy --home $CHAIN_DIR/$CHAINID_2 --chain-id $CHAINID_2 --node $CHAIN2_NODE --broadcast-mode sync --keyring-backend test -o json -y) +echo $RESULT +check_tx_code $RESULT +echo $RESULT +RESULT=$(wait_for_tx $RESULT) +echo $RESULT +ACTION=$(echo "$RESULT" | jq -r | jq '.events' | jq 'map(select(any(.type; contains("message"))))[]' | jq '.attributes' | jq 'map(select(any(.key; contains("action"))))[]' | jq -r '.value') +if [ "$ACTION" != "/fairyring.pep.MsgSubmitDecryptionKey" ]; then + echo "ERROR: Pep module submit decryption key error. Expected tx action to be MsgSubmitDecryptionKey, got '$ACTION'" + echo "ERROR MESSAGE: $(echo "$RESULT" | jq -r '.raw_log')" + exit 1 +fi + +rm execute_loop.hex &> /dev/null +rm execute_loop.json &> /dev/null +rm execute_loop_unsigned.json &> /dev/null + +echo "If the loop contract bug works, test script will be stucked right here." + +$BINARY query pep list-encrypted-tx --node $CHAIN2_NODE -o json | jq +LOOP_TX_HEIGHT=$($BINARY query pep list-encrypted-tx --node $CHAIN2_NODE -o json | jq -r '.encrypted_tx_array[1].encrypted_txs[0].processed_at_chain_height') +LOOP_TC_EVENT=$($BINARY q block-results $LOOP_TX_HEIGHT -o json | jq '.finalize_block_events[] | select(.type == "reverted-encrypted-tx") | .attributes[] | select(.key == "reason") | .value') +LOOP_TC_EVENT_2=$($BINARY q block-results $LOOP_TX_HEIGHT -o json | jq '.finalize_block_events[] | select(.type == "executed-encrypted-tx") | .attributes[] | select(.key == "events") | .value') + +echo "Test loop" +echo $LOOP_TC_EVENT | jq +echo $LOOP_TC_EVENT_2 | jq echo "#############################################" echo "Testing general keyshare on source chain" diff --git a/scripts/tests/start.sh b/scripts/tests/start.sh index 7e60d616..4a90edb4 100755 --- a/scripts/tests/start.sh +++ b/scripts/tests/start.sh @@ -155,6 +155,10 @@ sed -i -e 's/"avg_block_time": 5.6/"avg_block_time": 1.12/g' $CHAIN_DIR/$CHAINID sed -i -e 's/"is_source_chain": false/"is_source_chain": true/g' $CHAIN_DIR/$CHAINID_1/config/genesis.json +sed -i -e 's/"amount": "300000"/"amount": "1"/g' $CHAIN_DIR/$CHAINID_1/config/genesis.json +sed -i -e 's/"amount": "300000"/"amount": "1"/g' $CHAIN_DIR/$CHAINID_2/config/genesis.json + + jsonData2=$(cat "$CHAIN_DIR/$CHAINID_2/config/genesis.json") modifiedJson2=$(echo "$jsonData2" | jq '.app_state.gov.params.channel_id = "channel-0" | From b7f7c3c9c19993834ac932e9c51e63833bc83984 Mon Sep 17 00:00:00 2001 From: ap0calypse644 Date: Thu, 7 Nov 2024 00:54:33 +0530 Subject: [PATCH 07/12] creating new gas context --- x/pep/keeper/contract.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x/pep/keeper/contract.go b/x/pep/keeper/contract.go index b00d12ad..2f81842a 100644 --- a/x/pep/keeper/contract.go +++ b/x/pep/keeper/contract.go @@ -114,7 +114,8 @@ func (k Keeper) ExecuteContract(ctx sdk.Context, contractAddr string, msg types. gasLimit := k.MaxContractGas(ctx) // Create a new context with a gas meter - gasCtx := ctx.WithGasMeter(storetypes.NewGasMeter(gasLimit)) + gasCtx := ctx + gasCtx = gasCtx.WithGasMeter(storetypes.NewGasMeter(gasLimit)) // Execute the contract within the gas-limited context _, err = k.contractKeeper.Execute(gasCtx, addr, wasmAddr, msgBytes, sdk.Coins{}) From 2caae041c1bfafae23866bf8a8d1d88485002a35 Mon Sep 17 00:00:00 2001 From: p0p3yee Date: Thu, 7 Nov 2024 10:49:58 -0500 Subject: [PATCH 08/12] Add cap & panic recovery --- scripts/tests/start.sh | 4 ++-- x/pep/module/module.go | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/scripts/tests/start.sh b/scripts/tests/start.sh index 4a90edb4..eec0500e 100755 --- a/scripts/tests/start.sh +++ b/scripts/tests/start.sh @@ -155,8 +155,8 @@ sed -i -e 's/"avg_block_time": 5.6/"avg_block_time": 1.12/g' $CHAIN_DIR/$CHAINID sed -i -e 's/"is_source_chain": false/"is_source_chain": true/g' $CHAIN_DIR/$CHAINID_1/config/genesis.json -sed -i -e 's/"amount": "300000"/"amount": "1"/g' $CHAIN_DIR/$CHAINID_1/config/genesis.json -sed -i -e 's/"amount": "300000"/"amount": "1"/g' $CHAIN_DIR/$CHAINID_2/config/genesis.json +#sed -i -e 's/"amount": "300000"/"amount": "1"/g' $CHAIN_DIR/$CHAINID_1/config/genesis.json +#sed -i -e 's/"amount": "300000"/"amount": "1"/g' $CHAIN_DIR/$CHAINID_2/config/genesis.json jsonData2=$(cat "$CHAIN_DIR/$CHAINID_2/config/genesis.json") diff --git a/x/pep/module/module.go b/x/pep/module/module.go index f65aa58f..cfa5f632 100644 --- a/x/pep/module/module.go +++ b/x/pep/module/module.go @@ -3,6 +3,7 @@ package pep import ( "bytes" "context" + storetypes "cosmossdk.io/store/types" "encoding/hex" "encoding/json" "errors" @@ -819,8 +820,21 @@ func (am AppModule) decryptAndExecuteTx( } } + defer func(sdkCtx sdk.Context, tx DecryptionTx, startGas uint64) { + if r := recover(); r != nil { + am.keeper.Logger().Error("recovered from panic in contract execution", "error", r) + am.processFailedEncryptedTx(sdkCtx, tx, fmt.Sprintf("panic when handling tx message: %v", r), startGas) + } + }(ctx, eachTx, startConsumedGas) + handler := am.msgServiceRouter.Handler(txMsgs[0]) - handlerResult, err := handler(ctx, txMsgs[0]) + gasMax := am.keeper.GetParams(ctx).MinGasPrice.Amount.Uint64() + if eachTx.ChargedGas != nil { + gasMax = eachTx.ChargedGas.Amount.Uint64() + } + am.keeper.Logger().Info(fmt.Sprintf("What is the gas Max nunmber: %d charged gas ? %d", gasMax, eachTx.ChargedGas.Amount.Uint64())) + gasCtx := ctx.WithGasMeter(storetypes.NewGasMeter(gasMax)) + handlerResult, err := handler(gasCtx, txMsgs[0]) if err != nil { am.processFailedEncryptedTx(ctx, eachTx, fmt.Sprintf("error when handling tx message: %s", err.Error()), startConsumedGas) return err From 5c5f444359dca8b55dd0288b513024104f230976 Mon Sep 17 00:00:00 2001 From: p0p3yee Date: Thu, 7 Nov 2024 10:50:33 -0500 Subject: [PATCH 09/12] Add show balance before & after wasm loop encrypted tx --- scripts/tests/pep.sh | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/scripts/tests/pep.sh b/scripts/tests/pep.sh index af8e8fc6..71216084 100755 --- a/scripts/tests/pep.sh +++ b/scripts/tests/pep.sh @@ -165,7 +165,7 @@ echo "Send 300k ufairy to new account for testing" # 900,000 ufairy for submitting tx # the underlying tx suppossingly need 200,000ufairy gas # 1 ufairy for the up front gas cost when submitting encrypted tx -$BINARY tx bank send $VALIDATOR_2 $NEW_ACC_ADDR 1100000ufairy --from $VALIDATOR_2 --gas-prices 1ufairy --home $CHAIN_DIR/$CHAINID_2 --chain-id $CHAINID_2 --node $CHAIN2_NODE --keyring-backend test --yes +$BINARY tx bank send $VALIDATOR_2 $NEW_ACC_ADDR 1200000ufairy --from $VALIDATOR_2 --gas-prices 1ufairy --home $CHAIN_DIR/$CHAINID_2 --chain-id $CHAINID_2 --node $CHAIN2_NODE --keyring-backend test --yes sleep 5 @@ -412,6 +412,12 @@ RESULT=$(wait_for_tx $RESULT) CONTRACT_ADDR=$($BINARY q wasm list-contracts-by-code 1 --output=json | jq -r '.contracts[0]') +echo "" +echo "" +echo "Contract Addr: $CONTRACT_ADDR" +echo "" +echo "" + $BINARY tx wasm execute $CONTRACT_ADDR '{"identity": "", "pubkey": "", "decryption_key": ""}' -y --gas-prices 1ufairy --home $CHAIN_DIR/$CHAINID_2 --from $VALIDATOR_2 --keyring-backend test --chain-id $CHAINID_2 --generate-only > execute_loop_unsigned.json $BINARY tx sign execute_loop_unsigned.json --home $CHAIN_DIR/$CHAINID_2 --gas-prices 1ufairy --account-number 0 --sequence $LOOP_PEP_NONCE --from $VALIDATOR_2 --keyring-backend test --chain-id $CHAINID_2 > execute_loop.json @@ -434,13 +440,13 @@ while true; do sleep 1 done +RESULT=$($BINARY query bank balances $VALIDATOR_2 --node $CHAIN2_NODE -o json) +echo "Bank balance before executing wasm loop contract tx: $(echo $RESULT | jq)" + echo "Submit valid aggregated key to pep module on chain fairyring_test_2 from address: $VALIDATOR_2" RESULT=$($BINARY tx pep submit-decryption-key $AGG_KEY_HEIGHT $AGG_KEY --from $VALIDATOR_2 --gas-prices 1ufairy --home $CHAIN_DIR/$CHAINID_2 --chain-id $CHAINID_2 --node $CHAIN2_NODE --broadcast-mode sync --keyring-backend test -o json -y) -echo $RESULT check_tx_code $RESULT -echo $RESULT RESULT=$(wait_for_tx $RESULT) -echo $RESULT ACTION=$(echo "$RESULT" | jq -r | jq '.events' | jq 'map(select(any(.type; contains("message"))))[]' | jq '.attributes' | jq 'map(select(any(.key; contains("action"))))[]' | jq -r '.value') if [ "$ACTION" != "/fairyring.pep.MsgSubmitDecryptionKey" ]; then echo "ERROR: Pep module submit decryption key error. Expected tx action to be MsgSubmitDecryptionKey, got '$ACTION'" @@ -454,15 +460,16 @@ rm execute_loop_unsigned.json &> /dev/null echo "If the loop contract bug works, test script will be stucked right here." -$BINARY query pep list-encrypted-tx --node $CHAIN2_NODE -o json | jq LOOP_TX_HEIGHT=$($BINARY query pep list-encrypted-tx --node $CHAIN2_NODE -o json | jq -r '.encrypted_tx_array[1].encrypted_txs[0].processed_at_chain_height') LOOP_TC_EVENT=$($BINARY q block-results $LOOP_TX_HEIGHT -o json | jq '.finalize_block_events[] | select(.type == "reverted-encrypted-tx") | .attributes[] | select(.key == "reason") | .value') LOOP_TC_EVENT_2=$($BINARY q block-results $LOOP_TX_HEIGHT -o json | jq '.finalize_block_events[] | select(.type == "executed-encrypted-tx") | .attributes[] | select(.key == "events") | .value') -echo "Test loop" echo $LOOP_TC_EVENT | jq echo $LOOP_TC_EVENT_2 | jq +RESULT=$($BINARY query bank balances $VALIDATOR_2 --node $CHAIN2_NODE -o json) +echo "Bank balance AFTER executing wasm loop contract tx: $(echo $RESULT | jq)" + echo "#############################################" echo "Testing general keyshare on source chain" echo "#############################################" From 7ffa1fb12867974452a5734bc15c2d03550da42b Mon Sep 17 00:00:00 2001 From: p0p3yee Date: Fri, 8 Nov 2024 15:45:52 -0500 Subject: [PATCH 10/12] Fix checkTx invalid keyshare log --- x/keyshare/keeper/msg_send_keyshare.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/x/keyshare/keeper/msg_send_keyshare.go b/x/keyshare/keeper/msg_send_keyshare.go index 9a9aa903..ef912bdf 100644 --- a/x/keyshare/keeper/msg_send_keyshare.go +++ b/x/keyshare/keeper/msg_send_keyshare.go @@ -62,6 +62,20 @@ func (k msgServer) SendKeyshare(goCtx context.Context, msg *types.MsgSendKeyshar return nil, types.ErrCommitmentsNotFound } + pubKey, found := k.GetActivePubkey(ctx) + if !found { + return nil, types.ErrPubkeyNotFound + } + + if ctx.IsCheckTx() && msg.BlockHeight >= pubKey.Expiry { + queuedCommits, found := k.GetQueuedCommitments(ctx) + if !found { + return nil, types.ErrCommitmentsNotFound + } + k.Logger().Info("IsCheckTX && keyshare height is next epoch, using queued commitments for verification") + commitments = queuedCommits + } + commitmentsLen := uint64(len(commitments.Commitments)) if msg.KeyshareIndex > commitmentsLen { return nil, types.ErrInvalidKeyshareIndex.Wrap(fmt.Sprintf("Expect Index within: %d, got: %d", commitmentsLen, msg.KeyshareIndex)) From 23cc83c49fdfc06e70d9d7f7d5803f6b0c4f94b6 Mon Sep 17 00:00:00 2001 From: p0p3yee Date: Fri, 8 Nov 2024 15:47:48 -0500 Subject: [PATCH 11/12] Remove unused log --- x/pep/module/module.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/pep/module/module.go b/x/pep/module/module.go index cfa5f632..b71cf2cf 100644 --- a/x/pep/module/module.go +++ b/x/pep/module/module.go @@ -832,7 +832,7 @@ func (am AppModule) decryptAndExecuteTx( if eachTx.ChargedGas != nil { gasMax = eachTx.ChargedGas.Amount.Uint64() } - am.keeper.Logger().Info(fmt.Sprintf("What is the gas Max nunmber: %d charged gas ? %d", gasMax, eachTx.ChargedGas.Amount.Uint64())) + gasCtx := ctx.WithGasMeter(storetypes.NewGasMeter(gasMax)) handlerResult, err := handler(gasCtx, txMsgs[0]) if err != nil { From 37d49d300d2996db148a771ddb3b60e5e9ab911a Mon Sep 17 00:00:00 2001 From: p0p3yee Date: Fri, 8 Nov 2024 15:58:27 -0500 Subject: [PATCH 12/12] Add remove authorized address when unbonded --- x/keyshare/module/module.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/x/keyshare/module/module.go b/x/keyshare/module/module.go index 0e45d07f..9576e072 100644 --- a/x/keyshare/module/module.go +++ b/x/keyshare/module/module.go @@ -182,12 +182,15 @@ func (am AppModule) BeginBlock(cctx context.Context) error { continue } bondedVal, err := am.stakingKeeper.GetValidator(ctx, sdk.ValAddress(accAddr)) - if err != nil { - am.keeper.RemoveValidatorSet(ctx, eachValidator.Validator) - continue - } - if !bondedVal.IsBonded() { + if err != nil || !bondedVal.IsBonded() { am.keeper.RemoveValidatorSet(ctx, eachValidator.Validator) + for _, v := range am.keeper.GetAllAuthorizedAddress(ctx) { + if v.AuthorizedBy == eachValidator.Validator { + am.keeper.RemoveAuthorizedAddress(ctx, v.Target) + am.keeper.DecreaseAuthorizedCount(ctx, eachValidator.Validator) + break + } + } } }