내장 함수

정책에서 사용 가능한 모든 내장 함수에 대한 완전한 참조

정책에서는 다음 내장 함수만 활성화됩니다. 여기에 나열되지 않은 함수는 보안상의 이유로 비활성화되었습니다. 비활성화된 함수에 대한 자세한 내용은 제한 사항을 참조하세요.

문자열 함수

문자열 값을 조작하고 검사하기 위한 함수입니다. 주소, 메서드 이름 및 기타 텍스트 필드를 작업하는 데 필수적입니다.

contains

문자열에 부분 문자열이 포함되어 있는지 확인합니다. 발견되면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

예제

# Block any method containing "sign"
deny if {
    contains(input.rpc_method, "sign")
}

startswith

문자열이 접두사로 시작하는지 확인합니다. 메서드 카테고리나 주소 패턴을 일치시키는 데 유용합니다.

예제

# Block debug methods
deny if {
    startswith(input.rpc_method, "debug_")
}
 
# Block addresses starting with many zeros
deny if {
    startswith(input.to_address, "0x00000000")
}

endswith

문자열이 접미사로 끝나는지 확인합니다.

예제

# Block addresses ending with specific pattern
deny if {
    endswith(lower(input.to_address), "dead")
}

lower

문자열을 소문자로 변환합니다. 주소는 대소문자가 혼합될 수 있으므로 대소문자를 구분하지 않는 주소 비교에 필수적입니다.

예제

# Case-insensitive address check
blocked_addresses := {
    "0x000000000000000000000000000000000000dead"
}
 
deny if {
    lower(input.to_address) in blocked_addresses
}

upper

문자열을 대문자로 변환합니다.

예제

# Normalize method names that might have inconsistent casing
deny if {
    upper(input.rpc_method) == "ETH_SENDTRANSACTION"
    input.usd_value > 10000
}

concat

구분 기호를 사용하여 문자열 배열을 결합합니다.

예제

# Join values for logging or comparison
message := concat(", ", ["chain:", input.chain, "method:", input.rpc_method])

split

구분 기호를 사용하여 문자열을 배열로 분할합니다.

예제

# Parse a method name
parts := split(input.rpc_method, "_")
 
deny if {
    parts[0] == "debug"
}

replace

부분 문자열의 모든 발생을 다른 문자열로 바꿉니다.

예제

# Normalize address format
normalized := replace(input.to_address, "0X", "0x")

substring

시작 위치와 길이로 문자열의 일부를 추출합니다.

예제

# Get method prefix (first 4 characters after "eth_")
deny if {
    startswith(input.rpc_method, "eth_")
    method_action := substring(input.rpc_method, 4, 4)
    method_action == "send"
}

sprintf

플레이스홀더를 사용하여 문자열을 형식화합니다. 동적 값을 만드는 데 유용합니다.

PlaceholderType
%sString
%dInteger
%fFloat
%vAny value

예제

# Create formatted message
threshold := 10000
message := sprintf("Value %d exceeds limit of %d", [input.usd_value, threshold])

trim

문자열의 양쪽 끝에서 지정된 문자를 제거합니다.

예제

# Remove specific characters from both ends
cleaned := trim(input.rpc_method, "_")

trim_space

문자열의 양쪽 끝에서 공백을 제거합니다.

예제

# Clean up input with extra spaces
clean_method := trim_space(input.rpc_method)

trim_prefix

존재하는 경우 문자열에서 접두사를 제거합니다.

예제

# Remove common prefix to get the action name
method_name := trim_prefix(input.rpc_method, "eth_")
 
deny if {
    method_name == "sendTransaction"
}

trim_suffix

존재하는 경우 문자열에서 접미사를 제거합니다.

예제

# Remove suffix for comparison
base_method := trim_suffix(input.rpc_method, "_v2")

indexof

부분 문자열의 첫 번째 발생 인덱스를 찾습니다. 찾을 수 없으면 -1을 반환합니다.

예제

# Check if underscore exists
deny if {
    indexof(input.rpc_method, "_") == -1
}

정규식 함수

정규식을 사용한 패턴 일치를 위한 함수입니다. 복잡한 패턴의 경우 문자열 함수보다 강력합니다.

regex.match

문자열이 정규식 패턴과 일치하는지 확인합니다. true 또는 false를 반환합니다.

예제

# Block methods starting with debug_, admin_, or personal_
deny if {
    regex.match("^(debug_|admin_|personal_)", input.rpc_method)
}
 
# Block addresses with many leading zeros
deny if {
    regex.match("^0x0{10,}", input.to_address)
}

regex.replace

패턴의 모든 일치 항목을 대체 문자열로 바꿉니다.

예제

# Remove all non-alphanumeric characters
cleaned := regex.replace(input.rpc_method, "[^a-zA-Z0-9]", "")

regex.split

정규식 패턴으로 문자열을 분할합니다.

예제

# Split by multiple delimiters
parts := regex.split("[_.]", input.rpc_method)

regex.find_n

문자열에서 패턴의 최대 n개 일치 항목을 찾습니다.

예제

# Find all hex sequences
hex_matches := regex.find_n("0x[a-fA-F0-9]+", input.raw_params[0].data, 10)
 
deny if {
    count(hex_matches) > 5
}

시간 함수

시간을 다루기 위한 함수입니다. 모든 시간 값은 Unix 에포크 이후 나노초 단위입니다.

time.now_ns

나노초 단위로 현재 시간을 가져옵니다. 시간 기반 정책의 기초로 이것을 사용하세요.

예제

# Block high-value transactions during volatile market hours
deny if {
    current := time.now_ns()
    [hour, _, _] := time.clock(current)
    hour >= 14  # After 2 PM UTC (US market open)
    hour < 21   # Before 9 PM UTC (US market close)
    input.usd_value > 50000
}

time.clock

타임스탬프에서 시, 분, 초를 추출합니다. [hour, minute, second]를 반환합니다.

예제

# Block outside business hours (9 AM - 5 PM UTC)
deny if {
    [hour, _, _] := time.clock(time.now_ns())
    hour < 9
}
 
deny if {
    [hour, _, _] := time.clock(time.now_ns())
    hour >= 17
}

time.weekday

타임스탬프에서 요일을 가져옵니다. 0(일요일)부터 6(토요일)까지 반환합니다.

예제

# Block on weekends
deny if {
    day := time.weekday(time.now_ns())
    day == 0  # Sunday
}
 
deny if {
    day := time.weekday(time.now_ns())
    day == 6  # Saturday
}

time.date

타임스탬프에서 연도, 월, 일을 추출합니다. [year, month, day]를 반환합니다.

예제

# Block on specific dates
deny if {
    [year, month, day] := time.date(time.now_ns())
    month == 12
    day == 25  # Christmas
}

time.parse_rfc3339_ns

RFC3339 형식의 타임스탬프 문자열을 나노초로 구문 분석합니다.

예제

# Compare against a specific date
cutoff := time.parse_rfc3339_ns("2024-12-31T23:59:59Z")
 
deny if {
    time.now_ns() > cutoff
}

time.add_date

타임스탬프에 연도, 월, 일을 추가합니다.

예제

# Block transactions if we're within 7 days of year end
deny if {
    year_end := time.parse_rfc3339_ns("2024-12-31T23:59:59Z")
    week_before := time.add_date(year_end, 0, 0, -7)
    time.now_ns() > week_before
    input.usd_value > 10000
}

time.diff

두 타임스탬프 간의 차이를 계산합니다. [years, months, days, hours, minutes, seconds]를 반환합니다.

예제

# Check if more than 1 hour has passed
start := time.parse_rfc3339_ns("2024-01-01T00:00:00Z")
[_, _, _, hours, _, _] := time.diff(time.now_ns(), start)
 
deny if {
    hours > 1
}

집계 함수

값의 컬렉션을 다루기 위한 함수입니다.

count

배열, 집합 또는 객체의 요소 수를 셉니다.

예제

# Limit number of contracts in a request
deny if {
    count(input.contract_addresses) > 5
}
 
# Ensure at least one address
deny if {
    count(input.contract_addresses) == 0
}

sum

배열의 숫자 합계를 계산합니다.

예제

# Block if total gas across params exceeds limit
deny if {
    gas_values := [to_number(p.gas) | some p in input.raw_params; p.gas != null]
    sum(gas_values) > 5000000
}

max

배열에서 최대값을 찾습니다.

예제

# Check against maximum in a set of thresholds
thresholds := [1000, 5000, 10000]
 
deny if {
    input.usd_value > max(thresholds)
}

min

배열에서 최소값을 찾습니다.

예제

# Ensure value meets minimum threshold
thresholds := [100, 500, 1000]
 
deny if {
    input.usd_value < min(thresholds)
}

sort

배열을 오름차순으로 정렬합니다.

예제

# Check if smallest contract address looks suspicious (many leading zeros)
deny if {
    count(input.contract_addresses) > 0
    sorted_addrs := sort(input.contract_addresses)
    startswith(sorted_addrs[0], "0x00000000")
}

product

배열의 숫자 곱을 계산합니다.

예제

# Calculate combined risk score from multiple factors
deny if {
    risk_factors := [2, 3]  # High-value = 2x, Unknown sender = 3x
    combined_risk := product(risk_factors)
    combined_risk > 5
}

타입 함수

데이터 타입을 확인하고 작업하기 위한 함수입니다. null 허용 필드를 안전하게 처리하는 데 유용합니다.

is_null

값이 null인지 확인합니다. 선택적 입력 필드를 처리하는 데 필수적입니다.

예제

# Safely check nullable field
deny if {
    not is_null(input.usd_value)
    input.usd_value > 10000
}

is_number

값이 숫자인지 확인합니다.

예제

# Validate before numeric comparison
deny if {
    is_number(input.usd_value)
    input.usd_value > 10000
}

is_string

값이 문자열인지 확인합니다.

예제

# Validate input type
deny if {
    is_string(input.to_address)
    startswith(input.to_address, "0x0000")
}

is_array

값이 배열인지 확인합니다.

예제

# Check before iterating
deny if {
    is_array(input.contract_addresses)
    count(input.contract_addresses) > 10
}

is_boolean

값이 부울(true 또는 false)인지 확인합니다.

예제

# Verify a flag is actually a boolean before using it
deny if {
    is_boolean(input.raw_params[0].enabled)
    input.raw_params[0].enabled == false
}

is_set

값이 집합인지 확인합니다.

예제

# Validate collection type
deny if {
    is_set(input.raw_params[0].addresses)
    count(input.raw_params[0].addresses) > 100
}

is_object

값이 객체(키-값 맵)인지 확인합니다.

예제

# Ensure params is an object before accessing fields
deny if {
    is_object(input.raw_params[0])
    object.get(input.raw_params[0], "dangerous", false) == true
}

type_name

값의 타입 이름을 문자열로 가져옵니다.

예제

# Block if usd_value is not a number (unexpected type)
deny if {
    input.usd_value != null
    type_name(input.usd_value) != "number"
}

숫자 함수

숫자 연산을 위한 함수입니다.

abs

숫자의 절대값을 가져옵니다.

예제

# Check magnitude regardless of sign
deny if {
    abs(input.usd_value) > 10000
}

round

숫자를 가장 가까운 정수로 반올림합니다.

예제

# Round for comparison
deny if {
    round(input.usd_value) > 10000
}

ceil

숫자를 다음 정수로 올림합니다.

예제

# Round up for conservative limit checking
deny if {
    ceil(input.usd_value) > 10000
}

floor

숫자를 이전 정수로 내림합니다.

예제

# Block transactions over $10,000 (ignoring cents)
deny if {
    floor(input.usd_value) >= 10000
}

to_number

문자열을 숫자로 변환합니다. 16진수 문자열 값에 유용합니다.

예제

# Convert hex gas values
deny if {
    input.gas_limit != null
    to_number(input.gas_limit) > 1000000
}

numbers.range

시작부터 끝까지(포함) 숫자 배열을 생성합니다.

예제

# Allow transactions only during business hours (9 AM - 5 PM)
deny if {
    [hour, _, _] := time.clock(time.now_ns())
    business_hours := numbers.range(9, 17)
    not hour in business_hours
}

객체 함수

객체(키-값 맵)를 다루기 위한 함수입니다.

object.get

키가 존재하지 않는 경우 기본값을 사용하여 객체에서 안전하게 값을 가져옵니다.

예제

# Safely access nested data
deny if {
    params := input.raw_params[0]
    data := object.get(params, "data", "0x")
    startswith(data, "0xa9059cbb")  # ERC-20 transfer
}

object.keys

객체에서 모든 키를 배열로 가져옵니다.

예제

# Check which fields are present
params := input.raw_params[0]
keys := object.keys(params)
 
deny if {
    "data" in keys
    "value" in keys
}

object.remove

지정된 키가 제거된 새 객체를 만듭니다.

예제

# Block if params contain unexpected fields after removing known safe ones
deny if {
    safe_fields := ["to", "from", "value", "gas", "data"]
    remaining := object.remove(input.raw_params[0], safe_fields)
    count(object.keys(remaining)) > 0
}

object.union

두 객체를 병합합니다. 두 번째 객체의 값이 첫 번째 객체를 재정의합니다.

예제

# Apply safe defaults and check resulting gas limit
deny if {
    defaults := {"gas": "0x5208"}
    params := object.union(defaults, input.raw_params[0])
    to_number(params.gas) > 1000000
}

배열 함수

배열 조작을 위한 함수입니다.

array.concat

두 배열을 하나로 연결합니다.

예제

# Combine address lists
all_addresses := array.concat(
    input.contract_addresses,
    [input.to_address]
)

array.slice

시작 및 끝 인덱스로 배열의 일부를 추출합니다.

예제

# Only check first 5 contract addresses for blocked list
deny if {
    first_five := array.slice(input.contract_addresses, 0, 5)
    some addr in first_five
    addr in {"0xbanned1...", "0xbanned2..."}
}

array.reverse

배열의 요소 순서를 반전합니다.

예제

# Check last contract address (most recent) for suspicious patterns
deny if {
    count(input.contract_addresses) > 0
    reversed := array.reverse(input.contract_addresses)
    startswith(reversed[0], "0x00000000")
}

집합 함수

집합 연산을 위한 함수입니다.

intersection

두 집합 모두에 존재하는 요소를 가져옵니다.

예제

# Check for any blocked address
blocked := {"0xdead...", "0xbad..."}
request_addrs := {lower(input.to_address)}
 
deny if {
    count(intersection(blocked, request_addrs)) > 0
}

union

모든 고유 요소를 가진 두 집합을 하나로 결합합니다.

예제

# Combine multiple blocklists
blocked_countries := union(
    {"KP", "IR", "CU"},
    {"SY", "RU"}
)
 
deny if {
    input.source_country in blocked_countries
}

인코딩 함수

데이터를 인코딩 및 디코딩하기 위한 함수입니다.

base64.encode

문자열을 Base64 형식으로 인코딩합니다.

예제

# Check if method matches an encoded pattern
deny if {
    encoded_method := base64.encode(input.rpc_method)
    encoded_method == "ZXRoX3NlbmRUcmFuc2FjdGlvbg=="  # eth_sendTransaction
}

base64.decode

Base64 문자열을 일반 텍스트로 디코딩합니다.

예제

# Decode base64 data from request
decoded := base64.decode("aGVsbG8=")  # "hello"
 
deny if {
    contains(decoded, "dangerous")
}

base64url.encode

문자열을 URL 안전 Base64 형식으로 인코딩합니다. +/ 대신 -_를 사용합니다.

예제

# Create URL-safe identifier from address for comparison
deny if {
    encoded_addr := base64url.encode(input.to_address)
    encoded_addr in {"MHhkZWFk...", "MHhiYWQ..."}
}

base64url.decode

URL 안전 Base64 문자열을 일반 텍스트로 디코딩합니다.

예제

# Decode and check URL-safe encoded data in params
deny if {
    encoded_data := object.get(input.raw_params[0], "encoded", "")
    decoded := base64url.decode(encoded_data)
    contains(decoded, "malicious")
}

hex.encode

문자열을 16진수 형식으로 인코딩합니다.

예제

# Encode method name to hex for pattern matching
deny if {
    method_hex := hex.encode(input.rpc_method)
    startswith(method_hex, "657468")  # "eth" in hex
}

hex.decode

16진수 문자열을 일반 텍스트로 디코딩합니다.

예제

# Decode hex-encoded data field and check contents
deny if {
    data := object.get(input.raw_params[0], "data", "")
    startswith(data, "0x")
    decoded := hex.decode(substring(data, 2, 8))
    contains(decoded, "admin")
}
내장 함수 | 256 Blocks