Sui CLI를 사용하여 Sui 에서 PTB 생성 및 실행

터미널과 Bash 스크립트를 선호하는 사용자를 위해 새로운 CLI 명령은 Sui 에서 프로그래밍을 간소화합니다.

Sui CLI를 사용하여 Sui 에서 PTB 생성 및 실행

Sui 의 새로운 명령어 명령줄 인터페이스 (CLI)를 통해 사용자는 프로그래밍 가능한 트랜잭션 블록 (PTB)을 터미널이나 Bash 스크립트에서 직접 생성하고 실행할 수 있습니다. 이 새로운 명령은 개발자가 PTB를 구현하고 실행할 때 더 큰 유연성을 제공합니다.

PTB는 개발자에게 다른 블록체인에서는 사용할 수 없는 매우 강력한 프로그래밍 도구를 제공합니다. 여러 트랜잭션을 하나의 실행 파일에 연결하는 기능은 소프트웨어 엔지니어링의 세계에서는 당연한 것으로 여겨질 수 있지만, 블록체인에서는 근본적인 도약을 의미합니다.  

지금까지는 사용 가능한 SDK 중 하나를 사용하여 PTB로 작업하는 것만 가능했습니다. 이제 터미널을 통해 작업하고 스크립트를 작성하는 것을 선호하는 개발자는 이 강력한 기능을 사용할 수 있는 새로운 수단을 갖게 되었습니다.

다음 Sui CLI PTB 명령 문서 에서 자세한 내용과 예제를 확인하세요. 

아래 예시는 간단한 PTB를 생성하는 데 필요한 명령을 보여줍니다. 다음 값을 가진 세 개의 새로운 코인을 생성합니다. 1000, 20003000 MIST에서 가스 코인을 추출하여 주소로 전송합니다: 0x02a212de6a9dfa3a69e22387acfbafbb1a9e591bd9d636e7895dcfc8de05f331(주소 앞의 @는 16진수가 아닌 주소임을 나타내기 위한 것입니다). 

sui 클라이언트 ptb \
--assign to_address @0x02a212de6a9dfa3a69e22387acfbafbb1a9e591bd \.
--분할-코인 가스 [1000,2000,3000] \.
--assign coins \
--transfer-objects to_address [coins.0, coins.1, coins.2] \.
--gas-budget 5000000 \
--summary

결과 메시지는 다음과 같습니다:

╭──────────────────────────────────────────────────────╮ 
│ PTB 실행 요약 │ 
├──────────────────────────────────────────────────────┤ 
│ 다이제스트 7S7XpkGns8mQ4mBUzjdM32xqNHGF2P1ErHSLbb4Chn2j │ 
│ 상태: 성공 │
│ 가스 비용 요약: │ 
│ 저장 비용: 3952000 │ 
│ 계산 비용: 1000000 │ 
│ 스토리지 리베이트: 978120 │ 
│ 환불 불가 스토리지 요금: 9880 │ 
╰──────────────────────────────────────────────────────╯

Sui CLI PTB 

CLI PTB 지원의 기본 철학은 개발자가 명령줄에서 PTB를 빌드하고 실행할 수 있도록 하는 것입니다. 또한 명령줄에서 하는 것처럼 Bash 스크립트를 작성하여 PTB를 구성하고 실행할 수 있으므로 다양한 작업을 자동화할 때 뛰어난 유연성을 제공합니다. 

The sui 클라이언트 PTB 명령은 다음 옵션을 허용합니다:

sui client ptb -h
Build, preview, and execute programmable transaction blocks. Depending on your shell, you might have to use quotes around arrays or other passed values. Use --help to see examples for how to use the core functionality of this command.

Usage: sui client ptb [OPTIONS]

Options:
      --assign <NAME> <VALUE>                                         Assign a value to a variable name to use later in the PTB.
      --gas-coin <ID>                                                 The object ID of the gas coin to use. If not specified, it will try to use the first gas coin that it finds that has at least
                                                                      the requested gas-budget balance.
      --gas-budget <MIST>                                             The gas budget for the transaction, in MIST.
      --make-move-vec <TYPE> <[VALUES]>                               Given n-values of the same type, it constructs a vector. For non objects or an empty vector, the type tag must be specified.
      --merge-coins <INTO_COIN> <[COIN OBJECTS]>                      Merge N coins into the provided coin.
      --move-call <PACKAGE::MODULE::FUNCTION> <TYPE> <FUNCTION_ARGS>  Make a move call to a function.
      --split-coins <COIN> <[AMOUNT]>                                 Split the coin into N coins as per the given array of amounts.
      --transfer-objects <[OBJECTS]> <TO>                             Transfer objects to the specified address.
      --publish <MOVE_PACKAGE_PATH>                                   Publish the Move package. It takes as input the folder where the package exists.
      --upgrade <MOVE_PACKAGE_PATH>                                   Upgrade the move package. It takes as input the folder where the package exists.
      --preview                                                       Preview the list of PTB transactions instead of executing them.
      --summary                                                       Show only a short summary (digest, execution status, gas cost). Do not use this flag when you need all the transaction data
                                                                      and the execution effects.
      --warn-shadows                                                  Enable shadow warning when the same variable name is declared multiple times. Off by default.
      --json                                                          Return command outputs in json format.
  -h, --help                                                          Print help (see more with '--help')

개념 및 기능 

기존의 기존 PTB-관련 개념을 사용하는 것 외에도 이 명령에는 몇 가지 새로운 개념이 필요합니다.  

  • 결과 또는 사용자 정의 변수를 재사용하려면 --assign 명령을 사용합니다. 
  • PTB를 실행하는 대신 PTB에서 입력 명령을 미리 봅니다. 
  • 동일한 식별자를 가진 변수를 여러 번 선언할 때 경고합니다. 
  • 다음과 같은 일반적인 패키지에 대한 이름 확인의 이점을 활용하세요. sui, std딥북 (주소를 사용하는 대신).
  • 오류 메시지는 PTB 구문에서 무엇이 잘못되었는지에 대한 간결하고 정확한 설명을 제공합니다.
  • 변수 이름은 다음과 같을 수 없습니다. 주소, bool, 벡터, 일부, 없음, 가스, u8, u16, u32, u64, u128또는 u256.

예제 

Sui CLI PTB 도구의 성능을 보여주기 위해 몇 가지 예시를 살펴보겠습니다. 이 예제는 Bash를 사용하여 테스트되었으며, 사용 중인 셸과 문자열 및 따옴표 처리 및 구문 분석 방식에 따라 마일리지가 달라질 수 있습니다(예: zsh나 fish에서는 배열 주위에 따옴표를 사용해야 하지만 Bash에서는 그렇지 않을 수 있음).

중첩 또는 다중 유형 

중첩된 유형으로 작업해야 하는 경우 필요한 유형을 다음과 같이 간단히 래핑할 수 있습니다. < 그리고 >. 예를 들어 인수가 Option<vector<u256>> 쓸 수 있습니다. std::option::Option<vector<u256>>.

다음은 그 예입니다:

sui client ptb 
--make-move-vec "<std::option::Option<vector<u256>>>" "[vector[]]" \
--gas-budget 5000000

통화를 위해 여러 유형을 전달해야 하는 경우 다음과 같이 유형 사이에 쉼표를 사용하여 전달할 수 있습니다. <u64,u8,bool,string>.

이름 확인 

CLI PTB는 다음과 같은 일반적인 패키지에 대해 이름 확인을 사용합니다. sui, std딥북를 사용하여 주소 대신 직접 사용할 수 있습니다: 0x2, 0x1또는 0xdee9. 기존 패키지::모듈::함수 를 사용하여 특정 함수를 호출할 수 있습니다. 예를 들어, 두 가지 방법을 모두 사용할 수 있습니다. std::option 또는 0x1::옵션

sui client ptb \
--assign A none \
--move-call std::option::is_none "<u64>" A \
--gas-budget 5000000

로컬 지갑의 주소를 전체 주소 대신 별칭으로 참조할 수도 있습니다. 

변수에 데이터 할당

The --assign 인수는 값을 변수에 바인딩합니다. 이를 사용할 수 있는 몇 가지 방법이 있습니다: 

  1. 변수에 값을 할당합니다: 
sui 클라이언트 ptb \
--assign myvar 100 \
--gas-budget 5000000
  1. 이전 트랜잭션의 결과에 변수를 할당합니다. 다음 예제에서 split-coins는 세 개의 새 객체를 생성하며, 이 객체는 다음과 같은 사용법으로 인해 coins 변수를 통해 액세스할 수 있습니다. --assign
sui 클라이언트 ptb \
--분할-코인 가스 "[1000,2000,3000]" \
--assign coins \
--gas-budget 5000000
  1. 변수를 다른 변수에 할당하기
sui 클라이언트 ptb \ 
--assign myvar vector[100, 200] \.  
--assign my_addr @0x0fe375fff0ee40d20c54a7f2478b9b5c7eaa3625b761 \.  
--assign old_address 내_주소 \.  
--gas-budget 5000000

패키지 게시 및 함수 호출 

Sui 리포지토리에서 첫 번째 패키지 예제 는 간단한 Move 프로젝트입니다. 간단히 말해서, 이 예제는 해당 패키지를 게시하여 Forge 오브젝트를 사용하여 검을 만들 수 있습니다. new_sword 함수를 호출합니다. 아래 코드는 Sui 테스트넷 환경이 설정되어 있다고 가정합니다. 가스 를 입력하세요. 

먼저 예제 폴더에 액세스하여 패키지를 게시합니다. 

cd sui/examples/move/first_package
sui 클라이언트 ptb 
--move-call sui::tx_context::sender \.
--assign "sender" \
--publish "." \
--assign upgrade_cap \
--transfer-objects [upgrade_cap] 보낸 사람 \.
--gas-budget 50000000

이 패키지를 게시하면 다음과 같은 트랜잭션 데이터가 생성됩니다:

종속성 포함 Sui
종속성 포함 MoveStdlib
빌드 첫_패키지
소스에 대한 온체인 의존성을 성공적으로 확인했습니다.
╭──────────────────────────────────────────────────────╮
│ PTB 실행 요약 │
├──────────────────────────────────────────────────────┤
│ 다이제스트: 8ULSyjJXhX5CPiEge3a7T2kLSA3YA8V44BAGZPdknJ1h │
│ 상태: 성공 │
│ 가스 비용 요약: │
│ 저장 비용: 9978800 │
│ 계산 비용: 1000000 │
│ 스토리지 리베이트: 978120 │
│ 환불 불가 스토리지 요금: 9880 │
╰──────────────────────────────────────────────────────╯

이전 결과에서 다이제스트를 사용하여 다음과 같이 전달할 수 있습니다. sui 클라이언트 TX-다이제스트 를 찾아서 packageIdobjectId 에 대한 Forge 객체입니다. 새 검을 위조하여 이 트랜잭션의 발신자에게 전송하려고 합니다. 

다음으로, 함수 new_sword 를 사용하여 함수에 전달해야 하는 인수를 파악할 수 있습니다. 그 시그니처는 다음과 같습니다:

/// Constructor for creating swords 
 public fun new_sword( 
     forge: &mut Forge, 
     magic: u64, 
     strength: u64, 
     ctx: &mut TxContext, 
 ): Sword 

이제 패키지가 온체인에 존재하므로 PTB를 사용해 검을 생성해 보겠습니다. 가장 먼저 해야 할 일은 발신자의 주소를 move-call 명령을 호출하고 해당 호출의 결과를 발신자 변수입니다. 다음을 사용할 수 있습니다. 할당 에 대한 마법 그리고 인수를 지정하고 Forge 객체 ID를 변수에 forge_obj.

마지막으로 new_sword 기능을 통해 move-call 명령을 실행하고 올바른 함수 인수를 모두 전달하고 move-call 변수를 생성하고 새 를 발신자에게 전달합니다. 

sui 클라이언트 ptb \
--move-call sui::tx_context::sender \.
--assign 발신자 \
--assign magic 10u64 \
--assign strength 50u64 \
--assign forge_obj @0xd5d19fde64ea43876add02efb2a769372869f30118 \.
--move-call 0xbe6edeefea02371d35fdde5a45033d8d8e2e00b3eb911b23fa::example::new_sword forge_obj 마법 강도 \.
--검 할당 \
--transfer-objects "[검]" 발신자 \.
--gas-budget 5000000 \
--summary

저희는 --요약 플래그를 사용하면 실행 결과가 다음과 같이 표시됩니다:

╭──────────────────────────────────────────────────────╮ 
│ PTB 실행 요약 │ 
├──────────────────────────────────────────────────────┤ 
│ 다이제스트 HYqWpN9sYBGLawj4BE9VnRM7qaezUFA8aLrGBbjf72L7 │ 
│ 상태: 성공 │ 
│ 가스 비용 요약: │ 
│ 저장 비용: 3739200 │ 
│ 계산 비용: 1000000 │ 
│ 스토리지 리베이트: 2309868 │ 
│ 환불 불가 스토리지 요금: 23332 │ 
╰──────────────────────────────────────────────────────╯ 

Bash 스크립트의 PTB

자동화 및 재사용을 용이하게 하기 위해 터미널에서 PTB 명령을 복사하여 Bash 스크립트에 붙여넣고 실행할 수 있습니다. 

#!/usr/bin/bash 

sui 클라이언트 ptb \ 
--assign to_address @0x02a212de6a9dfa3a69e22387acfbafbb1a9e59
--분할-코인 가스 "[1000,2000,3000]" \
--assign coins \
--transfer-objects "[coins.0, coins.1, coins.2]" to_address \.
--gas-budget 5000000

위의 코드는 일반 Bash 스크립트로 실행할 수 있습니다.

100개의 NFT를 발행하고 Bash 스크립트에서 PTB를 사용하여 전송하기

이 예에서는 Bash 스크립트를 사용하여 100개의 NFT를 발행하고 이를 100개의 주소로 전송합니다. NFT는 다음에서 정의됩니다. 이 스마트 컨트랙트 를 GitHub에 게시합니다. 패키지를 게시하고 NUM_ISSUER_CAP패키지 ID. 프로젝트는 함수 mint를 모듈 번호를 선언합니다.

그런 다음 스크립트는 각 주소가 새 줄에 있는 텍스트 파일에서 주소를 로드합니다. 그런 다음 move-call 명령을 호출하여 민트 함수를 호출하고 객체를 주소로 전송하는 과정을 모두 for 루프에서 수행합니다. 마지막으로 PTB가 실행됩니다.

Bash 스크립트이기 때문에 다른 Bash 스크립트와 마찬가지로 환경 변수를 전달할 수 있다는 점에 유의하세요.

num_issuer_cap=0x3e8a046807edd63b75014b9aff0f8dc30b76344a4dfdb1ae4655932e0514086b
package=0x610834b5fa960b297a5caf6af56bcc045d67d158889da5b511a20031307ce099
module=num
fun=mint

echo "Loading addresses from file"
readarray -t addresses < addresses.txt

cmd=""
for address in ${addresses[@]}; do
  cmd+="--move-call $package::$module::$fun @$num_issuer_cap --assign X --transfer-objects [X] @$address "
done

echo "Executing PTB"
sui client ptb \
 $cmd \
 --gas-budget 5000000000 \
 --summary

최종 결과는

bash-5.2$ bash working-demo.sh
파일에서 주소 로드
PTB 실행
╭──────────────────────────────────────────────────────╮
│ PTB 실행 요약 │
├──────────────────────────────────────────────────────┤
│ 다이제스트: 7THBdpRHWSTiWExxSB7A3m9E7PDP9kQaD16N8xXevdcA │
│ 상태: 성공 │
│ 가스 비용 요약: │
│ 저장 비용: 132376800 │
│ 계산 비용: 1000000 │
│ 스토리지 리베이트: 2392632 │
│ 환불 불가 스토리지 요금: 24168 │
╰──────────────────────────────────────────────────────╯

SuiNS에서 도메인 구매 

다음 예는 이동 호출에 사용할 SUI 이 없는 제로 코인을 먼저 생성하여 Sui 도메인 이름을 등록한 후 새로 생성한 도메인 이름 개체를 특정 주소로 전송하는 예제입니다. 

sui 클라이언트 ptb \
--suins_object_id @0x300369e8909b9a6464da265b9a5a9ab6fe2158a040e84e808628cde7a07ee5a3 \.
--분할-코인 가스 "[0]" \
--assign zero_coin \
--move-call 0x4255184a0143c0ce4394a3f16a6f5aa5d64507269e54e51ea396d569fe8f1ba5::register::register suins_object_id '"mysui.sui"' 1U8 제로_코인 @0X6 \.
--assign suins_name \
--transfer-objects "[suins_name]"  @0x0fe375fff0ee40d20c54a7f2478b9b5c7eaa3625b7611f9661ec5faefb4a6fea \
--gas-budget 50000000

이 명령의 결과는 다음과 같습니다:

╭──────────────────────────────────────────────────────╮
│ PTB 실행 요약 │
├──────────────────────────────────────────────────────┤
│ 다이제스트 5D2W4beXGWzF4Cn69y6ihnTvoyBC99vb5zGhpxAhdq1z │
│ 상태: 성공 │
│ 가스 비용 요약: │
│ 저장 비용: 10039600 │
│ 계산 비용: 1000000 │
│ 스토리지 리베이트: 5394708 │
│ 환불 불가 스토리지 요금: 54492 │ 
╰──────────────────────────────────────────────────────╯

실행 대신 PTB 미리보기 

The -- 미리 보기 플래그는 복잡한 PTB에 유용하며, 실행하는 대신 PTB의 트랜잭션을 나열합니다. 미리보기는 전체 입력을 구문 분석한 후 각 트랜잭션과 그 인수가 포함된 형식이 잘 지정된 테이블을 표시합니다. 또한 모든 오류도 표시합니다. 이 기능은 PTB를 실행하는 대신 트랜잭션 목록을 생성하므로 복잡한 PTB를 처리할 때 유용합니다. 

sui 클라이언트 ptb \
--assign to_address @0x02a212de6a9dfa3a69e22387acfbafbb1a9e59 \.
--분할-코인 가스 [1000,2000,3000] \.
--assign coins \
--transfer-objects [coins.0, coins.1, coins.2] to_address \.
--gas-budget 5000000 \
--summary \
--preview

그리고 이 호출의 결과는 다음과 같습니다: 

이미지를 클릭하면 확대됩니다.

경고 및 오류 

사용 시 --assign 명령과 --경고 그림자 플래그를 사용하면 섀도 변수가 발견되면 도구에서 경고를 표시합니다. 즉, 주어진 변수 이름에 대한 선언이 여러 개 있는 경우 도구는 개발자에게 동일한 변수가 여러 번 선언되었다는 경고를 표시합니다. 다음은 예시입니다:

sui 클라이언트 ptb \ 
--할당 10 \. 
--assign a 15 \ 
--gas-budget 5000000 \ 
--warn-shadows 

아래 이미지는 PTB를 구축할 때 생성되는 경고를 보여줍니다: 

이미지를 클릭하면 확대됩니다.

저희가 많은 노력을 기울인 분야 중 하나는 유용한 오류를 신고하는 방법에 관한 것입니다. 오류에 무엇이 잘못되었는지에 대한 충분한 정보를 포함하고, 오류의 원인이 되는 인수를 정확히 지적하며, 경우에 따라서는 오류를 해결하는 방법에 대한 힌트까지 제공하는 것을 목표로 했습니다.  

예를 들어 사용자가 std::Option::is_none 함수를 호출하고 모듈 이름을 소문자 대신 대문자로 전달하면 도구는 다음과 같은 메시지를 표시합니다: 

sui 클라이언트 ptb \ 
--move-call std::Option::is_none none \. 
--gas-budget 5000000

그리고 오류 메시지가 다음과 같이 표시됩니다: 

이미지를 클릭하면 확대됩니다.

 다음은 사용자가 다음과 같이 호출할 때 발생하는 오류를 보여주는 또 다른 예입니다. --할당 X 변수를 전달하지 않고, 결과를 생성하지 않는 명령어 뒤에 

sui 클라이언트 ptb \ 
--assign X \ 
--gas-budget 5000000

이 경우의 오류는 다음과 같습니다:

이미지를 클릭하면 확대됩니다.

 다음은 도구의 예약어와 관련된 또 다른 예입니다: 

sui 클라이언트 PTB --주소 할당 5 --가스 예산 5

여기에 오류 메시지가 표시됩니다:

이미지를 클릭하면 확대됩니다.