로컬 실행 Move 프로그램

10548 단어
로컬 실행 Move 프로그램
  • 참고: 현재 로컬 네트워크에서만 사용자 정의 Move 모듈과 스크립트를 실행할 수 있으며 Libra 테스트 네트워크에서는 실행할 수 없습니다.

  • 이 자습서는 로컬 블록체인에 Move 모듈을 게시하고 Move 트랜잭션 스크립트를 실행하도록 안내합니다.기존 Move 거래 스크립트 자체가 지원하지 않는 작업을 수행하려면 Move 모듈을 만들고 발표하며, 이 모듈을 사용하기 위해 스크립트를 작성할 수 있습니다.Libra CLI 클라이언트는 dev 명령을 사용하여 로컬 Move 프로그램을 컴파일, 제작 및 실행합니다.하위 명령 목록을 보려면 CLI에 dev 을 입력합니다.
    로컬 블록체인에 있는 Move 모듈의 계정을 생성, 컴파일 및 게시하려면 Move 모듈의 다음 지침을 따르십시오.Move 트랜잭션 스크립트를 컴파일하고 실행하려면 다음 트랜잭션 스크립트의 지침을 따르십시오.
    Move 모듈 컴파일 및 게시
    로컬 검증기 노드 네트워크 시작
    우선 로컬 검증기 네트워크를 실행합니다.로컬 네트워크 문서를 시작하는 것을 참고하십시오.
    계정 만들기
    각 Move 모듈과 리소스 유형은 특정 계정 주소로 관리됩니다.예를 들어 Libra 모듈은 주소가 0x1인 계정에서 위탁 관리한다.Move 코드는 다른 모듈 또는 트랜잭션 스크립트에서 Libra 모듈을 가져오려면 use 0x1::Libra을 지정합니다.
    Move 모듈을 릴리즈하기 전에 관리할 계정을 만들어야 합니다.
    libra% account create
    >> Creating/retrieving next local account from wallet
    Created/retrieved local account #0 address 717da70a461fef6307990847590ad7af
    

    위의 출력에서 0은 사용자가 방금 만든 계정의 인덱스이고 16진수 문자열은 계정의 주소입니다.색인은 로컬에서 이 계정을 인용하는 편리한 방법일 뿐 ref_id이라고도 부른다.계정 생성에 대한 더 많은 정보는 을 참고하십시오.create 명령은 로컬 스푼 쌍을 생성합니다.로컬 블록체인에 계정을 만들려면 다음과 같이 계정에 통화를 입력해야 합니다.
    libra% account mintb 0 76 Coin1
    >> Creating recipient account before minting from faucet
    waiting ....
    transaction executed!
    no events emitted
    >> Sending coins from faucet
    waiting ....
    transaction executed!
    Finished sending coins from faucet!
    

    로컬 블록체인에서 계정이 성공적으로 생성되었는지 확인하려면 계정 잔액을 조회하십시오.
    libra% query balance 0
    Balance is: 76.000000Coin1
    

    Move 모듈 만들기SimpleFee이라는 간단한 모듈로 시작하겠습니다.이 모듈은 모든 계좌의 처리 비용을 실현하여 지불 거래에 추가할 수 있다.계정은 체인에 있는 Move 자원의 비용 금액을 지정할 수 있으며 각 화폐 유형에 대해 비용을 지불해야 한다.계정 소유자는 비용 금액을 설정할 수 있으며 누구나 비용을 검색하여 지불에 추가할 수 있다.다음은 이 모듈의 Move 코드를 제공합니다.첫 번째 줄의 주소를 새로 만든 계정의 주소로 변경하고 SimpleFee.move이라는 파일에 저장합니다.계정 주소가 "0x"접두어로 유지되는지 확인합니다.
    address 0x717da70a461fef6307990847590ad7af {
    
    module SimpleFee {
      // A simple fixed-price per-account processing fee that can be added
      // to payment transactions. There is a different fee for each CoinType.
      resource struct Fee {
        fee: u64
      }
    
      // Set the fee amount.
      public fun set_fee(account: &signer, fee: u64) {
        move_to(account, Fee { fee })
      }
    
      // Get the fee for an account.
      public fun get_fee(account: address): u64 acquires Fee {
        if (exists>(account))
          borrow_global>(account).fee
        else
          0
      }
    }
    }
    

    Move 모듈 컴파일SimpleFee.move을 컴파일하기 위해 dev 컴파일 명령을 사용합니다.
    libra% dev compile 0  
    
  • 0 - 인덱스/refid의 계정, 이 모듈은 이 계정 아래에 발표됩니다.
  • 원본 파일 이름 뒤에 열거된 매개 변수 지정 의존항은 이 모듈이 Move 표준 라이브러리에 의존하기 때문에 이 디렉터리에 대한 경로를 지정해야 합니다.

  • Move 코드는 .Move 파일의 형식으로 컴파일러를 입력하고 컴파일러가 해당하는 바이트 코드 파일을 출력한다.이 모듈을 블록체인의 계정에 게시할 준비가 되었을 때 이 바이트 파일을 사용하십시오.move 파일.
    모듈을 성공적으로 컴파일하면 출력에서 다음과 같은 메시지를 볼 수 있습니다. 이것은 SimpleFee.move이 생성한 바이트 파일을 컴파일하는 경로를 포함합니다.
    Successfully compiled a program at:
      /tmp/741fdedbc67720028e60cf637b835a6c/modules/0_SimpleFee.mv
    

    컴파일된 모듈 게시
    로컬 블록체인에 모듈 바이트를 게시하려면 dev publish 명령을 실행하고 컴파일된 모듈 바이트 파일의 경로를 사용하십시오.
    libra% dev publish 0 /var/folders/tq/8gxrrmhx16376zxd5r4h9hhn_x1zq3/T/b8639bd9fe2403874bbfde5643486bde/modules/0_SimpleFee.mv
    
    waiting .....
    transaction executed!
    no events emitted.
    Successfully published module
    
    dev publish 명령을 성공적으로 집행한 후 SimpleFee의 바이트 코드는 발송자의 계좌에서 발표될 것이다.SimpleFee에서 설명한 과정과 유형을 사용하려면 다른 거래 스크립트와 모듈은 use ::SimpleFee을 통해 가져올 수 있습니다.에서 발표된 후속 모듈은 SimpleFee으로 명명할 수 없습니다.각 계정에는 지정된 이름의 모듈이 하나만 있을 수 있습니다.에서 두 번째 SimpleFee이라는 모듈을 발표하려 하면 거래가 실패할 것이다.
    거래 스크립트 컴파일 및 실행
    거래 스크립트 만들기SimpleFee 모듈을 사용하려면 먼저 거래 스크립트를 만들어서 비용 금액을 설정합니다.다음 스크립트에서 생성된 계정과 일치하도록 SimpleFee 계정 주소를 편집한 다음 set_lbr_fee.move으로 저장합니다.
    script {
    use 0x1::Coin1::Coin1;
    use 0x717da70a461fef6307990847590ad7af::SimpleFee;
    
    fun set_lbr_fee(account: &signer, fee: u64) {
      SimpleFee::set_fee(account, fee)
    }
    }
    

    CLI 클라이언트는 현재 통화 코드를 사용자 정의 스크립트의 통화 유형으로 변환하지 않으므로 이 예제 스크립트는 LBR 코인을 사용하도록 하드코딩됩니다.)
    추가 비용을 지불하기 위해 사용자 정의 스크립트가 필요합니다. 따라서 같은 방법으로 아래 스크립트에서 계정 주소를 편집하여pay 로 저장합니다.lbr_with_fee.move:
    script {
    use 0x1::LibraAccount;
    use 0x1::Coin1::Coin1;
    use 0x717da70a461fef6307990847590ad7af::SimpleFee;
    
    fun pay_lbr_with_fee(payer: &signer, payee: address, amount: u64) {
      let payer_withdrawal_cap = LibraAccount::extract_withdraw_capability(payer);
      let total = amount + SimpleFee::get_fee(payee);
      LibraAccount::pay_from(&payer_withdrawal_cap, payee, total, x"", x"");
      LibraAccount::restore_withdraw_capability(payer_withdrawal_cap);
    }
    }
    

    거래 스크립트 컴파일
    거래 스크립트를 컴파일하기 위해 dev compile 명령을 사용합니다.
    libra% dev compile 0   
    
    set_lbr_fee.move은 Move 소스 파일로 set_lbr_fee.move을 성공적으로 컴파일한 후입니다.Move 컴파일러는 해당 바이트 코드 파일을 출력합니다.이 스크립트를 실행할 때, 이 바이트 파일을 사용합니다. (.move 파일이 아닙니다.)스크립트가 성공적으로 컴파일되면 출력에서 바이트 코드 파일의 경로가 표시됩니다.
    Successfully compiled a program at:
      /tmp/897541d70c8578528ed6d7ae98e044d0/scripts/set_lbr_fee.mv
    
    pay_lbr_with_fee.move 반복 컴파일 단계:
    libra% dev compile 0   
    >> Compiling program
    Successfully compiled a program at:
      /var/folders/tq/8gxrrmhx16376zxd5r4h9hhn_x1zq3/T/5fa11d0acf5d53e8d257ab31534b2017/scripts/pay_lbr_with_fee.mv
    

    트랜잭션 스크립트 실행
    사용자 정의 스크립트를 실행하려면 위에서 거래 스크립트를 컴파일한 바이트 출력에 dev execute 명령을 사용하십시오.먼저 set_lbr_fee 스크립트를 사용하여 비용을 지정합니다.
  • 주의: dev execute 명령에 전달되는 정확한 매개 변수 집합은 특정 스크립트가 원하는 매개 변수에 달려 있습니다.
  • libra% dev execute 0 /var/folders/tq/8gxrrmhx16376zxd5r4h9hhn_x1zq3/T/5fa11d0acf5d53e8d257ab31534b2017/scripts/set_lbr_fee.mv 10000
    waiting .....
    transaction executed!
    no events emitted
    Successfully finished execution
    
  • 0 - 보낸 사람의 계정에 대한 색인/refid.이 예에서 모듈을 컴파일하고 발표하는 계정은 같다.
  • /var/folders/tq/8gxrrmhx16376zxd5r4h9hhn_x1zq3/T/5fa11d0acf5d53e8d257ab31534b2017/scripts/set_lbr_fee.mv - 스크립트가 컴파일된 경로입니다.
  • 10000 - 비용 금액, 마이크로 리브라 단위(0.01 리브라).

  • 그런 다음 다른 계정을 설정하고 pay_lbr_with_fee 스크립트를 사용하여 추가 요금을 지불할 수 있습니다.
    libra% account create
    >> Creating/retrieving next local account from wallet
    Created/retrieved local account #1 address aed273e4e7b36276e1442656cc16eb31
    libra% account mintb 1 10 LBR
    >> Creating recipient account before minting from faucet
    waiting ....
    transaction executed!
    no events emitted
    >> Sending coins from faucet
    waiting ....
    transaction executed!
    Finished sending coins from faucet!
    libra% dev execute 1 /var/folders/tq/8gxrrmhx16376zxd5r4h9hhn_x1zq3/T/5fa11d0acf5d53e8d257ab31534b2017/scripts/pay_lbr_with_fee.mv 0x717da70a461fef6307990847590ad7af 1000000
    waiting ....
    transaction executed!
    Successfully finished execution
    
  • 1 - 보낸 사람 계정의 Index/refid, 이것은 새로 만든 계정입니다. 지불을 보낼 것입니다.
  • /var/folders/tq/8gxrrmhx16376zxd5r4h9hhn_x1zq3/T/5fa11d0acf5d53e8d257ab31534b2017/scripts/pay_lbr_with_fee.mv - 스크립트가 컴파일된 경로
  • 0x717da70a461fef6307990847590ad7af - 수취인 계좌 주소(계좌 인덱스 0).
  • 1000000 - 지불 금액, 마이크로 리브라 단위(0.01 리브라).

  • 이 거래의 결과는 계좌 잔액을 조회하여 관찰할 수 있다.
    libra% query balance 0
    Balance is: 77.010000Coin1
    libra% query balance 1
    Balance is: 8.990000Coin1
    

    예상대로 1.0개의 코인1 결제가 0.01코인1 비용을 증가시켰기 때문에 1.01코인1 결제는 계좌1에서 계좌0으로 이체되었다.
    문제 해결
    Move 프로그램 컴파일
    클라이언트에서 Move 소스 파일을 찾을 수 없는 경우 다음과 같은 오류가 발생합니다.
    libra% dev compile 0 ~/my-tscripts/set_lbr_fee.move
    >> Compiling program
    Error: No such file or directory '~/my-tscripts/set_lbr_fee.move'
    compilation failed
    

    클라이언트가 현재 파도선 확장을 실행하지 않았기 때문에 홈 디렉터리에 있는 경로를 표시해야 할 수도 있습니다.
    다음 오류가 발생하면 dev compile 명령의 사용법을 참고하여 필요한 매개 변수를 지정하고 다시 컴파일을 시도하십시오.
    Invalid number of arguments for compilation
    

    컴파일된 모듈 게시
    하나의 모듈을 컴파일하여 하나의 계정을 사용하고 (예: dev compile 0...) 그것을 다른 계정에 발표하려고 시도하면 (예: dev publish 1...) 다음과 같은 오류가 발생합니다.
    libra% dev publish 1 /var/folders/tq/8gxrrmhx16376zxd5r4h9hhn_x1zq3/T/b8639bd9fe2403874bbfde5643486bde/modules/0_SimpleFee.mv
    
    transaction failed to execute; status: VerificationError!
    

    컴파일된 모듈에는 게시할 모듈의 계정 주소가 포함되어 있으며, Move 가상 머신(VM)은 거래 발송자가 발송자의 자신의 계정 주소에서만 모듈을 발표할 수 있습니다.만약 그렇지 않다면, 다른 사용자는 당신의 계좌 아래에서 모듈을 발표할 수 있습니다!이 오류를 복구하려면 필요한 발송자 주소를 사용하여 모듈을 다시 컴파일하십시오.
    컴파일 모듈에 정확한 경로를 제공하지 않으면 이 오류를 볼 수 있습니다.
    libra% dev publish 0 incorrect-path-to-compiled-module
    No such file or directory (os error 2)
    

    인덱스 1 계정이 없는 경우 모듈을 1에 게시하면 다음 오류가 발생합니다.
    Unable to find account by account reference id: 1, to see all existing accounts, run: 'account list'
    

    동일한 발신자 계정 주소에서 기존 모듈을 재게시/업데이트해도 블록체인에는 영향을 미치지 않습니다.이것은 실패한 거래이지만, 송신자 계좌에서gas를 공제하고 송신자 계좌의 서열 번호를 1 증가시킨다.서로 다른 발송자의 계좌 주소에서 같은 모듈을 발표할 수 있는데 전제는 모듈이 이 계좌 주소로 컴파일된 것이다.
    트랜잭션 스크립트 실행
    보낸 사람의 계정 인덱스가 잘못되면 다음 오류가 발생합니다.
    libra% dev execute 2 /var/folders/tq/8gxrrmhx16376zxd5r4h9hhn_x1zq3/T/5fa11d0acf5d53e8d257ab31534b2017/scripts/set_lbr_fee.mv 10000
    Unable to find account by account reference id: 2, to see all existing accounts, run: 'account list'
    

    다음 오류는 거래 스크립트의 매개 변수를 잃어버리거나 하나 이상의 매개 변수 형식이 잘못되었음을 나타냅니다.
    libra% dev execute 0 /var/folders/tq/8gxrrmhx16376zxd5r4h9hhn_x1zq3/T/5fa11d0acf5d53e8d257ab31534b2017/scripts/set_lbr_fee.mv
    transaction failed to execute; status: VerificationError!
    

    좋은 웹페이지 즐겨찾기