brunch

매거진 개발실습

You can make anything
by writing

C.S.Lewis

by SKKRYPTO Mar 15. 2019

[TezosXSkkrypto] 테조스 실습노트 #3

네트워크 참여하기

이번에는 네트워크에서 실행되고 있는 합의 과정에 참여하는 방법에 대해 알아보겠습니다. 테조스 코인(tezzie) 보유자는 테조스 네트워크의 합의(consensus)과정에 참여할 수 있는데, 위임을 통해 간접적으로 참여하거나, validator(baker, delegate)가 되어 직접 참여할 수 있습니다. 


Originated accounts


테조스의 계정(account)은 두 종류로 나뉩니다. 하나는 implicit account이고, 다른 하나는 originated account입니다.

implicit account는 ‘implicit’이 ‘암묵적인, 암시된’을 뜻하는 것처럼, 우리가 일반적으로 블록체인의 계정을 생각할 때 자연스럽게 (암묵적으로) 떠올리는 계정을 말합니다. 즉, tezzie를 보유하고, 자유롭게 주고 받을 수 있는 계정입니다. 다른 말로는 default account라고도 부릅니다. 지금까지 사용한 tz1 계정이 implicit account입니다. 기술적으로는 퍼블릭 키와 프라이빗 키 쌍에 대응하는 계정입니다.originated account는 ‘orginated’, 즉 ‘만들어진’ 계정입니다. Origination operation을 통해 만들어지며, implicit account와 구분하기 위해 주소가 KT1으로 시작합니다. Originated account는 코인을 보유하고 주고 받는 것 말고도, 토큰을 위임하거나 스마트 컨트랙트 코드를 보유할 수 있습니다.

tzscan.io 에서 foundation baker의 originated account를 살펴보면 code 탭이 있습니다. 이 code 탭에서 originated account의 코드를 확인할 수 있습니다.


베이킹에 직접 참여하기


이제 베이킹에 참여해 보겠습니다. tezos-baker-003-PsddFKi3 run with local node ~/.tezos-node <name> 명령어를 실행합니다. tezos-baker-003-PsddFKi3은 실습노트 #2에서 간략하게 살펴본 6개의 실행파일 중의 하나입니다.

endorsing과 accusing은 tezos-{endorser, accuser}-003-PsddFKi3 run으로 실행합니다.

endorser는 연결된 계정의 endorsing 권리를 확인한 후, 새로운 블록을 받으면 그 블록이 유효한 블록인지를 검사하고, endorsement operation을 통해 블록을 인도싱합니다.

accuser는 모든 체인에 대해 수신된 블록을 모니터링하고, delegate를 감시합니다. 같은 레벨에서 블록 두 개에 사인한 baker, 같은 레벨에서 서로 다른 블록 2개를 인도싱하려는 endorser, 같은 블록에 두 번 인도싱하려는 endorser를 찾습니다. 이러한 delegate를 찾으면 accuser는 이중 베이킹과 이중 인도싱을 신고하고 불법적인 행동을 한 delegate의security deposit*을 잃게 합니다. Security deposit의 절반은 소각되고, 절반은 accuser에게 보상으로 지급됩니다. 그런데 이런 의도를 가지지 않아도 서로 다른 데몬에서 같은 계정으로 베이킹을 시도하면 이중 지불의 가능성이 생기고, 이중 지불이 발생하면 모든 bond를 잃게 됩니다. 이것을 방지하려면 한 개의 implicit account에 하나의 데몬만 연결되어있어야 합니다.


*security deposit: 해당 시점에 동결된 모든 deposit(최대 직전 5사이클까지의 베이킹, 인도싱에 대한 보상)을 뜻합니다.


코인 위임하기


만약 직접 delegate가 되어 프로토콜에 참여하는 복잡함을 감수하고 싶지 않다면, 다른 implicit account 에 코인을 위임함으로써 프로토콜에 참여할 수 있습니다.


Implicit account는 코인을 위임할 수 없으므로, originated account를 생성하고 코인을 전송한 후 originated account에서 코인을 위임해야 합니다. alice의 1000 xtz를 bob에게 위임해 보겠습니다. 먼저 bob의 계정을 delegate 역할이 가능하게 만들어 줍니다. 주의할 점은 delegate가 된다는 것은 합의과정에 직접 참여하는 것을 의미하고, 이 때 자신의 deposit을 걸어야만 참여할 수 있기 때문에 bob의 계정에 코인이 없으면 delegate로 등록이 되지 않는다는 것입니다.

컨트랙트 alice_del을 생성하고, 1000 xtz를 alice_del에게 보낸 후 bob에게 위임합니다.


블록 생성, 인도싱 보상


네트워크에서 delegate의 베이킹과 인도싱 권리는 그들이 가진 roll의 수에 비례해서 랜덤으로 할당됩니다. 만약 A가 6roll, B가 3roll, C가 1roll을 가지고 있다면, A가 베이킹권리를 얻을 확률은 6/10이 됩니다. 네트워크에 존재하는 전체 roll의 수가 n이라면 한 개의 roll을 가진 delegate가 블록을 베이킹 할 확률은 1/n이고. 인도싱할 확률은 32/n입니다. 보유한 roll의 개수는 계정이 보유한 xtz와 위임받은 xtz의 합으로 결정됩니다. roll의 개수는 xtz의 총합을 10000으로 나눈 몫입니다. 10000xtz를 보유한 계정이나 19999xtz를 보유한 계정이나 보유한 roll의 개수는 같다는 의미이고, 블록을 베이킹할 확률도 같습니다. 일반적으로 delegate가 3000xtz정도를 가지고 있다면 베이킹이나 인도싱할 기회를 놓치지 않을 수 있습니다.


다음 블록을 베이킹할 delegate를 뽑는 방법은 모든 roll에 고유한 번호를 부여한 후 체인에서 번호를 공개하면 그 번호를 가진 roll을 보유한 delegate를 baker로 선정하는 것입니다. 그래서 많은 roll을 보유한 delegate가 당연히 베이킹할 확률이 높습니다. 현재 사이클로부터 6번째 전 사이클에서 현재 사이클의 baker와 endorser의 우선순위(block priority)를 정합니다. 우선순위란 선정된 baker, endorser가 베이킹, 인도싱을 진행하지 않을 경우에 대비해 우선순위를 16번째까지 정해주는 것입니다. n번째 우선순위인 사람은 n분후에 베이킹할 수 있습니다. 우선순위 16번까지 모두 베이킹을 진행하지 않는다면 그 이후에는 모든 baker들이 보증금없이 베이킹을 진행할 수 있습니다. 베이킹에 대한 보상은 16xtz와 블록에 포함된 거래의 수수료입니다.


endorser들이 우선순위가 낮은 블록을 인도싱하는 것을 방지하고 메인체인의 적합성을 유지하기 위해서, endorser들이 인도싱한 블록의 우선순위에 따라 보상을 다르게 지급합니다. 메인체인이 아닌 다른 체인의 블록에 서명한 endorser들은 보상을 지급받지 못하고, 우선순위가 낮은 블록에 서명한 endorser들은 우선순위에 따라 보상에 페널티를 받게 됩니다. (2xtz / block priority)


위 그림에서는 Bob이 베이킹한 블록은 메인 체인에 포함되지 못하고, 그 블록에 서명한 endorser들은 인도싱 보상을 받을 수 없습니다. 블록 생성시마다 우선순위가 가장 높은 베이커의 블록이 메인 체인이 될 확률이 제일 높기 때문에, 자연스럽게 endorser들은 가장 높은 우선순위를 가진 블록에 인도싱을 하게 됩니다.


 모든 baker와 endorser들이 정상적으로 행동한다면 명목상 블록 하나당 baker에게는 16xtz, endorser에게는 2xtz/1 * 32xtz 총 80xtz가 생성가능합니다.


보증금과 over-delegation


delegate가 블록을 베이킹하거나 인도싱할 때, 보증금이 필요합니다. delegate는 preserved_cycles동안 생성될 수 있는 블록에 대해 security deposit을 지불할 코인이 있어야 합니다. 블록 베이킹에는 512xtz, 인도싱에는 64xtz가 필요합니다. 보증금은 위임받은 코인에서 빠져나가는 것이 아니라 delegate의 계정에서 빠져나갑니다.


만약 이번 블록을 베이킹해야하는 delegate가 deposit할 충분한 코인을 가지고 있지 않다면, 이 delegate는 블록을 베이킹하거나 인도싱하지 못하고, 네트워크에 부정적인 영향을 미칩니다. 베이킹을 하지 못하면 네트워크가 느려지고, 인도싱을 하지 못하면 체인의 적합성이 약해져 체인이 포크에 취약해집니다. 이런 상황은 그 delegate가 over-delegated 상태일 때 자주 발생합니다. over-delegated는 delegate가 사용가능한 코인과 위임받은 코인사이의 균형이 깨진 상태를 말합니다. 그래서 네트워크에 부정적인 영향을 끼치지 않고 프로토콜에 참여하고 싶다면 over-delegated 상태가 아닌 delegate를 찾아 코인을 위임해야 합니다. delegate들은 코인 위임을 거부할 수 없기 때문에, 신중하게 delegate를 결정해야 합니다.


지금까지 테조스 네트워크의 합의 과정에 참여하는 법을 알아보았습니다. 다음주에는 테조스에서 쓸 수 있는 자바스크립트 api* 라이브러리인 EZTZ에 대해 알아보겠습니다. 감사합니다.


 *api(Application Programming Interface): 운영 체제나 프로그래밍 언어가 제공하는 기능을 응용 프로그램에서 제어할 수 있게 만든 인터페이스를 뜻합니다.


작성자: 김승태

개발팀: 김승태, 김예서, 김형준

매거진의 이전글 [TezosXSkkrypto] 테조스 실습노트 #2
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari