Sui 거래소 통합 가이드
이 문서는 Sui 네트워크의 네이티브 토큰인 SUI를 암호화폐 거래소에 통합하는 방법을 설명한다. 통합을 구현하는 구체적인 요구 사항과 프로세스는 거래소마다 다르다. 단계별 가이드를 제공하기보다는, 이 문서는 통합을 완료하는 데 필요한 주요 작업에 대한 정보를 제공한다. 통합을 구성하는 방법에 대한 안내 뒤에는 Sui 네트워크의 staking과 관련된 정보와 code samples도 찾을 수 있 다.
Requirements to configure a SUI integration
SUI integration을 구성하기 위한 요구 사항은 다음과 같다:
- Sui 풀 노드. 자체 Sui 풀 노드를 운영하거나 node 운영자가 제공하는 풀 노드를 사용할 수 있다.
- Sui 풀 노드 실행을 위한 권장 하드웨어 요구 사항:
- CPU: 물리 코어 8개 / 16 vCPUs
- RAM: 128 GB
- Storage (SSD): 4 TB NVMe drive
가장 좋은 결과를 얻으려면 Linux에서 Sui 풀 노드를 실행한다. Sui는 Ubuntu와 Debian distributions를 지원한다. macOS에서도 풀 노드를 실행할 수 있다.
Configure a Sui full node
Sui GitHub repository의 Docker 또는 source code를 사용해 풀 노드를 설정하고 구성하는 방법은 Sui 풀 노드 구성을 참조한다.
Set up Sui addresses
Sui addresses는 on-chain 초기화가 필요하지 않으며, private key에 대응하기만 하면 address에서 자금을 사용 할 수 있다. 공개 키 bytes에 서명 체계 flag byte를 이어 붙인 flag || pubkey를 BLAKE2b (256 bits output) hashing function으로 해시하면 32-byte Sui address를 파생할 수 있다.
현재 Sui address는 pure Ed25519, Secp256k1, Secp256r1, multisig 서명 체계를 지원한다. 각 flag byte는 각각 0x00, 0x01, 0x02, 0x03이다.
다음 code sample은 Rust에서 Sui address를 파생하는 방법을 보여준다:
let flag = 0x00; // 0x00 = ED25519, 0x01 = Secp256k1, 0x02 = Secp256r1, 0x03 = multiSig
// Hash the [flag, public key] bytearray using Blake2b
let mut hasher = DefaultHash::default();
hasher.update([flag]);
hasher.update(pk);
let arr = hasher.finalize();
let sui_address_string = hex::encode(arr);
Displaying addresses
Sui는 0x prefix가 있는 address와 없는 address를 모두 지원한다. Sui는 API calls와 사용자 addresses를 표시할 때 항상 0x prefix를 포함할 것을 권장한다.
Track balance changes for an address
미리 정한 간격으로 suix_getBalance를 호출해 balance 변화를 추적할 수 있다. 이 호출은 address의 total balance를 반환한다. total에는 모든 coin 또는 token type이 포함되지만, 이 문서는 SUI에 초점을 맞춘다. 연속적인 suix_getBalance 요청 사이의 total balance 변화를 추적할 수 있다.
다음 bash 예시는 address 0x849d63687330447431a2e76fecca4f3c10f6884ebaa9909674123c6c662612a3에 대해 suix_getBalance를 사용하는 방법을 보여준다. Devnet이 아닌 네트워크를 사용한다면 rpc 값을 해당 풀 노드 URL로 바꾼다.
rpc="https://fullnode.devnet.sui.io:443"
address="0x849d63687330447431a2e76fecca4f3c10f6884ebaa9909674123c6c662612a3"
data="{\"jsonrpc\": \"2.0\", \"method\": \"suix_getBalance\", \"id\": 1, \"params\": {\"owner\": \"$owner\"}}"
curl -X POST -H 'Content-type: application/json' --data-raw "$data" $rpc
응답은 address의 totalBalance를 포함하는 JSON object이다:
{
"jsonrpc":"2.0",
"result":{
"coinType":"0x2::sui::SUI",
"coinObjectCount":40,
"totalBalance":10000000000,
"lockedBalance":{
}
},
"id":1
}
다음 예시는 Rust에서 suix_getBalance를 사용하는 방법을 보여준다:
use std::str::FromStr;
use sui_sdk::types::base_types::SuiAddress;
use sui_sdk::{SuiClient, SuiClientBuilder};
#[tokio::main]
async fn main() -> Result<(), anyhow::Error> {
let sui = SuiClientBuilder::default().build(
"https://fullnode.devnet.sui.io:443",
).await.unwrap();
let address = SuiAddress::from_str("0x849d63687330447431a2e76fecca4f3c10f6884ebaa9909674123c6c662612a3")?;
let objects = sui.read_api().get_balance(address).await?;
println!("{:?}", objects);
Ok(())
}
Use events to track balance changes for an address
address에서 발생한 모든 events를 구독해 balance를 추적할 수도 있다. address가 coin을 획득하거나 gas fee를 지불하는 경우처럼 SUI coins와 관련된 events만 포함하도록 filter를 사용한다. 다음 예시는 bash와 cURL을 사용해 address의 events를 filter하는 방법을 보여준다:
rpc="https://fullnode.devnet.sui.io:443"
address="0x849d63687330447431a2e76fecca4f3c10f6884ebaa9909674123c6c662612a3"
data="{\"jsonrpc\": \"2.0\", \"id\":1, \"method\": \"sui_getEvents\", \"params\": [{\"Recipient\": {\"AddressOwner\": \"0x849d63687330447431a2e76fecca4f3c10f6884ebaa9909674123c6c662612a3\"}}, null, null, true ]}"
curl -X POST -H 'Content-type: application/json' --data-raw "$data" $rpc
응답에는 많은 events가 포함될 수 있다. 요청에서 nextCursor key를 사용해 응답에 pagination을 추가한다. transaction의 id field에서 대응되는 txDigest와 eventSeq를 확인할 수 있다.
params 배열의 첫 번째 null을 txDigest 값으로 바꾸면 특정 지점부터 pagination을 시작할 수 있다. 두 번째 null은 반환할 결과 수(최대 1000)를 정의하는 정수이고, true는 오름차순을 의미한다. 응답이 원하는 지점부터 시작하도록 nextCursor를 사용할 수 있다.
transaction의 id field는 다음과 같은 형태이다:
"id": {
"txDigest": "GZQN9pE3Zr9ZfLzBK1BfVCXtbjx5xKMxPSEKaHDvL3E2",
"eventSeq": 6019
}
이 데이터를 사용해 다음과 같이 nextCursor를 만든다:
nextCursor : {"txDigest": "GZQN9pE3Zr9ZfLzBK1BfVCXtbjx5xKMxPSEKaHDvL3E2","eventSeq": 6019}
Blocks vs checkpoints
Sui는 DAG 기반 blockchain이며 node synchronization과 전역 transaction ordering을 위해 checkpoints를 사용한다. Checkpoints는 blocks와 다음과 같은 점에서 다르다:
- Sui는 checkpoints를 생성하고 finalized transactions를 추가한다. transactions는 checkpoint에 포함되기 전에도 finalized된다는 점에 유의한다.
- Checkpoints는 fork, roll back, reorganize되지 않는다.
- Sui는 초당 약 네 개의 checkpoints를 만든다. 최신 통계는 Sui public dashboard에서 확인한다.