Hàm Tích Hợp

Tài liệu tham khảo đầy đủ cho tất cả các hàm tích hợp có sẵn trong chính sách

Chỉ các hàm tích hợp sau được kích hoạt trong chính sách. Các hàm không được liệt kê ở đây bị vô hiệu hóa vì lý do bảo mật. Xem Hạn chế để biết chi tiết về các hàm bị vô hiệu hóa.

Hàm Chuỗi

Các hàm để thao tác và kiểm tra giá trị chuỗi. Thiết yếu để làm việc với địa chỉ, tên phương thức và các trường văn bản khác.

contains

Kiểm tra xem chuỗi có chứa chuỗi con không. Trả về true nếu tìm thấy, false nếu không.

Ví dụ

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

startswith

Kiểm tra xem chuỗi có bắt đầu bằng tiền tố không. Hữu ích để khớp các danh mục phương thức hoặc mẫu địa chỉ.

Ví dụ

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

endswith

Kiểm tra xem chuỗi có kết thúc bằng hậu tố không.

Ví dụ

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

lower

Chuyển đổi chuỗi sang chữ thường. Thiết yếu cho so sánh địa chỉ không phân biệt chữ hoa chữ thường vì địa chỉ có thể có chữ hoa chữ thường hỗn hợp.

Ví dụ

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

upper

Chuyển đổi chuỗi sang chữ hoa.

Ví dụ

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

concat

Nối một mảng chuỗi với dấu phân cách.

Ví dụ

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

split

Tách chuỗi thành mảng bằng dấu phân cách.

Ví dụ

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

replace

Thay thế tất cả các lần xuất hiện của chuỗi con bằng chuỗi khác.

Ví dụ

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

substring

Trích xuất một phần của chuỗi theo vị trí bắt đầu và độ dài.

Ví dụ

# 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

Định dạng chuỗi với trình giữ chỗ. Hữu ích để tạo giá trị động.

PlaceholderType
%sString
%dInteger
%fFloat
%vAny value

Ví dụ

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

trim

Xóa các ký tự được chỉ định từ cả hai đầu của chuỗi.

Ví dụ

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

trim_space

Xóa khoảng trắng từ cả hai đầu của chuỗi.

Ví dụ

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

trim_prefix

Xóa tiền tố khỏi chuỗi nếu có.

Ví dụ

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

trim_suffix

Xóa hậu tố khỏi chuỗi nếu có.

Ví dụ

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

indexof

Tìm chỉ số của lần xuất hiện đầu tiên của chuỗi con. Trả về -1 nếu không tìm thấy.

Ví dụ

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

Hàm Regex

Các hàm để khớp mẫu bằng biểu thức chính quy. Mạnh mẽ hơn các hàm chuỗi cho các mẫu phức tạp.

regex.match

Kiểm tra xem chuỗi có khớp với mẫu biểu thức chính quy không. Trả về true hoặc false.

Ví dụ

# 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

Thay thế tất cả các kết quả khớp của mẫu bằng chuỗi thay thế.

Ví dụ

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

regex.split

Tách chuỗi theo mẫu regex.

Ví dụ

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

regex.find_n

Tìm tối đa n kết quả khớp của mẫu trong chuỗi.

Ví dụ

# 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
}

Hàm Thời Gian

Các hàm để làm việc với thời gian. Tất cả các giá trị thời gian tính bằng nano giây kể từ Unix epoch.

time.now_ns

Lấy thời gian hiện tại tính bằng nano giây. Sử dụng điều này làm cơ sở cho các chính sách dựa trên thời gian.

Ví dụ

# 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

Trích xuất giờ, phút và giây từ dấu thời gian. Trả về [hour, minute, second].

Ví dụ

# 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

Lấy ngày trong tuần từ dấu thời gian. Trả về 0 (Chủ nhật) đến 6 (Thứ bảy).

Ví dụ

# 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

Trích xuất năm, tháng và ngày từ dấu thời gian. Trả về [year, month, day].

Ví dụ

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

time.parse_rfc3339_ns

Phân tích cú pháp chuỗi dấu thời gian định dạng RFC3339 thành nano giây.

Ví dụ

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

time.add_date

Thêm năm, tháng và ngày vào dấu thời gian.

Ví dụ

# 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

Tính sự khác biệt giữa hai dấu thời gian. Trả về [years, months, days, hours, minutes, seconds].

Ví dụ

# 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
}

Hàm Tổng Hợp

Các hàm để làm việc với tập hợp các giá trị.

count

Đếm số lượng phần tử trong mảng, tập hợp hoặc đối tượng.

Ví dụ

# 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

Tính tổng các số trong mảng.

Ví dụ

# 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

Tìm giá trị lớn nhất trong mảng.

Ví dụ

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

min

Tìm giá trị nhỏ nhất trong mảng.

Ví dụ

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

sort

Sắp xếp mảng theo thứ tự tăng dần.

Ví dụ

# 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

Tính tích của các số trong mảng.

Ví dụ

# 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
}

Hàm Kiểu

Các hàm để kiểm tra và làm việc với các kiểu dữ liệu. Hữu ích để xử lý các trường có thể null một cách an toàn.

is_null

Kiểm tra xem giá trị có phải là null không. Thiết yếu để xử lý các trường đầu vào tùy chọn.

Ví dụ

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

is_number

Kiểm tra xem giá trị có phải là số không.

Ví dụ

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

is_string

Kiểm tra xem giá trị có phải là chuỗi không.

Ví dụ

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

is_array

Kiểm tra xem giá trị có phải là mảng không.

Ví dụ

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

is_boolean

Kiểm tra xem giá trị có phải là boolean (true hoặc false) không.

Ví dụ

# 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

Kiểm tra xem giá trị có phải là tập hợp không.

Ví dụ

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

is_object

Kiểm tra xem giá trị có phải là đối tượng (bản đồ khóa-giá trị) không.

Ví dụ

# 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

Lấy tên kiểu của giá trị dưới dạng chuỗi.

Ví dụ

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

Hàm Số

Các hàm cho các phép toán số học.

abs

Lấy giá trị tuyệt đối của một số.

Ví dụ

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

round

Làm tròn số đến số nguyên gần nhất.

Ví dụ

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

ceil

Làm tròn số lên đến số nguyên tiếp theo.

Ví dụ

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

floor

Làm tròn số xuống đến số nguyên trước đó.

Ví dụ

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

to_number

Chuyển đổi chuỗi thành số. Hữu ích cho các giá trị chuỗi thập lục phân.

Ví dụ

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

numbers.range

Tạo mảng số từ đầu đến cuối (bao gồm).

Ví dụ

# 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
}

Hàm Đối Tượng

Các hàm để làm việc với đối tượng (bản đồ khóa-giá trị).

object.get

Lấy giá trị từ đối tượng một cách an toàn với giá trị mặc định nếu khóa không tồn tại.

Ví dụ

# 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

Lấy tất cả các khóa từ đối tượng dưới dạng mảng.

Ví dụ

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

object.remove

Tạo đối tượng mới với các khóa được chỉ định bị xóa.

Ví dụ

# 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

Hợp nhất hai đối tượng. Giá trị từ đối tượng thứ hai ghi đè lên đối tượng đầu tiên.

Ví dụ

# 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
}

Hàm Mảng

Các hàm cho thao tác mảng.

array.concat

Nối hai mảng thành một.

Ví dụ

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

array.slice

Trích xuất một phần của mảng theo chỉ số bắt đầu và kết thúc.

Ví dụ

# 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

Đảo ngược thứ tự các phần tử trong mảng.

Ví dụ

# 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")
}

Hàm Tập Hợp

Các hàm cho các phép toán tập hợp.

intersection

Lấy các phần tử tồn tại trong cả hai tập hợp.

Ví dụ

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

union

Kết hợp hai tập hợp thành một với tất cả các phần tử duy nhất.

Ví dụ

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

Hàm Mã Hóa

Các hàm để mã hóa và giải mã dữ liệu.

base64.encode

Mã hóa chuỗi sang định dạng Base64.

Ví dụ

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

base64.decode

Giải mã chuỗi Base64 trở lại văn bản thuần túy.

Ví dụ

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

base64url.encode

Mã hóa chuỗi sang định dạng Base64 an toàn cho URL. Sử dụng -_ thay vì +/.

Ví dụ

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

base64url.decode

Giải mã chuỗi Base64 an toàn cho URL trở lại văn bản thuần túy.

Ví dụ

# 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

Mã hóa chuỗi sang định dạng thập lục phân.

Ví dụ

# 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

Giải mã chuỗi thập lục phân trở lại văn bản thuần túy.

Ví dụ

# 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")
}
Hàm Tích Hợp | 256 Blocks