이 페이지에서는 트랜잭션 정책에서 확인할 수 있는 속성을 설명하고 이더리움 (ETHEREUM_TX_V2 및 EIP712_TYPED_DATA_V1), 비트코인 (BITCOIN_TX_V2), Solana(SOLANA_TX_V1) 트랜잭션의 규칙 예시를 보여줍니다.
정책이 결합되는 방식, 시행되는 정책, 트랜잭션이 거부되는 이유를 알아보려면 트랜잭션 정책 평가를 참조하세요.
규칙 구조
트랜잭션 정책은 주 구성원, 작업, 리소스, 컨텍스트에 대한 단일 Cedar
permit 또는 forbid 문입니다.
permit (
principal,
action == Action::"buy_transaction",
resource == Resource::"transaction_management"
)
when {
context.principal_keyring == "institutional-treasury" &&
context.schema == "ETHEREUM_TX_V2" &&
context has amount_token_scaled && context.amount_token_scaled <= 1000000000
};
다음 사항에 유의하세요.
- 속성은 컨텍스트의 최상위 수준에 있습니다.
v1alpha1에서와 같이context.transaction.spend_amount_scaled가 아닌context.amount_token_scaled를 작성합니다. - 일부 속성은 선택사항입니다. 컨텍스트에 없는 선택적 속성으로 인해 정책이 평가되지 않고 평가되지 않는 정책은 일치하지 않습니다. 선택적 속성을 읽기 전에
has를 사용하거나forbid규칙에서unless { context has ... }를 사용하여 선택적 속성을 확인합니다. 자세한 내용은 시나리오 6 및 시나리오 8을 참조하세요. - Cedar 문자열은 대소문자를 구분합니다. 각 체인의 표에 설명된 형식으로 주소를 비교합니다.
주 구성원은 Cedar 요청을 참조하세요. CreateTransaction에서 허용하는 작업 (buy_transaction, sell_transaction, internal_transfer_transaction)은 작업 및 리소스를 참조하세요.
컨텍스트 속성
각 트랜잭션의 컨텍스트에는 페이로드에서 디코딩된 속성, 서명 키 및 키링의 ID, 시작자가 설정하는 메타데이터 속성 (fiat_amount, validity, principal_value1, principal_value2)이 있습니다.
페이로드 속성은 모든 블록체인에서 동일합니다. 다음 표에서는 모든 컨텍스트 속성을 설명하고 Ethereum, Bitcoin, Solana의 표에서는 다자간 계산이 해당 블록체인의 각 속성을 채우는 방법을 설명합니다.
| 속성 | 삼나무 유형 | 항상 표시 여부 | 값 |
|---|---|---|---|
schema |
String |
예 | 페이로드 형식: "ETHEREUM_TX_V2", "BITCOIN_TX_V2", "SOLANA_TX_V1" 또는 "EIP712_TYPED_DATA_V1" 자세한 내용은 스키마 이름을 참고하세요. |
blockchain |
String |
예 | "ETH", "BTC" 또는 "SOL" |
principal_keyring |
String |
예 | 서명 키를 보유하는 KeyRing의 ID입니다(예: "treasury"). |
principal_key |
String |
예 | 서명 키의 ID입니다(예: "hot-wallet-1"). |
secondary_key |
String |
예 | 페이로드에서 디코딩된 대상 주소, 토큰 또는 NFT 수신자, 승인된 지출자 또는 운영자, EIP-712 상대방입니다. |
amount_token_scaled |
Long |
없음 | 이전되거나 승인된 대체 가능한 금액으로, 자산의 10-9 단위입니다. 대체 가능한 금액이 전송되지 않는 경우(예: ERC-721 작업 또는 ETH를 전송하지 않는 계약 호출) 생략됩니다. 자세한 내용은 금액을 참고하세요. |
token_symbol |
String |
없음 | 애셋의 기호입니다(예: "ETH", "BTC", "SOL", "USDC"). 자산이 다자간 계산에서 인식하는 자산이 아닌 경우와 ERC-721 작업의 경우 생략됩니다. |
contract_address |
String |
없음 | ERC-20 또는 ERC-721 토큰 계약 또는 호출된 계약 (이더리움), 확인 계약 (EIP-712) 또는 민트 (솔라나)입니다. 네이티브 전송의 경우 생략됩니다. |
token_standard |
String |
없음 | "ERC721": ERC-721 전송 및 승인 (ETHEREUM_TX_V2)의 경우. 기본 전송 및 대체 가능 토큰 작업의 경우 생략됩니다. |
token_id |
String |
없음 | 256비트 ERC-721 tokenId(10진수 문자열(ETHEREUM_TX_V2)). setApprovalForAll 및 ERC-721이 아닌 트랜잭션의 경우 생략됩니다. |
from_address |
String |
없음 | ERC-721 transferFrom 및 safeTransferFrom 호출의 현재 소유자 (from)로, 대소문자가 혼합된 EIP-55 체크섬 형식입니다. |
approve_all |
Bool |
없음 | ERC-721의 approved 플래그는 setApprovalForAll(operator, approved)를 호출합니다. 운영자 승인을 부여할 때는 true, 취소할 때는 false입니다. |
deadline |
Long |
없음 | EIP712_TYPED_DATA_V1 메시지의 만료 시간(유닉스 시간 이후의 초 단위)으로, deadline, sigDeadline 또는 validBefore 필드에서 가져옵니다. |
eip712 |
Record |
없음 | 구조화된 EIP-712 페이로드: primary_type, domain, message(256비트 정수를 10진수 문자열로 사용) EIP712_TYPED_DATA_V1만 해당됩니다. |
chain_id |
Long |
없음 | EVM 체인 ID입니다(예: 이더리움 메인넷의 경우 1, Sepolia의 경우 11155111). 이더리움 및 EIP-712만 해당됩니다. |
max_fee_atomic |
Long |
예 | 트랜잭션에서 네트워크 수수료로 지불할 수 있는 최대 금액으로, 블록체인 기본 코인의 10-9 단위입니다. EIP712_TYPED_DATA_V1의 경우 0입니다. |
payload |
String |
예 | 페이로드의 16진수 인코딩 다이제스트입니다(소문자). |
time_stamp |
Long |
예 | 거래의 createTime(유닉스 시간 이후 경과 시간(초))입니다. |
key_lists |
Record/Set<String> |
예 | 인스턴스의 각 KeyList ID를 해당 KeyList의 블록체인 주소 Set<String>에 매핑하는 레코드입니다(createTime에서 확인됨). 인스턴스에 KeyList가 없는 경우 빈 레코드입니다. 대괄호 문법을 사용하여 KeyList를 읽습니다(예: context.key_lists["trusted-destinations"]). 자세한 내용은 Cedar 컨텍스트의 KeyList를 참고하세요. |
principal_keyring 및 principal_key는 전체 리소스 이름이 아닌 ID입니다. 키 ID는 해당 KeyRing 내에서만 고유합니다. principal_keyring를 선택하여 키링의 모든 키에 규칙을 적용하거나 두 속성을 모두 선택하여 하나의 키 이름을 지정합니다.
context.principal_keyring == "treasury" && context.principal_key == "hot-wallet-1"
Transaction.schema의 파서로 페이로드를 디코딩할 수 없거나 컨텍스트에 투영할 수 없는 경우 정책이 평가되지 않고 UNRECOGNIZED_PAYLOAD로 트랜잭션이 거부됩니다. 자세한 내용은 거부 사유를 참조하세요.
스키마 이름
schema 속성은 v1beta API의 PayloadSchema 값 이름입니다("ETHEREUM_TX_V2", "BITCOIN_TX_V2", "SOLANA_TX_V1" 또는 "EIP712_TYPED_DATA_V1"). v1alpha1 규칙에서 사용하는 소문자 이름(예: "ethereum.transaction.v2")은 v1beta에서 일치하지 않습니다.
schema 또는 blockchain 검사가 없는 규칙은 모든 블록체인에 적용됩니다.
규칙을 하나의 블록체인으로 제한하려면 schema를 선택합니다.
금액
amount_token_scaled 및 max_fee_atomic는 모든 애셋에 동일한 배율을 사용합니다. 1단위는 애셋의 10-9이므로 모든 애셋의 1.0은 1000000000입니다.
규칙 값을 가져오려면 금액에 1,000,000,000(109)을 곱합니다. 다음 표에는 몇 가지 예시가 나와 있습니다.
| 금액 | amount_token_scaled |
|---|---|
| 0.1 ETH | 100000000 |
| 1.0 ETH, 1.0 BTC, 1.0 SOL 또는 1.0 USDC | 1000000000 |
| 0.0025BTC (250,000사토시) | 2500000 |
| 1.5SOL (1,500,000,000램포트) | 1500000000 |
| 5,000 USDC | 5000000000000 |
ETH와 같이 소수점 이하 자릿수가 9자리 이상인 애셋의 경우 10-9보다 작은 금액 부분이 삭제됩니다. 규칙으로 확인할 수 없습니다.
이더리움
다음 표에서는 ETHEREUM_TX_V2 페이로드 (EIP-1559를 포함한 RLP 인코딩 기존 및 EIP-2718 트랜잭션)의 컨텍스트 속성을 설명합니다.
| 속성 | 값 |
|---|---|
secondary_key |
ETH 전송 및 계약 호출의 경우 트랜잭션의 to 주소입니다. ERC-20 transfer 및 transferFrom, ERC-721 transferFrom 및 safeTransferFrom의 경우 토큰 또는 NFT 수신자입니다. ERC-20 및 ERC-721 approve의 경우 승인된 지출자입니다. ERC-721 setApprovalForAll의 경우 연산자입니다. 대소문자가 혼합된 EIP-55 체크섬 형식입니다. |
amount_token_scaled |
ETH 전송 및 ERC-20 전송 및 승인의 경우 금액입니다. 계약 호출의 경우 호출과 함께 전송된 ETH입니다. ETH가 전송되지 않으면 생략됩니다. 대체 가능한 지출 한도가 NFT 토큰 ID와 일치하지 않도록 ERC-721 전송 및 승인에서는 항상 생략됩니다. |
token_symbol |
"ETH": ETH 전송 및 ETH를 전송하는 계약 호출 Ethereum Mainnet, "USDC", "USDT", "DAI" 또는 "WBTC"에서 인식된 ERC-20 토큰의 경우 다른 토큰 및 ERC-721 작업에서는 생략됩니다. |
contract_address |
ERC-20 및 ERC-721 전송 및 승인의 경우 토큰 또는 NFT 계약입니다. 계약 호출의 경우 호출된 계약입니다. 대소문자가 혼합된 EIP-55 체크섬 형식입니다. ETH 전송의 경우 생략됩니다. |
token_standard |
"ERC721": ERC-721 전송 및 승인 ETH 전송, ERC-20 작업, 기타 계약 호출의 경우 생략됩니다. |
token_id |
ERC-721 transferFrom, safeTransferFrom, approve의 경우 256비트 tokenId가 10진수 String로 표시되므로 NFT ID가 Cedar의 64비트 Long를 오버플로하지 않습니다. String이므로 == 또는 in [...]와 비교하여 동일한지 확인합니다. < 및 >는 숫자가 아닌 문자열을 비교합니다. setApprovalForAll 및 ERC-721이 아닌 트랜잭션의 경우 생략됩니다. |
from_address |
ERC-721 transferFrom 및 safeTransferFrom의 경우 현재 소유자 (from)이며 대소문자가 혼합된 EIP-55 체크섬 형식입니다. |
approve_all |
ERC-721 setApprovalForAll(operator, approved)의 경우 approved 플래그는 Bool로 표시됩니다. 컬렉션의 모든 NFT에 대한 운영자 승인을 부여할 때는 true, 취소할 때는 false입니다. |
chain_id |
거래의 체인 ID입니다. 기존 트랜잭션에서는 생략할 수 있으므로 has로 확인합니다. |
max_fee_atomic |
가스 한도 × 가스당 최대 수수료(또는 기존 거래의 가스 가격)(gwei 단위) |
선택기가 ERC-20에 고유한 ERC-20 transfer(address, uint256) (0xa9059cbb)의 경우 다자간 계산에서 인식하지 못하는 토큰의 금액은 토큰에 소수점 이하 자릿수가 18개인 것처럼 조정됩니다. contract_address로 인식된 토큰을 일치시키고 소수점이 18이 아닌 인식되지 않은 토큰에 금액 한도를 설정하지 않습니다. ERC-20 transferFrom 및 approve는 ERC-721과 선택기를 공유하므로 인식된 계약이 필요합니다. 이러한 선택기 중 하나를 사용하여 인식되지 않은 계약을 호출하면 UNRECOGNIZED_PAYLOAD로 거부됩니다. 자세한 내용은 ERC-721 대체 불가능 토큰을 참고하세요.
컨텍스트에는 어떤 종류의 이더리움 트랜잭션인지 명시되어 있지 않으므로 다음 사항에 유의하세요.
- ETH를 전송하는 계약 호출은 ETH 전송과 유사합니다. 둘 다
token_symbol"ETH"및amount_token_scaled가 있습니다. 계약 호출에만contract_address가 있습니다. ETH 전송만 허용하려면!(context has contract_address)를 추가합니다. - ERC-20 승인은 ERC-20 전송과 유사합니다.
approve는 동일한 주소로 동일한 금액을 전송하는 것과 동일한contract_address,amount_token_scaled,secondary_key(지출자)를 갖습니다. 전송을 허용하는 정책은 승인도 허용합니다.
계약 생성 트랜잭션 (빈 to 주소 포함)은 디코딩할 수 없으며 UNRECOGNIZED_PAYLOAD로 거부됩니다.
ERC-721 대체 불가능 토큰
ETHEREUM_TX_V2에서 다자간 계산은 다음 ERC-721 메서드를 디코딩합니다.
safeTransferFrom(address from, address to, uint256 tokenId)(0x42842e0e)safeTransferFrom(address from, address to, uint256 tokenId, bytes data)(0xb88d4fde)transferFrom(address from, address to, uint256 tokenId)(0x23b872dd)approve(address to, uint256 tokenId)(0x095ea7b3)setApprovalForAll(address operator, bool approved)(0xa22cb465)
ERC-20 및 ERC-721은 transferFrom(0x23b872dd) 및 approve (0x095ea7b3)에 동일한 4바이트 선택기를 공유합니다. uint256 인수가 대체 가능한 금액인지 토큰 ID인지 결정하기 위해 다자간 계산은 인식된 토큰 계약의 레지스트리에서 to 계약 주소를 조회합니다. ERC-721 호출의 경우 amount_token_scaled는 생략되고 token_standard는 "ERC721"이며 token_id는 10진수 String입니다. 이러한 공유 선택기 중 하나를 사용하여 인식되지 않는 계약을 호출하면 UNRECOGNIZED_PAYLOAD로 거부됩니다.
EIP-712 유형 데이터
EIP712_TYPED_DATA_V1 페이로드 (types, primaryType, domain, message가 있는 UTF-8 JSON 인코딩 EIP-712 유형 데이터)의 경우 다자간 계산은 JSON 구조를 검증하고 32바이트 EIP-712 서명 다이제스트 keccak256(0x1901 ++ domainSeparator ++ hashStruct(message))를 계산합니다. 여기서 ++는 바이트 연결입니다. 검증은 15개 수준보다 깊은 중첩, 순환 유형, null 배열 요소, types.EIP712Domain와 일치하지 않는 domain 필드를 거부하고 부동 소수점 정밀도 손실 없이 256비트 정수를 보존합니다.
EIP712_TYPED_DATA_V1 페이로드는 다음 속성을 프로젝션합니다.
| 속성 | 값 |
|---|---|
blockchain |
항상 "ETH"입니다. |
schema |
항상 "EIP712_TYPED_DATA_V1"입니다. |
contract_address |
domain.verifyingContract(대소문자가 혼합된 EIP-55 체크섬 형식) 도메인이 verifyingContract를 설정하지 않으면 생략됩니다. |
chain_id |
Long로서의 domain.chainId 도메인이 chainId를 설정하지 않으면 생략됩니다. |
max_fee_atomic |
유형이 지정된 데이터에 서명하는 데는 네트워크 수수료가 부과되지 않으므로 항상 0입니다. |
secondary_key |
인식된 메시지 유형의 경우 상대방: ERC-2612 Permit 및 Uniswap Permit2의 경우 spender, ERC-3009 TransferWithAuthorization 및 Safe SafeTx의 경우 to 다른 메시지 유형의 경우 domain.verifyingContract를 참고하세요. |
amount_token_scaled |
인식된 메시지 유형 (Permit, Permit2, TransferWithAuthorization, SafeTx)의 경우 승인된 토큰 또는 ETH 값 (value 또는 details.amount)이며 단위는 10-9입니다. 다른 메시지 유형의 경우 생략됩니다. |
token_symbol |
확인 계약 또는 Permit2 토큰 (details.token)이 Ethereum Mainnet에서 인식되는 토큰인 경우 "USDC", "USDT", "DAI" 또는 "WBTC"입니다. 그렇지 않으면 생략됩니다. |
deadline |
메시지에 deadline, sigDeadline 또는 validBefore 필드가 있는 경우 유닉스 시간 이후의 메시지 만료 시간(초)입니다. 그렇지 않으면 생략됩니다. |
eip712 |
입력된 데이터가 포함된 Record입니다. 자세한 내용은 다음 표를 참조하세요. |
eip712 레코드에는 다음 필드가 있습니다.
| 필드 | 삼나무 유형 | 값 |
|---|---|---|
context.eip712.primary_type |
String |
primaryType 이름(예: "Permit", "PermitSingle", "TransferWithAuthorization", "SafeTx") |
context.eip712.domain |
Record |
페이로드가 설정하는 EIP712Domain 필드: name, version, chainId, verifyingContract, salt |
context.eip712.message |
Record |
message 필드 256비트 정수 값 (uint256 및 int256)은 10진수 String이므로 규칙은 64비트 오버플로 없이 정확한 값과 일치할 수 있습니다. |
비트코인
다음 표에서는 BITCOIN_TX_V2 페이로드 (BIP 174 PSBT v0)의 컨텍스트 속성을 설명합니다.
| 속성 | 값 |
|---|---|
secondary_key |
변경되지 않은 출력 하나의 주소입니다. 모든 출력이 변경되는 통합의 경우 첫 번째 출력의 주소입니다. |
amount_token_scaled |
secondary_key에 전송된 금액으로, 잔돈은 포함되지 않습니다 (1사토시 = 10). 통합의 경우 0입니다. |
token_symbol |
항상 "BTC"입니다. |
contract_address |
표시되지 않습니다. |
chain_id |
PSBT는 어떤 네트워크를 위한 것인지 명시하지 않으므로 표시되지 않습니다. 주소는 항상 메인넷 주소로 형식이 지정되므로 테스트넷 주소도 bc1, 1 또는 3로 시작합니다. 주소 프리픽스는 네트워크가 아닌 주소 유형을 표시합니다. |
max_fee_atomic |
채굴자 수수료: 총 입력에서 총 출력을 뺀 값 (1사토시 = 10) |
비트코인 네트워크를 분리하려면 각 네트워크에 서로 다른 키를 사용합니다(예: 메인넷용 키링과 테스트넷용 키링). 그런 다음 principal_keyring 또는 principal_key를 사용하여 규칙을 해당 키로 범위 지정합니다. 동일한 키로 두 네트워크 모두에 서명할 수 있으므로 테스트넷에서 메인넷 키를 사용하지 않는 경우에만 작동합니다.
변경되지 않은 주소 두 개 이상으로 전송하는 트랜잭션은 디코딩할 수 없습니다. 변경되지 않는 유일한 출력이 OP_RETURN 출력인 경우와 같이 전송할 주소가 없는 트랜잭션은 평가할 수 없습니다.
Solana
다음 표에서는 SOLANA_TX_V1 페이로드 (서명되지 않은 기존 또는 v0 Solana 메시지)의 컨텍스트 속성을 설명합니다.
| 속성 | 값 |
|---|---|
secondary_key |
SOL 전송의 경우 대상 지갑입니다. 토큰 전송의 경우, 지갑이 아닌 대상 토큰 계정입니다. base58입니다. |
amount_token_scaled |
금액입니다. SOL의 경우 램포트 수 (1램포트 = 1)입니다. 토큰의 경우 TransferChecked 명령어가 전달하는 소수점으로 조정된 원시 금액입니다. |
token_symbol |
SOL 트랜스퍼의 경우 "SOL" 토큰의 경우 "USDC", "USDT" 또는 "PYUSD"입니다. 다른 민트의 경우 생략됩니다. |
contract_address |
토큰 전송의 경우 base58의 민트 주소입니다. SOL 전송의 경우 생략됩니다. |
chain_id |
표시되지 않습니다. Solana 메시지에는 클러스터 이름이 지정되지 않습니다. |
max_fee_atomic |
전체 트랜잭션에서 램포트로 지불할 수 있는 최대 금액: 필요한 서명당 5,000개에 우선순위 수수료를 더한 금액입니다. 트랜잭션에서 컴퓨팅 단위 가격을 설정하는 경우 ⌈컴퓨팅 단위 한도 × 마이크로 램포트 단위의 컴퓨팅 단위 가격 ÷ 106⌉입니다. |
솔라나 트랜잭션에는 여러 명령어가 포함될 수 있습니다.
- 전송 안내: 시스템 프로그램
Transfer(SOL) 및 SPL 토큰 또는 토큰-2022TransferChecked선택 해제된Transfer명령어와 소수점 이하 자릿수가 9자리를 초과하는 토큰은 디코딩할 수 없습니다. - 기타 안내: ComputeBudget
SetComputeUnitLimit및SetComputeUnitPrice, 메모 (v1 및 v2), 연결된 토큰 계정Create및CreateIdempotent, 시스템 프로그램AdvanceNonceAccount이러한 안내는 자체 컨텍스트를 생성하지 않습니다.
각 전송 안내는 자체 컨텍스트를 사용하여 별도로 평가됩니다. 트랜잭션은 모든 전송이 허용되는 경우에만 허용됩니다. 전송이 거부되면 전체 트랜잭션이 거부됩니다. max_fee_atomic는 전체 트랜잭션에 대한 수수료이며 모든 컨텍스트에서 동일하므로 전송 간에 합산하지 마세요.
트랜잭션에서 컴퓨팅 단위 한도 없이 컴퓨팅 단위 가격을 설정하는 경우 수수료는 ComputeBudget 명령어를 제외한 각 명령어에 대해 Solana 기본 한도인 200,000 컴퓨팅 단위를 사용하며, 최대 1,400,000까지 가능합니다.
트랜잭션의 서명자는 각 명령어가 서명해야 하는 계정과 일치해야 하며 소스 및 대상 계정은 쓰기 가능해야 합니다. 주소 참고표를 사용하는 v0 메시지는 디코딩할 수 없습니다. 서명된 트랜잭션 엔벨로프가 아닌 서명되지 않은 메시지 바이트를 Transaction.payload 및 Transaction.rawMessage에 전달합니다.
인식되는 민트는 Solana 메인넷 민트입니다. Devnet 또는 Testnet에서 토큰 전송에는 token_symbol가 없으므로 대신 contract_address를 확인합니다.
연결된 토큰 계정 Create 명령어는 새 계정의 임대료 면제 준비금을 SOL로 자금을 조달합니다. amount_token_scaled에 없는 금액입니다.
규칙 예
다음 예시는 조정할 수 있는 permit 및 forbid 정책입니다.
각 예시는 선택적 속성을 읽기 전에 has로 모든 선택적 속성을 확인합니다.
페이로드 및 메타데이터를 사용하는 KeyRing의 구매 한도
시작자가 트랜잭션에 "equities-desk" 라벨을 지정하고, 유효성을 최대 300초로 설정하고, 최대 $500,000의 값을 지정하는 경우 institutional-treasury 키링의 모든 키에서 Ethereum Mainnet에서 최대 500,000 USDC의 buy_transaction 전송을 허용합니다.
permit (
principal,
action == Action::"buy_transaction",
resource == Resource::"transaction_management"
)
when {
context.principal_keyring == "institutional-treasury" &&
context.schema == "ETHEREUM_TX_V2" &&
context has chain_id && context.chain_id == 1 &&
context has contract_address &&
context.contract_address == "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" &&
context has amount_token_scaled && context.amount_token_scaled <= 500000000000000 &&
context has fiat_amount && context.fiat_amount <= 500000 &&
context has validity && context.validity <= 300 &&
context has principal_value1 && context.principal_value1 == "equities-desk"
};
다자간 계산은 페이로드에 대해 fiat_amount를 확인하지 않습니다. 자세한 내용은 컨텍스트 속성을 참조하세요.
키 1개의 지출 한도
Ethereum Mainnet의 키 하나에서 최대 1ETH의 ETH 전송을 허용합니다.
!(context has contract_address)는 ETH를 전송하는 계약 호출을 제외합니다.
permit (principal, action, resource)
when {
context.principal_keyring == "treasury" &&
context.principal_key == "hot-wallet-1" &&
context.schema == "ETHEREUM_TX_V2" &&
context has chain_id && context.chain_id == 1 &&
context has token_symbol && context.token_symbol == "ETH" &&
!(context has contract_address) &&
context has amount_token_scaled && context.amount_token_scaled <= 1000000000
};
이더리움의 스테이블코인 허용 목록
하나의 주소로 최대 5,000 USDC를 전송하고 해당 주소에 대해 최대 5,000 USDC를 승인(허용)할 수 있습니다. 정책은 token_symbol가 아닌 contract_address를 확인하므로 동일한 기호를 사용하는 다른 계약의 토큰은 일치하지 않습니다.
permit (principal, action, resource)
when {
context.schema == "ETHEREUM_TX_V2" &&
context has contract_address &&
context.contract_address == "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" &&
context.secondary_key == "0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B" &&
context has amount_token_scaled && context.amount_token_scaled <= 5000000000000
};
이 거래의 token_symbol은(는) "USDC"입니다.
ERC-721 전송 및 운영자 승인 가드
승인된 ERC-721 계약에서 결제 주소로 토큰화된 국채 (token_id == "1042") 1개를 전송하도록 허용하고 컬렉션 전체 운영자 승인 (approve_all == true가 있는 setApprovalForAll)을 부여하지 못하도록 합니다.
정책 A는 NFT 전송을 하나 허용합니다.
permit (
principal,
action == Action::"internal_transfer_transaction",
resource == Resource::"transaction_management"
)
when {
context.schema == "ETHEREUM_TX_V2" &&
context has chain_id && context.chain_id == 1 &&
context has token_standard && context.token_standard == "ERC721" &&
context has contract_address &&
context.contract_address == "0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D" &&
context has token_id && context.token_id == "1042" &&
context.secondary_key == "0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B"
};
정책 B는 컬렉션 전체 연산자 승인을 금지합니다.
forbid (principal, action, resource)
when {
context.schema == "ETHEREUM_TX_V2" &&
context has approve_all && context.approve_all == true
};
EIP-712 가스 없는 USDC 허가 한도
승인된 정산 라우터에 대해 이더리움 메인넷에서 최대 25,000 USDC에 대한 오프체인 ERC-2612 Permit 서명을 허용합니다(허가가 특정 시간 전에 만료되는 경우).
permit (
principal,
action == Action::"buy_transaction",
resource == Resource::"transaction_management"
)
when {
context.schema == "EIP712_TYPED_DATA_V1" &&
context has chain_id && context.chain_id == 1 &&
context has contract_address &&
context.contract_address == "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" &&
context has eip712 && context.eip712.primary_type == "Permit" &&
context.secondary_key == "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45" &&
context has amount_token_scaled && context.amount_token_scaled <= 25000000000000 &&
context has deadline && context.deadline <= 1793491200
};
비트코인 지출 한도 및 수수료 한도
비트코인 메인넷에서만 사용하는 KeyRing의 키에서 최대 10,000사토시의 채굴자 수수료로 최대 0.0025 BTC의 전송을 허용합니다.
permit (principal, action, resource)
when {
context.schema == "BITCOIN_TX_V2" &&
context.principal_keyring == "btc-mainnet" &&
context has amount_token_scaled && context.amount_token_scaled <= 2500000 &&
context.max_fee_atomic <= 100000
};
SOL 전송 및 우선순위 수수료 한도
우선순위 수수료를 포함한 총 수수료가 최대 50,000램포트 (0.00005 SOL)인 경우 최대 1.5 SOL의 SOL 전송을 허용합니다.
permit (principal, action, resource)
when {
context.schema == "SOLANA_TX_V1" &&
context has token_symbol && context.token_symbol == "SOL" &&
!(context has contract_address) &&
context has amount_token_scaled && context.amount_token_scaled <= 1500000000 &&
context.max_fee_atomic <= 50000
};
Solana의 SPL 토큰 또는 Token-2022 전송
하나의 토큰 계정으로 최대 250 USDC를 전송할 수 있습니다. 컨텍스트에서 전송에 사용되는 프로그램을 지정하지 않으므로 동일한 규칙이 SPL 토큰 및 토큰-2022 프로그램과 일치합니다.
permit (principal, action, resource)
when {
context.schema == "SOLANA_TX_V1" &&
context has contract_address &&
context.contract_address == "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" &&
context.secondary_key == "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" &&
context has amount_token_scaled && context.amount_token_scaled <= 250000000000
};
secondary_key은 이 민트의 수신자 토큰 계정입니다. 수신자 지갑을 허용하려면 허용하는 각 민트에 대해 토큰 계정을 나열합니다. 여러 전송이 있는 트랜잭션에서 이 규칙은 모든 전송과 일치해야 합니다.
인식할 수 없는 저작물 블록
자산 다자간 계산에서 인식하지 못하는 전송을 거부합니다. 이 forbid 정책은 has만 사용하므로 평가에 실패할 수 없습니다.
forbid (principal, action, resource)
when { context has amount_token_scaled }
unless { context has token_symbol };
블록체인의 수수료 한도
max_fee_atomic는 항상 존재하므로 이 forbid 정책은 평가에 실패할 수 없습니다. 배율은 각 기본 코인의 10-9이므로 동일한 숫자가 각 블록체인에서 다른 값입니다. 정책 범위를 하나의 블록체인으로 지정합니다.
forbid (principal, action, resource)
when { context.blockchain == "ETH" && context.max_fee_atomic > 10000000 };
이렇게 하면 수수료로 0.01 ETH 이상을 지불할 수 있는 Ethereum 트랜잭션이 거부됩니다.
키링
KeyRing은 MPC 키(예: "institutional-treasury" 또는 "btc-cold-storage")를 그룹화하는 정적 컨테이너입니다. 각 키는 단일 KeyRing 내에서 생성되며 해당 KeyRing에 영구적으로 유지됩니다.
키링은 세 가지 방법으로 정책에 참여합니다.
- KeyRing
KeyPolicy(서명 정족수) KeyRing을 만들 때 변경할 수 없는 KeyPolicy를 설정합니다. 이 정책은 키 공유를 보유하고 KeyRing의 키가 서명하기 전에 승인해야 하는 팀 및 사용자의 기준 트리를 정의합니다. 트랜잭션 정책은KeyPolicy와 함께 작동합니다. 트랜잭션 정책은 페이로드 (PERMIT또는DENY)의 비즈니스 규칙을 평가하고 키링의KeyPolicy는 서명 절차를 승인해야 하는 키 공유를 제어합니다. 서명 키링(
context.principal_keyring)으로 트랜잭션 정책 범위 지정. 모든 트랜잭션의 컨텍스트에는 서명 키를 보유하는 키링의 ID로 설정된context.principal_keyring와 서명 키의 ID로 설정된context.principal_key가 포함됩니다.context.principal_keyring == "institutional-treasury"가 있는 규칙은 새 정책을 만들거나 승인하지 않고도 해당 키링에서 나중에 생성된 키를 포함하여 키링의 모든 키에 적용됩니다.permit ( principal, action == Action::"internal_transfer_transaction", resource == Resource::"transaction_management" ) when { context.principal_keyring == "institutional-treasury" && context has fiat_amount && context.fiat_amount <= 100000 };대상 KeyRing 허용 목록 (KeyList)입니다. 또한 KeyRing을 KeyList의 항목으로 추가하여 새 키가 생성될 때 해당 KeyRing에 있는 활성 키의 블록체인 주소로의 전송(예: 핫 KeyRing과 콜드 KeyRing 간의 내부 스윕)이 자동으로 허용되도록 할 수 있습니다. 예시는 KeyList 허용 목록 및 차단 목록을 참조하세요.
KeyList 허용 목록 및 차단 목록
trusted-destinations KeyList의 주소로만 최대 1ETH의 전송을 허용합니다. context.key_lists["trusted-destinations"]는 트랜잭션의 createTime에서 KeyList가 확장되는 주소 집합이므로 항목을 추가하거나 삭제하면 새 정책 없이 이 규칙에서 허용하는 항목이 변경됩니다.
// Assuming you created a KeyList with ID "trusted-destinations":
permit (principal, action, resource)
when {
context.schema == "ETHEREUM_TX_V2" &&
context has token_symbol && context.token_symbol == "ETH" &&
!(context has contract_address) &&
context.key_lists["trusted-destinations"].contains(context.secondary_key) &&
context has amount_token_scaled && context.amount_token_scaled <= 1000000000
};
모든 블록체인에서 blocked-addresses KeyList의 주소에 대한 모든 트랜잭션을 거부합니다. key_lists 및 secondary_key는 항상 존재하며 CreateTransactionPolicy는 KeyList가 있는지 확인하므로 이 forbid 정책은 평가에 실패할 수 없습니다.
// Assuming you created a KeyList with ID "blocked-addresses":
forbid (principal, action, resource)
when { context.key_lists["blocked-addresses"].contains(context.secondary_key) };
KeyList ID를 점 문법이 아닌 대괄호 문법(context.key_lists["..."])으로 작성합니다. 하이픈이 포함되거나 숫자로 시작하는 ID의 경우 점 문법이 파싱되지 않습니다. 항목은 문자열로 비교되므로 각 블록체인의 테이블에 설명된 주소 형식으로 수동 항목을 추가합니다. 자세한 내용은 Cedar 컨텍스트의 KeyList를 참조하세요.