Offline Signing
Sui는 오프라인 서명을 지원하며, 이는 Sui 네트워크에 연결되지 않은 기기를 사용하거나 Sui 키 스토어에 의존하지 않고 다른 프로그래밍 언어로 구현된 지갑에서 transaction에 서 명하는 것이다. 오프라인 서명을 구현하는 단계는 다음과 같다:
- 서명을 위한 데이터를 직렬화한다.
- 직렬화된 데이터에 서명한다. 직렬화된 데이터를 서명할 위치(선택한 지갑이나 다른 프로그래밍 언어의 도구 등)에 배치하고 해당 공개 키로 서명을 생성한다.
- 서명된 transaction을 실행한다.
Serializing data for transfer
Binary Canonical Serialization (BCS)을 따라 transaction 데이터를 직렬화해야 한다. 이는 다른 언어에서도 지원된다.
다음 예제는 Sui CLI를 사용하여 전송을 위한 데이터를 직렬화하는 방법을 보여준다. 이는 Base64로 직렬화된 transaction 데이터를 반환한다. 실행할 raw transaction을 tx_bytes로 제출한다.
Beginning with the Sui v1.24.1 release, the --gas-budget option is no longer required for CLI commands.
$ sui client transfer-sui --to <SUI-ADDRESS> --sui-coin-object-id <COIN-OBJECT-ID> --gas-budget <GAS-AMOUNT> --serialize-unsigned-transaction
콘솔은 결과 <TX_BYTES> 값으로 응답한다.
Transaction을 생성하는 다른 모든 CLI 명령(sui client publish 및 sui client call 등)도 동일한 방식으로 사용되는 --serialize-unsigned-transaction 플래그를 지원한다.
Sign the serialized data
사용자가 선택하는 기기와 프로그래밍 언어를 사용하여 데이터에 서명할 수 있다. Sui는 순수 Ed25519, ECDSA secp256k1, ECDSA secp256r1 및 네이티브 multisig에 대한 서명을 허용한다. 서명 요구 사항에 대해 자세히 알아보려면 Sui Signatures를 참고한다.
이 예제에서는 sui keytool 명령을 사용하여 sui.keystore에 저장된 제공된 address에 해당하는 Ed25519 키를 사용해 서명한다. 이 명령은 Base64로 인코딩된 서명, 공개 키 및 플래그를 출력한다. 이 명령은 fastcrypto로 지원된다. sui keytool sign --address <SUI-ADDRESS> --data <TX_BYTES>
다음과 같은 응답을 받는다:
Signer address: <SUI-ADDRESS>
Raw tx_bytes to execute: <TX_BYTES>
Intent: Intent { scope: TransactionData, version: V0, app_id: Sui }
Raw intent message: <INTENT-MESSAGE>
Digest to sign: <DIGEST>
Serialized signature (`flag || sig || pk` in Base64): <SERIALIZED-SIGNATURE>
오프라인에서 생성된 서명이 테스트 목적으로 Sui 유효성 규칙과 일치하는지 확인하려면 sui keytool import를 사용하여 니모닉을 sui.keystore로 가져올 수 있다. 그런 다음 sui keytool sign으로 서명하고 서명 결과를 비교할 수 있다. 또한 ~/sui/sdk/typescript/test/e2e/raw-signer.test.ts에서 테스트 벡터를 찾을 수 있다.
디버깅 시 Sui를 지원하는 암호화 라이브러리에 대해 서명을 검증하려면 sigs-cli를 참고한다.
Execute the signed transaction
직렬화된 서명을 얻은 후 transaction 실행 명령을 사용하여 제출할 수 있다. 이 명령은 --tx-bytes를 실행할 raw transaction 바이트로(이전 sui client transfer 명령의 출력 참고) 사용하고 직렬화된 서명(Base64로 인코딩된 flag || sig || pk, sui keytool sign의 출력 참고)을 사용한다. 이는 서명된 transaction을 실행하고 성공하면 인증서와 transaction 효과를 반환한다.
$ sui client execute-signed-tx --tx-bytes <TX_BYTES> --signatures <SERIALIZED-SIGNATURE>
다음과 같은 응답을 받는다:
----- Certificate ----
Transaction Hash: <TRANSACTION-ID>
Transaction Signature: <SIGNATURE>
Signed Authorities Bitmap: RoaringBitmap<[0, 1, 3]>
Transaction Kind : Transfer SUI
Recipient : <SUI-ADDRESS>
Amount: Full Balance
----- Transaction Effects ----
Status : Success
Mutated Objects:
- ID: <OBJECT_ID> , Owner: Account Address ( <SUI-ADDRESS> )
Alternative: Sign with Sui Keystore and execute transaction
다른 방법으로는, Sui Keystore의 활성 키를 사용하여 서명하고 --serialize-signed-transaction 플래그로 Base64로 인코딩된 발신자 서명 데이터를 출력할 수 있다.
$ sui client transfer-sui --to <SUI-ADDRESS> --sui-coin-object-id <COIN-OBJECT-ID> --gas-budget <GAS-AMOUNT> --serialize-signed-transaction
콘솔은 결과 <SIGNED-TX-BYTES> 값으로 응답한다.
서명된 transaction 바이트를 얻은 후 execute-combined-signed-tx 명령을 사용하여 제출할 수 있다. 이 명령은 --signed-tx-bytes를 실행할 서명된 transaction 바이트로(이전 sui client transfer-sui 명령의 출력 참고) 사용한다. 이는 서명된 transaction을 실행하고 성공하면 인증서와 transaction 효과를 반환한다.
$ sui client execute-combined-signed-tx --signed-tx-bytes <SIGNED-TX-BYTES>