[KAS] Tutorial

박세연·2020년 11월 12일

Klaytn API Service

목록 보기
3/3

메타 정보 조회

  • API 호출에 사용되는 x-chain-id 값은 8217(Cypress) 또는 1001(Baobab)
  • Klaytn Node - Metadata API는 SDK(caver-js, caver-java)를 지원하지 않는다.

FT컨트랙트 정보 조회

FT 컨트랙트는 대체 가능 토큰(Fungible Token, FT)을 발행, 삭제, 전송하는 기능을 제공

NFT 컨트랙트 정보 조회

NFT 컨트랙트는 대체 불가 토큰(Non-Fungible Token, NFT)을 발행, 삭제, 전송하는 기능을 제공

NFT 정보 조회

NFT(대체 불가 토큰)의 토큰 ID값과 이 NFT를 발행한 NFT 컨트랙트 주소값을 입력해서 NFT의 정보를 조회한다.

JSON-RPC API

Klaytn Node 에서 Klaytn 계정 정보 확인하기

가장 최근에 생성된 블록 번호 확인하기

Node API로 계정에 관한 최신 정보를 확인하기 위해서는 클레이튼 상의 가장 최신 블록의 블록 번호를 알아야한다.

const accessKeyId = "{accessKeyId}"
const secretAccessKey = "{secretAccessKey}"
const chainId = 1001

const CaverExtKAS = require('caver-js-ext-kas')
const caver = new CaverExtKAS()
caver.initKASAPI(chainId, accessKeyId, secretAccessKey)

async function testFunction() {
    const blockNumber = await caver.rpc.klay.getBlockNumber()
    console.log(blockNumber)
}
testFunction()

>> 0x29987e6

EOA로 Klaytn 계정 정보 확인하기

const accessKeyId = "{accessKeyId}"
const secretAccessKey = "{secretAccessKey}"
const chainId = 1001

const CaverExtKAS = require('caver-js-ext-kas')
const caver = new CaverExtKAS()
caver.initKASAPI(chainId, accessKeyId, secretAccessKey)

async function testFunction() {
    const account = await caver.rpc.klay.getAccount('0x06545b70b18068ccf5ee6eb5eb1f465c5dbe4f05')
    // 내 계정의 계정 주소
    console.log(account)
}
testFunction()

다중계정도 조회해보기

계정 생성과 관리

Klaytn 계정 만들기, 조회, 목록조회

여기에서 계정 만들기 확인
현재 조회한 계정 목록

클레이튼 계정 삭제하기

클레이튼 계정을 삭제하면 해당 계정으로는 서명을 할 수 없다.

const result = await caver.kas.wallet.deleteAccount(created.address)

클레이튼 계정 비활성화 / 활성화

// 비활성화
const result = await caver.kas.wallet.disableAccount(accountToTest.address)

// 활성화
const result = await caver.kas.wallet.enableAccount(accountToTest.address)

계정으로 특정 트랜잭션에 서명하기

트랜잭션이 다중 서명을 받아야하는 상황이 아니라면 Wallet API가 자동으로 서명해준다.
해당 API는 트랜잭션이 다중 서명을 받아야하는 경우에 사용(트랜잭션이 다중 서명을 받아야한다 == 트랜잭션을 보내려는 클레이튼 계정이 다중 서명 키를 가진 경우)

const address = '{서명하려는 클레이튼 계정 주소(EOA)'
const transactionId = '{서명을 받을 트랜잭션의 ID'
const result = await caver.kas.wallet.signTransaction(address, transactionId) // 트랜잭션 서명 API

출력되는 내용은 Signature(R, S, V)

공개키로 계정 정보를 조회하기

Wallet API를 통해 생성한 클레이튼 계정 중에서, 특정 공개키를 가진 계정 정보를 조회함.

const result1 = await caver.kas.wallet.createAccount()
    console.log(result1)
    // Wallet API로 클레이튼 계정 생성

    // 해당 공개키를 갖는 계정 정보를 조회
    const publicKey = '0x04fcf178cd33f35d063d8da6d37159e05c39387938d62c1cc4f7b9d480d101253e690afc118a25e41d6b229d690754f600ecc8bb1357fcb1559a186124e8da0e4a'
    const result2 = await caver.kas.wallet.getAccountListByPublicKey(publicKey)
    console.log(result2)

내 계정을 다중 서명 계정으로 업그레이드하기

먼저 KAS에 클레이튼 계정들을 생성한다. (A, B, C 계정에서 A를 B의 key, C의 key를 사용하게 한다.)

const address = '{다중 서명 계정으로 업데이트할 계정의 주소(A의주소)}'
const weightedMultisig = {
  threshold: 4,
  weightedKeys: [
    {
      weight: 3,
      // 계정 B의 Public Key
      publicKey: '0x0463cc38f08dd15dfd416966e9d0da93942e26d2a9a9bcac08d614f487f94a7e46e4418d1acda9e21706f19c917486de40c974eb20c12a2eca2eea91895499d379'
    },
    {
      weight: 1,
      // 계정 C의 public Key
      publicKey: '0x043ccf257d2ad3f8c3b2128969302efc6bf59d8cd8e578bcfdac8a4ac9cea6d4747350c98edaec5d23fafa9b3288a3b45816d2e9b3bb28443cc2486ad6bca652f1'
    }
  ]
}
const result = await caver.kas.wallet.updateToMultiSigAccount(address, weightedMultisig)

이렇게 업데이트하고 계정을 출력하면 다중 서명 계정으로 나오는 것을 확인할 수 있음

트랜잭션 전송

KAS의 트랜잭션 == Klaytn 트랜잭션
트랜잭션을 보낸다 : 블록체인의 상태를 변화시킨다.
서명(sign)은 트랜잭션을 보내는 사람이 내가 맞다는 것을 증명한느 자격증명. KAS Wallet API는 클레이튼 계정이 트랜잭션에 서명하는 작업을 대신 실행한다.

KLAY 보내기

보내는 계정이 수수료 부담

const tx = { 
        from: '0xDaAc8e561627312743f6f11b2f54e985Da0619fd', // KLAY를 보내는 계정 주소
        to: '0xBCE532829A462eFB8964DE684CdCDA1D5DcB6723', // KLAY를 받는 주소
        value: 1,
        gas: 25000,
        memo: 'memo',
        submit: true
}
const result = await caver.kas.wallet.requestValueTransfer(tx)
console.log(result)

다른 계정이 수수료 대신 부담

const tx = {
  from: '0xd2061D4bdbee433Dd2f99C28E25d301593f544e0',
  to: '0x76c6b1f34562ed7a843786e1d7f57d0d7948a6f1',
  value: 1,
  gas: 50000,
  memo: 'memo',
  feeRatio: 99,
  feePayer: '0x44Ee3906a7a2007762E9d706dF6E4eF63FA1edA8',
  // 수수료를 대납하는 사람의 계정 주소
  submit: true
}
const result = await caver.kas.wallet.requestFDValueTransferPaidByUser(tx)

KAS에서 수수료 부담

const tx = {
  from: '0xd2061D4bdbee433Dd2f99C28E25d301593f544e0',
  to: '0x76c6b1f34562ed7a843786e1d7f57d0d7948a6f1',
  value: 1,
  gas: 50000,
  memo: 'memo',
  feeRatio: 99,
  // 전체 수수료에서 feePayer가 납부할 비율 (위의 대납 경우에서도 사용 가능)
  submit: true
}
const result = await caver.kas.wallet.requestFDValueTransferPaidByGlobalFeePayer(tx)

스마트 컨트랙트 배포

스마트 컨트랙트를 배포하는 경우, 수수료 납부에 대한 3가지 타입이 있음

배포하는 계정이 트랜잭션 전송 수수료 부담

await caver.kas.wallet.requestSmartContractDeploy(tx)

다른 계정이 트랜잭션 전송 수수료 대신 부담

await caver.kas.wallet.requestFDSmartContractDeployPaidByUser(tx)

KAS에서 트랜잭션 전송 수수료 대신 부담

await caver.kas.wallet.requestFDSmartContractDeployPaidByGlobalFeePayer(tx)

스마트 컨트랙트 실행

스마트 컨트랙트 함수를 실행하는 경우, 수수료 납부 3가지 방법

실행하는 계정이 수수료 부담

await caver.kas.wallet.requestSmartContractExecution(tx)

다른 계정이 수수료 부담

await caver.kas.wallet.requestFDSmartContractExecutionPaidByUser(tx)

KAS에서 트랜잭션 전송 수수료 대신 부담

await caver.kas.wallet.requestFDSmartContractExecutionPaidByGlobalFeePayer(tx)

보류중인 트랜잭션 취소(취소 트랜잭션 보내기)

Wallet API로 클레이튼에 전송한 트랜잭션이 보류(Pending) 상태일 때, 이 트랜잭션을 취소하는 방법

보내는 계정이 수수료 부담

const tx = {
  from: '0x008Ad97530612A272d16228ec893e6Ce0F180b06',
  // 트랜잭션을 보낸 계정(취소 트랜잭션을 보내는 계정)
  gas: 25000,
  nonce: '0x1',
  submit: true
}
const result = await caver.kas.wallet.requestCancel(tx)

다른 계정이 수수료 대납

const tx = {
  from: '0x008Ad97530612A272d16228ec893e6Ce0F180b06',
  gas: 45000,
  nonce: '0x1',
  feeRatio: 99,
  // 대납 계정이 납부할 비율
  feePayer: '0x44Ee3906a7a2007762E9d706dF6E4eF63FA1edA8',
  submit: true
}
await caver.kas.wallet.requestFDCancelPaidByUser(tx)

KAS에서 수수료 대납

await caver.kas.wallet.requestFDCancelPaidByGlobalFeePayer(tx)

RLP 문자열 트랜잭션

Wallet API로 RLP 인코딩된 문자열로 표현된 트랜잭션을 클레이튼에 보내는 방법

보내는 계정이 수수료 납부

// 트랜잭션 서명 RLP 또는 트랜잭션 해시 RLP를 입력하고 RLP 트랜잭션 전송 API를 호출한다.
const rlp = '0x08f87e808505d21dba008261a89476c6b1f34562ed7a843786e1d7f57d0d7948a6f10194dbe9312beb546a5b518f8bb7ac315cc6eb96b34cf847f8458207f6a0276299929f4b805b1e1376543001652eff9f47cf34332e042c8aded29fd022fca077f1ff2f4bb668b49aa228c170e72d84ffdc456bd3ac9e5e6291d8e6cd61508b'
const result = await caver.kas.wallet.requestRawTransaction({ rlp, submit: true })

다른 계정이 수수료 대납

const result = await caver.kas.wallet.requestFDRawTransactionPaidByUser({ rlp, feePayer: '0x44Ee3906a7a2007762E9d706dF6E4eF63FA1edA8', submit: true })
// 양식은 위와 거의 모두 동일. 얘도 feeRatio있음

KAS에서 수수료 대납

const result = await caver.kas.wallet.requestFDRawTransactionPaidByGlobalFeePayer({ rlp:, submit: true, feeRatio: 99 })

계정 업데이트

Wallet API로 계정 키를 업데이트하는 트랜잭션을 클레이튼에 보내기

계정키 -> 다중 서명 키: 보내는 계정이 수수료 부담

클레이튼 계정을 다중 서명 계정으로 업데이트하는 것은 계정 키를 AccountKeyWeightedMultiSig로 업데이트하는 것과 동일
다중 서명 키를 구성하는 각 키를 가지고 있는 계정들은 모두 같은 계정 저장소에 있어야한다.

// Update to AccountKeyWeightedMultiSig
const tx = {
  from: '0x443f01B81ECC1e83dC46edA711F3D707511ef257',
  // 업데이트할 계정 주소
  accountKey: {
    keyType: 4,
    key: {
      threshold: 2,
      weightedKeys: [
        {
          weight: 1,
          publicKey: '0x04a4dad8e41de69fdbf7c2d3b76eeeed47d449fd680d7dda0ae6346ac9e2c8de1637d8cbc4adbfa7b0f02ffedf39d8edb7dae983ba24a33fcdde37feedbe2a5cd7'
        },
        {
          weight: 1,
          publicKey: '0x0424a43009be004a10cf6d2d7ddb3fa31aa8e73bf540d8ad2a7a870c697981f3743f3691a45fc1c5ff13a7f521c5488b5a7926063b307c0def3d5f8f1f3a7fde0b'
        }
      ]
    }
  },
  gas: 1000000,
  submit: true
}
const result = await caver.kas.wallet.requestAccountUpdate(tx)

계정키 -> 역할 기반 키: 대납 계정이 수수료 부담

  • 계정 키를 역할 기반 키로 바꿀 때 특정 역할을 배제: keyType=3(AccountKeyFail)
  • 특정 역할만 업데이트 하고싶은 경우: 업데이트 하고 싶지 않은 역할 키에 keyType=128(AccountKeyNil)
const tx = { 
  from: '0xA3E79115c78bbC8eFdDA2a17a4Bdb48Dca2b5333',
  accountKey: { 
    keyType: 4, 
    key: { 
      threshold: 2, 
      weightedKeys: [ 
        { 
          weight: 1,
          publicKey: '0x04371334d038d983f3b560b2534385138ffaf69cf1aef039b268ef69c1736ec6544bc9a04598ca5ba4c2e75e648c6d8e6a892b33662bfe680544daa53c75b06e35'
        },
        {
          weight: 1,
          publicKey: '0x041640a55aed2c871f8896a263b378ce73e323254de9173fd071bb29aa8d4c52855ed8b4164db5db21d3c4e3baed2611d9d34932f36b6096086eee0c690417fb97'
        }
      ]
    }
  },
  gas: 1000000,
  feePayer: '0x44Ee3906a7a2007762E9d706dF6E4eF63FA1edA8',
  submit: true
}
const result = await caver.kas.wallet.requestFDAccountUpdatePaidByUser(tx)

KAS에서 수수료 부담

const result = await caver.kas.wallet.requestFDAccountUpdatePaidByGlobalFeePayer(tx)

데이터 앵커링

Wallet API로 서비스 체인 데이터를 메인 체인에 앵커링하는 데이터 앵커링 트랜잭션을 클레이튼에 보내기

보내는 계정이 수수료 부담

const result = await caver.kas.wallet.requestChainDataAnchoring(tx)

다른 계정이 수수료 대납

const result = await caver.kas.wallet.requestFDChainDataAnchoringPaidByUser(tx)

대납 계정의 잔고가 수수료 미만이면 앵커링 트랜잭션 전송은 실패

KAS에서 수수료 대납

const result = await caver.kas.wallet.requestFDChainDataAnchoringPaidByGlobalFeePayer(tx)

다중 서명 트랜잭션

Wallet API로 여러 계정이 서명해야하는 트랜잭션 전송

다중 서명을 받는 트랜잭션 보내기

1. KAS에 클레이튼 계정 생성
2. 계정 키를 다중 서명 키로 변경
3. KLAY 전송 트랜잭션 생성
4. 보류중인 KLAY 전송 트랜잭션에 모든 계정이 서명

보류 중인 트랜잭션 목록 조회

계정이 다중 서명 계정이고, 트랜잭션을 전송하는데 서명을 충분히 받지 못한 경우 트랜잭션은 보류(pending)상태이다.

const result = await caver.kas.wallet.getMultiSigTransactionList(size, cursor, to-timestamp, from-timestamp)

보류 중인 트랜잭션에 서명

const result = await caver.kas.wallet.signMultiSigTransction(address, transactionId)

>> MultisigTransactionStatus {
  signedWeight: 1,
  status: 'Signed',
  threshold: 3,
  transactionId: '0xfe2be4de37ed40c6c049d3c2771a6e7577916c951dd331b297b517b25609b4ad',
  weight: 1,
  // reminders: 아직 서명하지 않은 키의 계정 주소
  reminders: [
    '0xc4Dd4D041430c65d95CaaF6fB1506A542d6583d0',
    '0x55afF286674559caB1Fd4427C91C4cC045766140'
  ]
}

미리 준비한 서명 사용

KAS 외부에서 만든 Klaytn 계정이 있고, 이 계정의 서명 값이 있다면 이 서명 값으로 트랜잭션에 서명할 수 있다.

const transactionId = '0x7e7f18b16fb1807654d9cd2b1ad1c0cbb649b81648543a792a6db2f43e1a8ad5'
const signatures = [
  {
    V: '0x7f6'
    R: '0xc2902ebb52f554fd257eda57a3fe7cbf1e046bb43d1472bd396f2c3053f8bf55',
    S: '0x32f7d5b99e91510ecaefc5fe65816e6e43043c408873b2453d02116be1674278',
  }
] // 서명 값
const result = await caver.kas.wallet.appendSignatures(transactionId, signatures)
profile
안녕하세요

0개의 댓글