ABOUT ME

-

Today
-
Total
-
  • [컨퍼런스 리뷰 / if(kakao) 2021] 한 줄로 구현하는 블록체인 어플리케이션
    Record/review 2021. 11. 18. 12:00
    반응형

    이 세션에서는 Klaytn에 트랜잭션을 전송할 때 Klip API를 사용하는 것에 대해 설명하고 있다.

    Klip API는 외부 서비스에서 API를 통해 Klip에 있는 KLAY 및 대체 가능한 토큰(FT)을 전송하거나 Klip에서 카드(NFT)를 발행, 조회, 전송 또는 삭제하는 기능을 제공한다.

     

    그 중 App2App API는 BApp 개발자가 별도 가입 절차없이 Klip 사용자를 인증하고 해당 사용자의 토큰 및 카드를 전송하기 위한 API이다. 또한 직접 개발한 스마트 컨트랙트 실행을 Klip 사용자에게 요청할 수 있다.

     

     

    Prepare

    BApp에서 어떤 작업을 실행하고 싶은지 정의하는 단계입니다. "인증"을 제외한 나머지는 Klaytn에 트랜잭션을 전송하는 작업입니다. 트랜잭션 전송을 위해 Prepare 단계에서는 트랜잭션 객체를 생성합니다. 실행 가능한 작업은 다음과 같습니다.

    • 인증, KLAY 전송, 토큰 전송, 카드 전송, 스마트컨트랙트 실행

    Request

    위 단계에서 정의한 작업을 실제로 실행하도록 요청합니다.

    "인증"은 BApp 회원의 Klip 지갑 주소(EOA)를 BApp으로 받아오는 작업이며 그 외에 나머지 작업은 위 트랜잭션에 서명(Signature)를 받는 작업입니다. 이 단계에서는 이들 트랜잭션에 Klaytn 계정 키로 서명(Signature)한 다음 Klaytn에 트랜잭션 전송 요청을 하고, 전송합니다.

    Result

    마지막으로 Result 단계는 Request 단계에서 요청한 작업을 실행했을 때 결과 또는 응답값을 얻는 단계입니다.

    API는 형태에 따라서 두 가지로 구분할 수 있습니다. 먼저 Prepare와 Result 스텝은 Klip Backend 서버로 요청을 날리는 REST API 형태이고, Request 스텝은 Klip을 띄워서 처리하기 위한 Deep Link 형태입니다. 앞선 두 가지와 별개로 필요 시 사용자의 카드 소유 정보를 얻기위한 REST API 형태의 요청이 있습니다.

     

     

    [KLAY 후원 App] 모바일용 klip-sdk 사용 코드 요약

    import { prepare, request, getResult } from 'klip-sdk'
    
    const bappName = ‘후원하기 앱’
    const to = '0xD8b1dC332...후원 받을 지갑 주소'
    const amount = '1'
    const res = await prepare.sendKLAY({ bappName, to, amount })
    let requestKey
    
    // 🔥Step1. Prepare
    
    if (res.err) {
     // 에러 처리
    } else if (res.request_key) {
     // request_key 보관
     requestKey = res.request_key
    }
    
    // 🔥Step2. Request
    request(requestKey)
    
    // 🔥Step3. Result
    const id = setInterval(async () => {
     const res = await getResult(requestKey)
     if (res.status === 'completed') {
     clearTimeout(id)
     // 결과 처리
     }
    }, 1000);
    

     

    [후원 메시지 기록 App] 스마트 컨트랙트 코드

    //solidity 
    
    contract DonateMessage {
     string userMessage;
    
     function writeMessage (string memory message) public
     {
     userMessage = message;
     }
    
     function getMessage() public view returns (string memory)
     {
     return userMessage;
     }
    }
    
    1. solidity로 contract 작성
    2. Cypress 메인넷에 contract 배포
    3. 배포된 주소 및 ABI 복사해두기
    4. App에서 contract 연동 및 실행

    [후원 메시지 기록 App] 모바일용 klip-sdk 사용 코드 요약

    import { prepare, request, getResult } from 'klip-sdk'
    
    const bappName = ‘후원하기 앱’
    const to = '0x1ab32...배포한 컨트랙트 주소'
    const value = '0'
    const abi = JSON.stringify({
     "constant": false,
     "inputs": [
     {
     "name": "message",
     "type": "string"
     }
     ],
     "name": "writeMessage",
     "outputs": [],
     "payable": false,
     "stateMutability": "nonpayable",
     "type": "function"
     })
    const params = `[\\"${message}\\"]`
    
    // 🔥Step1. Prepare
    const res = await prepare.executeContract({ bappName, to, value, abi, params })
    
    // 🔥Step2. Request
    request(requestKey)
    
    // 🔥Step3. Result
    const id = setInterval(async () => {
     const res = await getResult(requestKey)
     if (res.status === 'completed') {
     clearTimeout(id)
     // 결과 처리
     }
    }, 1000);
    

     

     

     

    출처:  https://if.kakao.com/session/90

    참고: https://docs.klipwallet.com/

    React 샘플 깃허브 저장소: https://github.com/elliothan/simple-donation-app

    (위 샘플은 모바일에서만 작동하므로, 피시와 모바일 모두 커버하려면 App2App REST API 를 사용해야한다.)

    반응형

    댓글