2022 07 13
2022-07-13¶
KAS (Klaytn API Service)¶
- 참고 1: https://www.youtube.com/watch?v=kZdCS2CGtAE&list=PLKqrwxupttYG4rxPEUfgUoz51tZMKEHpP
- 참고 2: https://docs.klaytnapi.com/
- 참고 3: https://docs.klaytnapi.com/tutorial/kip-17-api/kip17-api
- 개요
- JSON-RPC를 통해서 블록체인 접근
- 블록체인 모르는 사용자들에게 친화적으로 다가가게 하기 위함
- KIP-17 API
- NFT와 관련한 다양한 기능 제공
- 컨트랙트 배포/조회
- 토큰 발행/전송/소각/조회
- 토큰 전송 권한 부여/해제
- 소유권 기록 조회
- NFT와 관련한 다양한 기능 제공
- KAS 활용 장단점
- 장) KAS 활용 시, 보다 간편하게 내 계정으로 등록된 NFT를 발행할 수 있고, 이를 조회해오고 관리할 수 있음
- 단) KAS에 엄청 의존적여지게 된다는 것
백엔드 단에서 Klaytn 블록체인에 접근해야 하는 경우¶
- 아티스트의 NFT를 민팅해줘야 하는 경우
- NFT 스마트 컨트랙트 발행하기
- TokenId 별로 Connectable 지갑으로 민팅
- NFT의 소유자를 불러와야 하는 경우
- NFT owner(tokenId) 함수 호출
- 사용자가 NFT를 구매했을때 전송해줘야 함
- NFT transfer() 함수 호출
- 사용자가 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.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 인스턴스를 만들 수 있음
스마트 컨트랙트¶
- 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
- 네트워크 서비스를 사용하는데 지불하는 수수료의 개념
- 스마트 계약을 체결할 때 지불하는 수수료
- 네트워크 스팸 방지하고 네트워크 보안을 강화