CodeChain Partial signing

 

코드박스

블록체인의 자산관리 모델은 크게 UTXO모델과 account 모델로 나뉜다. UTXO 모델은 비트코인에서 사용하고 있는 방식이고 account 모델은 이더리움에서 사용하고 있는 방식이다. 코드체인은 UTXO 모델을 사용하고 있으며 partial signing을 지원하고 이를 통해 에스크로 없이도 안전한 거래를 보장하는 등 보다 복잡한 형태의 비동기 거래를 구현할 수 있다. partial signing을 이해하려면 우선 UTXO모델의 트랜잭션에 대해 이해해야 한다. 트랜잭션에서 input은 이전 트랜잭션의 output 즉 자산을 가리키고 있고, 새로 만들어진 output은 이전 output을 소모하여 소유자가 바뀌거나 amount가 나누어지는 등 새로운 형태의 자산이 된다. 이렇게 만들어진 자산에 대한 소유권은 output 안에 들어있는 lock script를 해제함으로써 증명할 수 있고 그러기 위해서는 서명이 필요하다.

서명은 사용자의 비밀키와 메시지로 만들 수 있는데 여기서 메시지가 되는 것이 트랜잭션이다. lock script는 자산의 소유권을 확인하기 위해 우선 공개키를 확인한다. 이 공개키는 자산의 이전 소유자가 소유권을 넘겨주기 위해 lock script에 미리 넣어놓은 것이다. 이때 공개키와 서명 그리고 메시지만 있으면 서명을 제공한 사용자가 비밀키를 들고 있음을 검증할 수 있다. 여기서 메시지에 해당하는 트랜잭션의 데이터는 체인 상에 있기 때문에 lock script를 풀려는 사용자는 자신의 공개키와 서명을 제공해야 한다.

처음 트랜잭션이 블록에 들어오면 input에 들어있는 unlock script가 차례대로 실행된다. 이때, 만약 unlock script를 통해 서명을 제공한 후 트랜잭션의 내용이 바뀌면 제공했던 서명은 유효하지 않게 되고 이전에 제공했던 unlock script는 더는 lock script를 풀 수 없게 되어 트랜잭션은 실패한다. 이처럼 자산과 그에 대한 소유자가 정해져야만 트랜잭션이 성공하기 때문에 소유권이 없는 자산 혹은 자산이 없는 소유권이 존재할 수 없다.

이는 매우 제한적인 모델이다. 코드체인의 Partial signing은 이 모델을 좀 더 유연하게 만들어 준다. 서명을 만들 때 트랜잭션의 일부분만 메시지로 가져와 서명할 수 있다면 나중에 트랜잭션의 내용이 바뀌더라도 서명한 부분만 아니면 서명이 여전히 유효할 수 있다.

자산이 없는 소유권이 존재할 수 있는 상황을 예로 들어 보겠다.

자산 없는 소유권

다음과 같은 트랜잭션이 있다고 가정해보자. 현재 Input1의 unlock script에서는 Input1과 Output1, Output2를 메시지로 하여 만든 서명과 소유자의 공개키를 제공한다. 그렇기 때문에 amount가 10인 Input2가 추가되어도 여전히 Input1의 unlock script는 유효하며 이 트랜잭션은 valid 한 상태가 된다. 서명을 한 후에도 Input의 추가가 가능해지는 것이다. 이때 Output1 과 Output2가 자산은 아직 존재하지 않지만, 자산이 들어오면 누군가의 소유가 될 거라는 정보만 있다. 반대로 소유권이 없는 자산도 가능하다.

코드체인에서는 partial signing을 어떻게 구현하고 있을까? 코드체인의 unlock script는 서명을 검증할 때 Tag도 함께 제공한다. 이 Tag는 1byte를 prefix로 하여 뒤에 output filter가 따라오는 형태이다.

Tag

서명 검증이 시작되면 우선 filter의 input scheme bit를 확인한다. input scheme bit가 1이면 트랜잭션의 모든 input에 대해서 서명을 한다. 그러므로 input의 변경이 더는 일어날 수 없다. input scheme bit가 0이면 현재 실행하고 있는 unlock script가 들어있는 input에만 signing을 진행한다. 그러므로 signing이 완료된 후에도 input이 트랜잭션에 추가될 수 있다. 그 다음 output scheme bit를 확인해서 1이면 트랜잭션의 모든 output에 대해서 signing을 진행하고 0이면 filter length를 참고하여 output filter를 적용한다. output filter는 bit array의 형태로 output index에 해당하는 bit가 1이면 해당 output을 메시지에 포함시켜 서명을 진행한다. 이를 통해 output에 대한 부분적인 서명이 가능해지는 것이다.

partial signing을 통해 코드체인은 보다 복잡한 형태의 거래를 지원할 수 있는데 크라우드 펀딩을 예로 들어보자. 크라우드 펀딩의 경우 일정 금액이 모금되면 프로젝트를 시작한다. 이전 트랜잭션 모델의 경우, 투자자가 기획자에게 반드시 자금의 소유권을 줬어야 했다. 이럴 경우 모금액이 넘지 않으면 기획자는 다시 투자자에게 자금을 돌려줘야 한다. 하지만 partial signing을 통해 기획자는 모금액에 해당하는 output만 있는 트랜잭션을 partially sign 해서 투자자들에게 보낸다. 그러면 투자자들은 거기에 input만 추가하면 되는 것이다. Input을 추가한다고 자산의 소유권이 바로 넘어가는 것이 아니고 모금액에 해당하는 input이 다 모여야만 트랜잭션이 성사되고 자산의 소유권이 넘어가는 것이다.

이제 우리는 partial signing을 통해 소유권이 없는 자산과 자산없는 소유권을 구현하는게 가능해졌다. 이를 통해 위의 예시 뿐만 아니라 게임 아이템 거래 또는 후원금 모집과 같은 비동기 거래가 필요한 다양한 상황에서 코드체인의 트랜잭션을 적용하는 것이 가능할 것이다.

Check out the source code at our github repo. If you would like to chat with the CodeChain developers’ community, join our gitter channel.

기업문화 엿볼 때, 더팀스

로그인

/