x/feegrant
개요
이 문서는 fee grant 모듈을 설명합니다. 전체 ADR은 Fee Grant ADR-029를 참조하세요. 이 모듈은 계정이 수수료 허용량을 부여하고 해당 계정의 수수료를 사용할 수 있도록 합니다. 피부여자는 충분한 수수료를 유지할 필요 없이 모든 트랜잭션을 실행할 수 있습니다.목차
개념
Grant
Grant는 전체 컨텍스트와 함께 grant를 기록하기 위해 KVStore에 저장됩니다. 모든 grant에는 granter, grantee 및 어떤 종류의 allowance가 부여되었는지가 포함됩니다. granter는 grantee(수혜자 계정 주소)에게 grantee의 트랜잭션 수수료 일부 또는 전부를 지불할 수 있는 권한을 부여하는 계정 주소입니다. allowance는 grantee에게 부여된 수수료 허용량의 종류(BasicAllowance 또는 PeriodicAllowance, 아래 참조)를 정의합니다. allowance는 FeeAllowanceI를 구현하는 인터페이스를 받아들이며, Any 타입으로 인코딩됩니다. grantee와 granter에 대해 하나의 기존 수수료 grant만 허용되며, 자기 자신에 대한 grant는 허용되지 않습니다.
reference
FeeAllowanceI는 다음과 같습니다:
reference
수수료 허용량 타입
현재 두 가지 타입의 수수료 허용량이 있습니다:BasicAllowancePeriodicAllowanceAllowedMsgAllowance
BasicAllowance
BasicAllowance는 grantee가 granter의 계정에서 수수료를 사용할 수 있는 권한입니다. spend_limit 또는 expiration 중 하나가 한도에 도달하면 grant가 상태에서 제거됩니다.
reference
-
spend_limit은granter계정에서 사용할 수 있는 코인의 한도입니다. 비어 있으면 지출 한도가 없다고 가정하며,grantee는 만료 전까지granter계정 주소에서 사용 가능한 코인을 무제한으로 사용할 수 있습니다. -
expiration은 이 허용량이 만료되는 선택적 시간을 지정합니다. 값이 비어 있으면 grant에 만료가 없습니다. -
spend_limit과expiration에 빈 값으로 grant가 생성되어도 여전히 유효한 grant입니다.grantee가granter로부터 무제한의 코인을 사용하는 것을 제한하지 않으며 만료도 없습니다.grantee를 제한하는 유일한 방법은 grant를 취소하는 것입니다.
PeriodicAllowance
PeriodicAllowance는 지정된 기간 동안 반복되는 수수료 허용량입니다. grant가 만료되는 시기와 기간이 재설정되는 시기를 지정할 수 있습니다. 또한 지정된 기간 동안 사용할 수 있는 최대 코인 수를 정의할 수 있습니다.
reference
-
basic은 주기적 수수료 허용량에 대한 선택적BasicAllowance인스턴스입니다. 비어 있으면 grant에expiration과spend_limit이 없습니다. -
period는 특정 기간이며, 각 기간이 지나면period_can_spend가 재설정됩니다. -
period_spend_limit은 기간 동안 사용할 수 있는 최대 코인 수를 지정합니다. -
period_can_spend는 period_reset 시간 전까지 사용할 수 있는 남은 코인 수입니다. -
period_reset은 다음 기간 재설정이 언제 발생해야 하는지 추적합니다.
AllowedMsgAllowance
AllowedMsgAllowance는 수수료 허용량이며, BasicFeeAllowance, PeriodicAllowance 중 하나일 수 있지만 granter가 지정한 허용된 메시지로만 제한됩니다.
reference
-
allowance는BasicAllowance또는PeriodicAllowance입니다. -
allowed_messages는 주어진 허용량을 실행할 수 있는 메시지 배열입니다.
FeeGranter 플래그
feegrant 모듈은 fee granter로 트랜잭션을 실행하기 위해 CLI용 FeeGranter 플래그를 도입합니다. 이 플래그가 설정되면 clientCtx는 CLI를 통해 생성된 트랜잭션에 granter 계정 주소를 추가합니다.
reference
reference
reference
reference
부여된 수수료 공제
수수료는x/auth ante handler에서 grant로부터 공제됩니다. ante handler 작동 방식에 대해 자세히 알아보려면 Auth 모듈 AnteHandlers 가이드를 참조하세요.
Gas
DoS 공격을 방지하기 위해 필터링된x/feegrant를 사용하면 gas가 발생합니다. SDK는 grantee의 트랜잭션이 모두 granter가 설정한 필터를 준수하는지 확인해야 합니다. SDK는 필터에서 허용된 메시지를 반복하고 필터링된 메시지당 10 gas를 청구하여 이를 수행합니다. 그런 다음 SDK는 grantee가 보내는 메시지를 반복하여 메시지가 필터를 준수하는지 확인하고, 메시지당 10 gas를 청구합니다. SDK는 필터를 준수하지 않는 메시지를 발견하면 반복을 중지하고 트랜잭션을 실패시킵니다.
경고: gas는 부여된 허용량에서 청구됩니다. 허용량을 사용하여 트랜잭션을 보내기 전에 메시지가 필터(있는 경우)를 준수하는지 확인하세요.
Pruning
상태에서 grant의 만료 접두사와 함께 큐가 유지되며, 매 블록마다 EndBlock에서 현재 블록 시간과 비교하여 확인하고 정리합니다.상태
FeeAllowance
수수료 허용량은Grantee(수수료 허용량 피부여자의 계정 주소)와 Granter(수수료 허용량 부여자의 계정 주소)를 결합하여 식별됩니다.
수수료 허용량 grant는 다음과 같이 상태에 저장됩니다:
- Grant:
0x00 | grantee_addr_len (1 byte) | grantee_addr_bytes | granter_addr_len (1 byte) | granter_addr_bytes -> ProtocolBuffer(Grant)
reference
FeeAllowanceQueue
수수료 허용량 큐 항목은FeeAllowancePrefixQueue(즉, 0x01), expiration, grantee(수수료 허용량 피부여자의 계정 주소), granter(수수료 허용량 부여자의 계정 주소)를 결합하여 식별됩니다. Endblocker는 만료된 grant에 대해 FeeAllowanceQueue 상태를 확인하고 발견된 경우 FeeAllowance에서 정리합니다.
수수료 허용량 큐 키는 다음과 같이 상태에 저장됩니다:
- Grant:
0x01 | expiration_bytes | grantee_addr_len (1 byte) | grantee_addr_bytes | granter_addr_len (1 byte) | granter_addr_bytes -> EmptyBytes
메시지
Msg/GrantAllowance
수수료 허용량 grant는MsgGrantAllowance 메시지로 생성됩니다.
reference
Msg/RevokeAllowance
허용된 grant 수수료 허용량은MsgRevokeAllowance 메시지로 제거할 수 있습니다.
reference
이벤트
feegrant 모듈은 다음 이벤트를 발생시킵니다:Msg Server
MsgGrantAllowance
| Type | Attribute Key | Attribute Value |
|---|---|---|
| message | action | set_feegrant |
| message | granter | |
| message | grantee |
MsgRevokeAllowance
| Type | Attribute Key | Attribute Value |
|---|---|---|
| message | action | revoke_feegrant |
| message | granter | |
| message | grantee |
Exec fee allowance
| Type | Attribute Key | Attribute Value |
|---|---|---|
| message | action | use_feegrant |
| message | granter | |
| message | grantee |
Prune fee allowances
| Type | Attribute Key | Attribute Value |
|---|---|---|
| message | action | prune_feegrant |
| message | pruner |
클라이언트
CLI
사용자는 CLI를 사용하여feegrant 모듈을 쿼리하고 상호작용할 수 있습니다.
쿼리
query 명령을 사용하여 feegrant 상태를 쿼리할 수 있습니다.
grant
grant 명령을 사용하여 주어진 granter-grantee 쌍에 대한 grant를 쿼리할 수 있습니다.
grants
grants 명령을 사용하여 주어진 grantee에 대한 모든 grant를 쿼리할 수 있습니다.
트랜잭션
tx 명령을 사용하여 feegrant 모듈과 상호작용할 수 있습니다.
grant
grant 명령을 사용하여 다른 계정에 수수료 허용량을 부여할 수 있습니다. 수수료 허용량에는 만료 날짜, 총 지출 한도 및/또는 주기적 지출 한도가 있을 수 있습니다.
revoke
revoke 명령을 사용하여 부여된 수수료 허용량을 취소할 수 있습니다.
gRPC
사용자는 gRPC 엔드포인트를 사용하여feegrant 모듈을 쿼리할 수 있습니다.
Allowance
Allowance 엔드포인트를 사용하여 부여된 수수료 허용량을 쿼리할 수 있습니다.
Allowances
Allowances 엔드포인트를 사용하여 주어진 grantee에 대해 부여된 모든 수수료 허용량을 쿼리할 수 있습니다.
