[Klaytn] Fee delegation, Role-based keys

휴먼스케이프

안녕하세요. Humanscape Software Engineer David입니다.

카카오 계열사 GroundX의 블록체인인 클레이튼은 fee delegation 기능을 제공합니다.

BApp(Blockchain App)은 토큰의 이동이나, 스마트 컨트랙스 실행시 유저가 transaction fee를 내는 구조인데요. 블록체인의 이러한 특성상 유저는 불편한 UI/UX를 경험하게 됩니다.

클레이튼은 이러한 부분을 개선하고자 유저가 아닌 다른 계정(서비스가 지정한 계정이 될 수도 있음)에서 transaction fee를 대신 납부하는 ‘대납(fee-delegation transaction)’ 개념을 도입합니다.

대납이라는 개념 자체는 여러 설계, 개발 사례가 있으나, 메인넷에 직접 장착해서 나온 점에서 서비스 개발자들이 편리하게 사용할 수 있을 거 같습니다.

lagacy account를 이용하는 방법과 role-based keys 개념을 이용한 방법으로 대납 컨트랙트를 구현 할 수 있습니다.

lagacy account

// 1.caver 선언
const Caver = require(‘caver-js’);
// 2.네트워크 설정
const caver = new Caver('https://api.baobab.klaytn.net:8651 or https://api.cypress.klaytn.net:8651 중 하나로 설정해주세요.);
// 3.sender 계정 추가
const sender = caver.klay.accounts.wallet.add('sender account private key를 입력해주세요.');
// 4.대납 계정 추가
const feePayer = caver.klay.accounts.wallet.add('fee payer account private key를 입력해주세요.');
// 5.컨트랙트 fuction call encode
const encodeFunctionCall = caver.klay.abi.encodeFunctionCall('encode FunctionCall Data 를 입력해주세요.');
// 6.트랜잭션 생성
const {rawTransaction: senderRawTransaction} = await caver.klay.accounts.signTransaction({
type: ‘FEE_DELEGATED_SMART_CONTRACT_EXECUTION’, // 대납 컨트랙트 실행으로 타입 지정
from: sender.address,
to: '미리 배포한 컨트랙트 주소를 입력해주세요.',
data: encodeFunctionCall,
value: caver.utils.toPeb(‘0’, ‘KLAY’),
gas: ‘300000’,
}, sender.privateKey);
// 7.트랜잭션 전송, using the event emitter
caver.klay.sendTransaction({
  senderRawTransaction: senderRawTransaction,
  feePayer: feePayer.address,
})
.on(‘transactionHash’, function(hash){
  ...
})
.on(‘c’, async function(receipt) {
  ...
})
.on(‘error’, console.error); // If an out-of-gas error, the second parameter is the receipt.

klaytn의 js 라이브러리인 caver를 import 합니다.

네트워크를 설정해줍니다. (testnet: https://api.baobab.klaytn.net:8651, mainnet https://api.cypress.klaytn.net:8651)

sender 계정 추가: 컨트랙트를 실행할 계정을 add 해줍니다. (zepplin의 ownerable, multi ownerable 등이 구현되어있다면 대납계정이 아닌 sender에 owner를 설정해주어야합니다.

feepayer 계정 추가: 대납 계정을 add해줍니다. 대납계정에는 klay가 없으면 컨트랙트는 실행되지않습니다.

실행하려는 컨트랙트의 function을 인코딩해줍니다. 참고: fuction call encode

정보와 함께 트랜잭션을 생성해줍니다.

트랜잭션을 전송합니다.

role-based keys

기존에 블록체인 상의 계정은 하나의 private key 와 하나의 public key로만 계정에 접근이 가능했는데요.

Role-based keys는 하나의 계정에 role에 따라 여러개의 private key와 public key가 존재하는 것이 가능해집니다.

// 1.caver 선언
const Caver = require(‘caver-js’);
// 2.네트워크 설정
const caver = new Caver('https://api.baobab.klaytn.net:8651 or https://api.cypress.klaytn.net:8651 중 하나로 설정해주세요.);
// 3.sender 계정 추가
const sender = caver.klay.accounts.wallet.add('sender account private key를 입력해주세요.');
// 4.role-based key로 구성 된 대납 계정 추가
const feePayer = caver.klay.accounts.wallet.add('(A) fee payer account private key를 입력해주세요.', '(B) fee payer address를 입력해주세요.');
// 5.컨트랙트 fuction call encode
const encodeFunctionCall = caver.klay.abi.encodeFunctionCall('encode FunctionCall Data 를 입력해주세요.');
// 6.트랜잭션 생성
const {rawTransaction: senderRawTransaction} = await caver.klay.accounts.signTransaction({
type: ‘FEE_DELEGATED_SMART_CONTRACT_EXECUTION’, // 대납 컨트랙트 실행으로 타입 지정
from: sender.address,
to: '미리 배포한 컨트랙트 주소를 입력해주세요.',
data: encodeFunctionCall,
value: caver.utils.toPeb(‘0’, ‘KLAY’),
gas: ‘300000’,
}, sender.privateKey);
// 7.트랜잭션 전송, using the event emitter
caver.klay.sendTransaction({
  senderRawTransaction: senderRawTransaction,
  feePayer: feePayer.address,
})
.on(‘transactionHash’, function(hash){
  ...
})
.on(‘c’, async function(receipt) {
  ...
})
.on(‘error’, console.error); // If an out-of-gas error, the second parameter is the receipt.

코드의 4. 대납계정 추가 단계에서 ‘fee payer address를 입력해주세요.’ 부분이 추가 된 것 외에 lagacy account로 구현하는 코드와 같습니다.

서비스를 제공하는 회사는 회사가 관리하는 account에 klay를 넣어놓고 유저들이 발생시키는 transaction fee를 대신 내주는게 가능해집니다. 그래서 위 코드에 (A) 키는 lagacy address를 가지고 있으면서도, (B) address를 이용해 대납을 할 수 있는 권한이 있어서 4번과 같이 선언하고 지갑을 추가해 사용할 수 있게 되는 방식입니다.

계정 별 컨트랙트 실행 권한을 관리해서 컨트랙트 운영을 다채롭게할 수 있다는 점과 보안 관리가 강화되는 장점이 있습니다.

또, 키를 잃어버리거나 탈취 당했을 때 해당 키의 권한을 없앨 수도 있어 큰 피해를 막을 수는 있지만 순수(?) 탈중앙화 블록체인을 지지하는 유저들은 이러한 중앙의 관리 때문에 서비스 선택에 고민이 있을 수 있겠다는 생각이 들었습니다.

최근 klaytn 문서의 url 체계가 바뀌어서 구글링으로 나오는 link들이 작동하지 않는 불편함이 있지만, 문서 자체는 상당히 잘쓰여있어 개발하는데 큰 어려움이 없었습니다.

그래서인지 재미있는 실 서비스 사례(https://stateofthedapps.com/rankings/platform/klaytn)도 많이 나오고 있네요.

감사합니다.

Get to know us better! Join our official channels below.

Telegram(EN) : t.me/Humanscape KakaoTalk(KR) : open.kakao.com/o/gqbUQEM Website : humanscape.io Medium : medium.com/humanscape-ico Facebook : www.facebook.com/humanscape Twitter : twitter.com/Humanscape_io Reddit : https://www.reddit.com/r/Humanscape_official Bitcointalk announcement : https://bit.ly/2rVsP4T Email : support@humanscape.io

기업문화 엿볼 때, 더팀스

로그인

/