메인 콘텐츠로 건너뛰기

컨트랙트 클라이언트

ContractClient는 Savitri Network의 스마트 컨트랙트, 오라클, 거버넌스와 상호작용하기 위한 고수준 헬퍼를 제공합니다.

설정

use savitri_sdk::{ContractClient, Wallet, RpcClient};

let wallet = Wallet::from_private_key_hex("your_private_key")?;
let rpc = RpcClient::from_url("http://localhost:8545")?;

let contract = ContractClient::new(rpc, wallet);

// Or from URL directly
let contract = ContractClient::from_url_and_wallet(
"http://localhost:8545",
wallet,
)?;

컨트랙트 호출

일반 컨트랙트 호출

let tx_hash = contract.call_contract(
&"contract_address_64hex".to_string(), // contract address
b"function_name", // function selector
b"encoded_arguments", // ABI-encoded args
Some(0), // value to send (0 for read-like)
).await?;

println!("TX hash: {}", tx_hash);

call_contract 메서드:

  1. 호출 데이터 구성 (function_selector || args)
  2. TransactionBuilder를 통해 트랜잭션 생성
  3. wallet으로 서명
  4. savitri_sendRawTransaction을 통해 전송
  5. 트랜잭션 해시 반환

오라클 클라이언트

외부 데이터 피드를 위한 오라클 시스템에 접근합니다:

let oracle = contract.oracle();

// Request data from an oracle
let tx_hash = oracle.request_data(
&"oracle_address".to_string(),
"temperature", // data type
b"sensor_id_001", // parameters
).await?;

// Submit a response (as oracle provider)
let tx_hash = oracle.submit_response(
&"oracle_address".to_string(),
request_id, // u64
b"25.5", // response data
).await?;

// Verify data
let is_valid = oracle.verify_data(
&"oracle_address".to_string(),
b"data_to_verify",
).await?;

거버넌스 클라이언트

온체인 거버넌스 시스템과 상호작용합니다:

let gov = contract.governance();

// Create a proposal
let tx_hash = gov.create_proposal(
&"governance_address".to_string(),
"Upgrade consensus parameters", // title
"Increase block size to 2MB", // description
604800, // voting period (seconds)
).await?;

// Vote on a proposal
let tx_hash = gov.vote(
&"governance_address".to_string(),
proposal_id, // u64
true, // true = support, false = oppose
).await?;

// Execute an approved proposal
let tx_hash = gov.execute(
&"governance_address".to_string(),
proposal_id,
).await?;

// Check proposal status
let status = gov.get_proposal_status(
&"governance_address".to_string(),
proposal_id,
).await?;

println!("Proposal #{}: {}", status.id, status.status);
println!("Votes: {} for, {} against", status.votes_for, status.votes_against);
println!("Executed: {}", status.executed);

ProposalStatus 필드

필드유형설명
idu64제안 식별자
titleString제안 제목
votes_foru64찬성 투표 수
votes_againstu64반대 투표 수
statusString"active", "passed", "rejected", "executed"
executedbool제안 실행 여부