본문 바로가기
블록체인 이론/klaytn

Klaytn transactions

by gun_poo 2022. 2. 15.

개요

트랜잭션은 블록체인의 상태를 변경하는 노드간 전송되는 메시지이다.

트랜잭션은 아토믹(atomic) 연산이기 때문에 한 트랜잭션이 다른 트랜잭션 사이에 낄 수 없다.

  • Klaytn은 새로운 기능을 제공하고, 메모리 풋 프린트와 퍼포먼스를 최적화하기 위해 여러 가지 트랜잭션 유형을 제공한다

트랜잭션의 서명 검증

  • 클레이튼에서 키 쌍은 Klaytn의 주소와 분리되어 있으므로 발신자 주소는 트랜잭션 서명을 사용하여 파생되지 않는다
    • TxTypeLegacyTransaction을 제외한 다른 Klaytn 트랜잭션 유형의 필드에 from이 있는 이유
  • 트랜잭션을 검증하기 위해 클레이튼에서 from의 AccountKey가 사용

트랜잭션 수수료 위임

  • 트랜잭션 수수료 보조금은 Ratio parameter를 조정하여 서비스 제공자가 커버할 수수료의 비율을 정할 수 있다
  • 트랜잭션 수수료 위임 트랜잭션은 적어도 두 개의 서명이 필요
    • 하나는 발신자로부터, 또 다른 하나는 트랜잭션 수수료 지불인으로부터의 서명

SenderTxHash

  • SenderTxHash는 트랜잭션 수수료 납부자의 주소와 서명이 없는 트랜잭션의 해시
  • 트랜잭션 수수료 위임 트랜잭션의 트랜잭션 해시는 수수료 지불인이 그 거래에 서명할 때까지 결정되지 않는다
  • 수수료 위임 트랜잭션을 찾으려면 발신자는 발신자와 트랜잭션 수수료 지불인 모두의 서명이 담긴 완전한 트랜잭션으로부터 파생된 트랜잭션 해시를 얻어야 한다
  • Klaytn 네트워크에서 완전한 수수료 위임 트랜잭션을 찾으려면 발신자는 SenderTxHash을 만들고 트랜잭션 오브젝트를 klay_getTransactionBySenderTxHash 로 요청 하여야 한다

TxTypeLegacyTransaction

  • 이 유형의 트랜잭션은 계정 생성, 토큰 전송, 스마트 컨트랙트 배포, 스마트 컨트랙트 실행 또는 앞에서 언급한 것들을 혼합하여 실행 가능
    • 신자의 잔고는 트랜잭션 수수료만큼 줄어든다
    • 발신자 논스 1 증가
    • 만약 to가 Klaytn에 존재하지 않으면 AccountKeyLegacy 와 연결된 EOA를 만든다.
      • EOA를 만든다? 발신자에게 만들어진 EOA의 주소와 키를 반환해주면 분실 토큰을 막을 수 있지 않을까
    • value KLAY가 발신자로부터 수신자로 전송
    • to가 nil이라면 스마트컨 트랙트 배포를 위한 트랜잭션으로 간주, 스마트 컨트랙트 코드는 input을 통해 전달되어야 한다.
    • to가 스마트 컨트랙트라면 input에 명시된 스마트 컨트랙트 함수가 실행

서명 RLP 인코딩

SigRLP = encode([nonce, gasPrice, gas, to, value, input, chainid, 0, 0])
SigHash = keccak256(SigRLP)
Signature = sign(SigHash, <private key>)

SenderTxHash를 위한 RLP 인코딩

SenderTxHashRLP = encode([nonce, gasPrice, gas, to, value, input, v, r, s])
SenderTxHash = keccak256(SenderTxHashRLP)

트랜잭션 해시를 위한 RLP 인코딩

TxHashRLP = encode([nonce, gasPrice, gas, to, value, input, v, r, s])
TxHash = keccak256(TxHashRLP)

TxTypeSmartContractExecution

  • TxTypeSmartContractExecution는 스마트 컨트랙트를 실행하고, input에 입력된 데이터를 이용
  • TxTypeSmartContractExecution는 to가 스마트 컨트랙트 계정일 때만 실행
    • to가 스마트 컨트랙트라면 input을 이용하여 코드가 실행

서명 RLP 인코딩

SigRLP = encode([encode([type, nonce, gasPrice, gas, to, value, from, input]), chainid, 0, 0])
SigHash = keccak256(SigRLP)
Signature = sign(SigHash, <private key>)

SenderTxHash를 위한 RLP 인코딩

txSignatures (a single signature) = [[v, r, s]]
txSignatures (two signatures) = [[v1, r1, s1], [v2, r2, s2]]
SenderTxHashRLP = type + encode([nonce, gasPrice, gas, to, value, from, input, txSignatures])
SenderTxHash = keccak256(SenderTxHashRLP)

트랜잭션 해시를 위한 RLP 인코딩

txSignatures (a single signature) = [[v, r, s]]
txSignatures (two signatures) = [[v1, r1, s1], [v2, r2, s2]]
TxHashRLP = type + encode([nonce, gasPrice, gas, to, value, from, input, txSignatures])
TxHash = keccak256(TxHashRLP)

TxTypeCancel

  • Klaytn에서는 가스 가격이 고정돼 있기 때문에, 기존 트랜잭션을 더 높은 가스 가격으로 대체하는 것은 불가능
  • 이 문제를 해결하기 위해 Klaytn은 트랜잭션 유형 TxTypeCancel을 제공
    • 이전 트랜잭션이 손실된 경우 TxTypeCancel 트랜잭션이 실행되어 블록에 포함
    • 이전 트랜잭션이 아직 처리되지 않은 경우 TxTypeCancel은 이전 트랜잭션을 대체, 그런 다음 실행되어 블록에 포함
    • 이전 트랜잭션이 이미 실행된 경우, 논스가 증가했으므로 TxTypeCancel 트랜잭션은 논스가 낮아서 삭제

 

'블록체인 이론 > klaytn' 카테고리의 다른 글

Klaytn 트랜잭션 비용 위임  (0) 2022.02.15
Klaytn 계정  (0) 2022.02.15
klaytn 합의 메커니즘  (0) 2022.02.15

댓글