콘텐츠로 이동

2022 07 13

2022-07-13

KAS (Klaytn API Service)

  • KIP-17 API
    • NFT와 관련한 다양한 기능 제공
      • 컨트랙트 배포/조회
      • 토큰 발행/전송/소각/조회
      • 토큰 전송 권한 부여/해제
      • 소유권 기록 조회
  • KAS 활용 장단점
    • 장) KAS 활용 시, 보다 간편하게 내 계정으로 등록된 NFT를 발행할 수 있고, 이를 조회해오고 관리할 수 있음
    • 단) KAS에 엄청 의존적여지게 된다는 것

백엔드 단에서 Klaytn 블록체인에 접근해야 하는 경우

  1. 아티스트의 NFT를 민팅해줘야 하는 경우
    • NFT 스마트 컨트랙트 발행하기
    • TokenId 별로 Connectable 지갑으로 민팅
  2. NFT의 소유자를 불러와야 하는 경우
    • NFT owner(tokenId) 함수 호출
  3. 사용자가 NFT를 구매했을때 전송해줘야 함
    • NFT transfer() 함수 호출
  4. 사용자가 NFT를 사용했을때 boolean 값 변경?
    • NFT isUsed() 함수 호출

Caver-Java

  • 참고: https://ko.docs.klaytn.foundation/dapp/sdk/caver-java/getting-started#caver.contract
  • KLAY 전송하기
    • keystore file을 사용해 KLAY를 전송하는 간단한 KLAY 전송 트랜잭션
      public void sendingKLAY() {
          Caver caver = new Caver(Caver.BAOBAB_URL);
      
          // keystore json 파일을 읽음
          File file = new File("./keystore.json");
      
          // keystore 복호화
          ObjectMapper objectMapper = ObjectMapperFactory.getObjectMapper();
          KeyStore keyStore = objectMapper.readValue(file, KeyStore.class);
          AbstractKeyring keyring = caver.wallet.keyring.decrypt(keyStore, "password");
      
          // caver wallet에 추가하기
          caver.wallet.add(keyring);
      
          BigInteger value = new BigInteger(caver.utils.convertToPeb(BigDecimal.ONE, "KLAY"));
      
          // 자산 이전 트랜잭션 생성
          ValueTransfer valueTransfer = caver.transaction.valueTransfer.create(
                  TxPropertyBuilder.valueTransfer()
                      .setFrom(keyring.getAddress())
                      .setTo("받을 주소")
                      .setValue(value)
                      .setGas(BigInteger.valueOf(25000))
          );
      
          // 트랜잭션 서명
          valueTransfer.sign(keyring);
      
          // Klaytn으로 트랜잭션 전송
          Bytes32 result = caver.rpc.klay.sendRawTransaction(valueTransfer.getRawTransaction()).send();
          if (result.hasError()) {
              throw new RuntimeException();    
          }
      
          // 트랜잭션 영수증 확인
          TransactionReceiptProcessor transcationReceiptProcessor = new PollingTransactionReceiptProcessor(caver, 1000, 15);
          TransactionReceipt.TransactionReceiptData transactionReceipt = transactionReceiptProcessor.waitForTransactionReceipt(result.getResult());
      }
      
  • Caver-java에 Keyrings 추가
    • 인메모리 지갑에 keyring 추가하여 쉽게 사용하기
    • keyring?
      • Klaytn 계정 주소와 개인키들이 들어있는 구조
      • SingleKeyring: 주소 1개와 개인키 1개
      • MultipleKeyring: 주소 1개와 여러 개인키
      • RoleBasedKeyring: 주소 1개와 키 역할별로 개인키 1개 이상
        Caver caver = new Caver(Caver.MAINNET_URL);
        
        String password = "password";
        String keyStoreJsonString = "JSON";
        
        SingleKeyring decrypt = (SingleKeyring) caver.wallet.keyring.decrypt(keyStoreJsonString, password);
        SingleKeyring addKeyring = (SingleKeyring) caver.wallet.add(decrypt);
        
  • 트랜잭션 전송하기
    • 트랜잭션 서명하기
    • 해당 예시는 caver.wallet 에 Keyring이 추가되었을 때의 경우
      Caver caver = new Caver(Caver.MAINNET_URL);
      
      SingleKeyring keyring = caver.wallet.keyring.createFromPrivateKey("privateKey");
      caver.wallet.add(keyring);
      
      ValueTransfer valueTransfer = caver.transaction.valueTransfer.create(
              TxPropertyBuilder.valueTransfer()
                  .setFrom(keyring.getAddress())
                  .setTo("전송주소")
                  .setValue(BigInteger.valueOf(1))
                  .setGas(BigInteger.valueOf(30000))
      );
      
      caver.wallet.sign(keyring.getAddress(), valueTransfer);
      String rlpEncoded = valueTransfer.getRLPEncoding();
      
  • 스마트 컨트랙트
    • caver.contract 패키지 내의 Contract 클래스 사용해 Klaytn의 스마트 컨트랙트와 상호작용
    • 스마트 컨트랙트의 모든 함수는 하위수준 ABI가 주어졌을 때 자동으로 변환되어 contract 인스턴스내에 저장
    • 스마트 컨트랙트 배포하기
      • Contract 클래스: 스마트 컨트랙트 트랜잭션의 발신자 또는 대납자가 수수료 지불
      • SmartContractDeploy 클래스: 스마트 컨트랙트 트랜잭션 발신자가 수수료 지불
      • feeDelegatedSmartContractDeploy 클래스: 스마트 컨트랙트 트랜잭션 수수료 납부자가 수수료 지불시
    • ABI와 바이트코드에서 contract 인스턴스를 만들 수 있음
      private static final String ABIJson = "JSON";
      
      public void createContractInstance() {
          Caver caver = new Caver(Caver.DEFAULT_URL);
          Contract contract = caver.contract.create(ABIJson);
          contract.getMethods().forEach((name, method) -> {
          });
      }
      

스마트 컨트랙트

  • caver.contract
    • Contract 클래스를 사용해 Klaytn의 스마트 컨트랙트와 쉽게 상호작용 가능
    • 모든 함수는 하위 수준 ABI가 주어졌을 때 자동으로 변환되어 contract 인스턴스내에 저장
    • 스마트 컨트랙트를 컴파일하면 바이트코드와 ABI를 얻을 수 있음
      Binary:
      608060405234801561001057600080fd5b5061051f806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063693ec85e1461003b578063e942b5161461016f575b600080fd5b6100f46004803603602081101561005157600080fd5b810190808035906020019064010000000081111561006e57600080fd5b82018360208201111561008057600080fd5b803590602001918460018302840111640100000000831117156100a257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506102c1565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610134578082015181840152602081019050610119565b50505050905090810190601f1680156101615780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102bf6004803603604081101561018557600080fd5b81019080803590602001906401000000008111156101a257600080fd5b8201836020820111156101b457600080fd5b803590602001918460018302840111640100000000831117156101d657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561023957600080fd5b82018360208201111561024b57600080fd5b8035906020019184600183028401116401000000008311171561026d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506103cc565b005b60606000826040518082805190602001908083835b602083106102f957805182526020820191506020810190506020830392506102d6565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103c05780601f10610395576101008083540402835291602001916103c0565b820191906000526020600020905b8154815290600101906020018083116103a357829003601f168201915b50505050509050919050565b806000836040518082805190602001908083835b6020831061040357805182526020820191506020810190506020830392506103e0565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020908051906020019061044992919061044e565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061048f57805160ff19168380011785556104bd565b828001600101855582156104bd579182015b828111156104bc5782518255916020019190600101906104a1565b5b5090506104ca91906104ce565b5090565b6104f091905b808211156104ec5760008160009055506001016104d4565b5090565b9056fea165627a7a723058203ffebc792829e0434ecc495da1b53d24399cd7fff506a4fd03589861843e14990029
      Contract JSON ABI
      [{"constant":true,"inputs":[{"name":"key","type":"string"}],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"key","type":"string"},{"name":"value","type":"string"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
      
  • ABI
    • 참고: https://velog.io/@younghwan/ABI
    • 컨트랙트 함수와 매개변수를 JSON 형식으로 나타낸 리스트
      • 컨트랙트의 함수 이름과 매개변수들이 들어가있음
  • GAS
    • 네트워크 서비스를 사용하는데 지불하는 수수료의 개념
    • 스마트 계약을 체결할 때 지불하는 수수료
    • 네트워크 스팸 방지하고 네트워크 보안을 강화