글로벌 재활용쓰레기 수거 MPC Dapp 설계하기

KimCookieYa·2022년 8월 11일
0

블록체인 인 액션

목록 보기
5/5
post-thumbnail

* Blockchain in Action(블록체인 인 액션) 책의 실습을 바탕으로 작성하였음.

MPC

채널

채널이란 정보가 하나의 포인트에서 다른 포인트로 지나가는 경로다. 여기서는 지급 메커니즘을 위해 채널을 사용한다. 이 개념은 페이먼트 채널로도 많이 알려져 있다. 비트코인에 사용된 사이드 채널 개념은 라이트닝 채널을 위한 모델로서 사용되며, 이더리움에서는 신뢰하는 파티 간의 오프체인 트랜잭션을 위한 스테이트 채널로 사용된다. 이러한 채널들은 메인 암호 화폐 전송 채널과는 별개의 사이드 채널이다.

사이드 채널 또는 사이드 체인은 블록체인 네트워크의 확장성 문제를 다루기 위해, 트랜잭션 속도를 개선하기 위해, 또는 마이크로 페이먼트 채널을 만들기 위해 도입했다.

마이크로 페이먼트 채널

마이크로 페이먼트(소액 지급)는 전 세계에 걸쳐 이어져 온 오래된 관행이다. 많은 로컬 개인 상점들(자영업)이 그들의 일상적인 생활과 로컬 경제를 유지하기 위해 마이크로 페이먼트에 의존한다. 이러한 페이먼트는 은행과 같은 통상적인 금융기관을 거치지 않는다. 디지털 시대의 도래와 함께 이러한 마이크로 페이먼트 수간을 디지털하기 위한 많은 노력이 있었지만, 그 성과는 제한적이었다.

비트코인 블록체인은 서로 모르는 피어들 간에 온라인으로 송금할 수 있는 기능을 제공함으로써 이러한 상황을 바꾸었다. 이 혁신으로 인해 당연히 마이크로 페이먼트에 대한 관심이 다시 늘어나기 시작했다.

다음은 마이크로 페이먼트 채널에 대한 몇 가지 기본적인 사항이다.

  • 송신자와 수신자의 어카운트 주소로 식별하는 엔드포인트로 정의한다.
  • 송신자와 수신자 간의 빈번한 소액(마이크로) 지급을 수월하게 만들어 준다.
  • 지급 금액은 메인 채널의 트랜잭션에 부과되는 트랜잭션 수수료보다 작다.(이 경우 메인 채널은 사용할 수 없다)
  • 송신자와 수신자의 관계는 임시적이며, 통상적으로 지급 정산을 하고 메인 채널과의 싱크 완료 시 이 관계는 종료된다.

두 어카운트 간에 존재하는 온체인 메인 채널과 오프체인 사이드 채널의 관계를 보자. 누구나 메인 채널에 참여하거나 떠날 수 있고, 서로 아무 어카운트와 트랜잭션을 처리할 수 있다. 모든 메인 채널상의 트랜잭션은 블록체인에 기록된다. 메인 채널은 비트코인과 이더리움의 메인 체인처럼 영구적이다.

마이크로 채널은 선정된 어카운트, 이 경우에는 두 어카운트 간의 사이드 채널의 예라고 볼 수 있다. 사이드 채널 어카운드 간의 트랜잭션은 오프체인에서 일어나며, 메인 체인과 싱크가 되기 전까지는 체인에 기록되지 않는다. 이러한 동기화는 사이드 채널에 참여하고 있는 한 사용자가 트랜잭션을 메인 채널에 보낼 때 일어나는데, 이때 오프체인 트랜잭션 정보를 캡처해서 요약해 보낸다. 사이드 채널은 메인 채널과의 동기화에 따라 종료될 수도 있다.


설계

문제 설정

UN과 같은 비정부기구가 전 세계에 걸쳐 재활용 가능한 플라스틱을 수집하는 행위에 대해 소액을 지급하는(마이크로 페이먼트) 인센티브 프로그램을 운영한다고 가정하자. 수집한 플라스틱은 상자당 계산하며, 재활용과 적절한 폐기 처리를 위한 시설로 보낸다.

  • 수집한 플라스틱의 상자가 적절한 양과 플라스틱 종류를 가지고 있는지 확인하는 메커니즘을 가진다. 조건을 충족하지 않으면 상자의 접수를 거부한다.
  • 사람 또는 로봇이 상자에 있는 플라스틱을 수거해서 지정된 장소에 저장한다. 작업자가 수거한 상자에 대한 검사 확인을 받을 때마다 후원 단체로 메시지가 나간다. 후원 단체는 메시지를 받음과 동시에 이 단체와 작업자 간에 구축한 채널을 통해 오프체인 마이크로 페이먼트를 허가해서 보낸다. 단일 플라스틱 수집 세션 내에서 필료할 경우 다수의 마이크로 페이먼트를 작업자에게 보낼 수도 있다. 주어진 한 세션 내에서 마이크로 페이먼트는 모든 이전 페이먼트를 전부 더한 값이다.
  • 플라스틱 수거 상자를 수집할 때마다 수수료를 내면서 소액을 지급하는 대신, 당일 최종 수거 상자 처리를 끝낸 다음, 하루 동안의 전체 금액을 한 번에 온체인 Tx를 통해 지급한다. 설계상 이 한 번의 Tx 금액은 당일 모든 마이크로 페이먼트를 누적한 마지막 마이크로 페이먼트 금액과 같다.
  • 페이먼트를 정산하면 채널은 종료된다. 매 세션, 매 작업자마다 새 처널을 생성하고 같은 작업을 반복한다. 전통적인 은행 시스템에서는 이런 식으로 오픈하고 닫는 것이 불가능하지만, 블록체인 시스템에서는 일반적인 프로세스다.

블록체인 기반 마이크로 페이먼트 시스템

블록체인 솔루션의 가장 중요한 점은 스마트 컨트랙트가 전통적인 시스템의 은행을 대체하고, 디지털 마이크로 페이먼트가 지급 수표를 대체하는 것이다. 다음은 블록체인 기반 MPC 오퍼레이션들이다.

  • 주관자가 패널을 오픈한다. 스마트 컨트랙트를 배포하고, 주관자와 작업자, 두 개의 어카운트로 초기화한다. 주관자가 지급을 위한 에스크로를 예치한다.작업자마다 별도의 채널을 오픈한다.
  • 마이크로 페이먼트가 수표를 대체한다.
  • 주관자가 오프체인에서 사인된 메시지를 송신하는 방법을 사용해 wei 단위(예를 들어, 한 상자당 1000wei)로 마이크로 페이먼트를 보낸다.
  • 송금한 마이크로 페이먼트는 계속 누적되기 때문에 마지막 페이먼트는 그 이전까지 보내진 전체 금액을 포함한다.
  • 작업자는 최종 지급 요청을 위해 주관자가 보낸 마지막 마이크로 페이먼트 메시지만을 스마트 컨트랙트에 보내면 된다. 지급 요청이 끝남과 동시에 해당 스마트 컨트랙트는 종료(selfdestruct 함수에 의해)된다.

작업자가 누적된 최종 마이크로 페이먼트에 대해 지급 요청을 하면, 해당 컨트랙트는 파괴 또는 종료가 되는데, 이것은 많은 수의 수표 발행으로 인한 비용 문제를 해결할 뿐만 아니라, 부정한 이중 지급을 방지한다.

사용자와 역할

MPC-Dapp의 사용자는 수거 작업에 대해 지급을 하는 주관자와 재활용 가능한 플라스틱을 수거하는 작업자다. 누구나 작업자가 될 수 있다. 전 세계의 누구나 블록체인 아이덴티티를 가질 수 있는 사람은 이 작업에 동참할 수 있다. 은행 계좌도 필요 없다.

주관자와 작업자를 식별하는 것은 160비트 어카운트 넘버다. 여기서 이 어카운트 넘버는 이더리움 블록체인 주소이고, 수 분 안에 별도의 비용없이 만들 수 있다.

온체인과 오프체인 오퍼레이션

MPC에서 일어나는 상호작용 패턴이 요청과 응답으로 이루어지는 전형적인 웹 애플리케이션과 상당히 다르다는 것을 알 수 있다.

  1. 마이크로 페이먼트 채널 개설 - 스마트 컨트랙트를 배포함으로써 송신자(주관자)와 수신자(작업자) 간의 일회용 마이크로 페이먼트 채널을 개설한다.
  2. 플라스틱 수거 - 오프라인(오프체인) 오퍼레이션에서 사람들 또는 로봇(작업자)이 상자에 플라스틱 쓰레기를 수거한다.
  3. 수거 확인 - 적절한 자동화 수단을 통해 오프체인 확인 작업을 수행하고, 누가 (작업자 아이덴티티를 사용해) 몇 개의 상자를 수거했는지 송신자(주관자)에게 통보한다.
  4. 마이크로 페이먼트 지급 - 주관자는 단계 3에서 확인한 수거 상자 수에 대한 보상으로, 오프체인에서 사인된 마이크로 페이먼트 메시지를 작업자에게 보낸다.
  5. 지급 요청 - 스마트 컨트랙트에서 한 번의 온체인 트랜잭션으로, 주관자가 작업자에게 지급했던 마이크로 트랜잭션들의 누적 금액을 에스크로에서 차감해 지급한다.
  6. 채널 종료 - 최종 지급 완료 후, 이 채널은 스마트 컨트랙트의 파기에 의해 종료된다.

MPC 스마트 컨트랙트(MPC-contract)

컨트랙트는 constructor 함수를 포함해 두 개의 퍼블릭 함수를 가진다. 이 함수들은 두 개의 온체인 오퍼레이션을 코드로 구현한 것이다.

  • constructor는 주관자가 스마트 컨트랙트를 배포할 수 있도록 한다.
  • claimPayment() 함수는 작업자가 지급을 요청할 때 호출한다.

claimPayment()는 작업자가 보낸 모든 데이터를 검증한다. 여기서는 오직 송신자의 시그너처만을 검증한다. 여기서 isValidSignature()를 호출하여 암호학적 시그너처를 체크한다. 이 함수는 다시 세 개의 다른 함수, recoverSigner(), splitSignature(), prefixed()와 내장 함수인 ecreover()를 호출함으로써, 작업자/요청자의 시그너처 해시로부터 서명자의 정보와 데이터를 얻는다. 이러한 다수의 함수가 관여하는 검증 프로세서는 아무나 참여하고 이탈할 수 있는 블록체인과 자동화된 검증 시스템을 위해 반드시 필요하다. 더구나 전통적인 은행의 역할을 스마트 컨트랙트로 대체하고 나면, 전통적인 시스템이 사용하던 여러 가지 부정 방지와 남용을 예방하는 수단을 대체할 암호학적 함수들이 필요하다.

MPC.sol 코딩

pragma solidity >=0.4.24 <0.7.0;

contract MPC {
    address payable public sender;
    address payable public recipient;
    constructor (address payable reciever) public payable {
        sender = msg.sender;
        recipient = reciever;
    }

    function isValidSignedMessage(uint256 amount, bytes memory signedMessage) internal view returns (bool) {
        bytes32 message = prefixed(keccak256(abi.encodePacked(this, amount)));
        return recoverSigner(message, signedMessage) == sender;
    }

    function claimPayment(uint256 amount, bytes memory signedMessage) public {
        require(msg.sender == recipient,'Not a recipient');
        require(isValidSignedMessage(amount, signedMessage),'Signed message Unmatch');
        require(address(this).balance > amount,'Insufficient Funds');
        recipient.transfer(amount);
        selfdestruct(sender);
    }

    function splitSignedMessage(bytes memory sig) internal pure returns (uint8 v, bytes32 r, bytes32 s) {
        require(sig.length == 65,'Signed message length');
        assembly {
            r := mload(add(sig, 32))
            s := mload(add(sig, 64))
            v := byte(0, mload(add(sig, 96)))
        }
        return (v, r, s);
    }

    function recoverSigner(bytes32 message, bytes memory sig) internal pure returns (address) {
        (uint8 v, bytes32 r, bytes32 s) = splitSignedMessage(sig);
        return ecrecover(message, v, r, s);
    }

    function prefixed(bytes32 hash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }
}

스마트 컨트랙트는 채널을 오픈하고, 지급 요청에 대해 지급하고, 채널을 종료하는 온체인 오퍼레이션들을 수행했다. 오프체인 파트에서 수행해야 할 많은 작업이 남아 있는데, 그중 가장 중요한 것은 작업자가 수거한 쓰레기 상자의 확인을 마쳤을 때 마이크로 페이먼트에 사인을 하는 것이다. 마이크로 페이먼트 메시지에 사인을 하는 것은 오프체인 파트인 Dapp의 MPC-app 모듈이 담당해야 한다.

왜 스마트 컨트랙트를 파기해야 하는가?

채널을 종료하는 오퍼레이션인 claimPayment() 함수에 있는 selfdestruct(sender) 코드에 대해 살펴보자. 왜 지급 전송을 하고 난 후, 스마트 컨트랙트를 파기할까? 빈 병을 수거하고 그 대가로 몇 센트를 받는 사람을 가정해보자. 이를 위해 기억하고 내역을 추적할 필도 없을 것이다. 이와 비슷하게 탈중앙화 채널에서도 작업자가 지급 요청을 하는 것 외에는 작업자에게 다른 오버헤드를 지우고 싶지 않을 것이다. 또한, 같은 마이크로 페이먼트를 반복적으로 재지급(이중 지급)하고 싶지 않을 것이다.

이러한 이슈는 MPC에 참여하는 온라인 사용자들이 임시적이며 통상 주관 기관으로서는 알 수 없는 사람들이라는 사실에 의해 더욱 증폭된다. 바로 이것이 스마트 컨트랙트가 주관자와 작업자 간의 채널이 임시적이어야 하는 이유다. 또한, MPC contract를 배포하고 폐기하는 비용이 작업자에게 지급하는 통상적인 마이크로 페이먼트보다 상당히 작다.

디지털 서명

디지털 서명(Digital Signing)은 사인해야 할 메시지 요소들을 고정된 길이의 고유한 값으로 해싱한 후 송신자의 개인키를 사용해 메시지를 암호화하는 것이다.

일반적인 은행 수표에는 금액, 은행 정보, 송신자 정보, 수신자 정보, 수표 번호, 송신자의 시그너처(지급을 허가하는 고유한 시그너처)가 있다. 이와 일대일로 매핑되는 정보를 페이먼트 채널의 디지털 페이먼트 메시지도 가지고 있다.

스마트 컨트랙트의 주소로 은행 정보를 대체하고, 송신자 어카운트의 고유한 논스로 수표 번호를 대체했다. MPC의 마이크로 페이먼트 메시지는 이러한 모든 데이터 요소 또는 그것의 일부분을 가지고 있다. 전통적인 수표의 날짜는 브록체인 트랜잭션의 타임스탬프로 대체했다. 트랜잭션의 타임스탬프는 메시지의 생성 시간이 아니라, 블록체인에 기록한 시간이다. 이것이 은행 수표와 마이크로 페이먼트 메시지의 매우 중요한 차이점이다. 메시지에 다른 요소들을 추가해 안전성을 강화할 수도 있지만, 블록체인 과부하를 방지하기 위해 최소한의 데이터만을 저장하는 것이 좋다.

이 메시지로 디지털 서명을 만든다. 하나의 메시지 안에 몇 개의 아이템들을 패킹하고 있는지, 또는 각 메시지의 크기에 상관없이 메시지는 고유한 256비트의 값으로 해시한다. 디지털 서명 오퍼레이션은 이 해시값을 송신자의 개인키로 암호화한다. 메타마스크는 이 해시값을 안전하게 사인할 수 있도록 도와준다.

MPC 애플리케이션 개발(MPC-app)

Dapp의 오프체인 파트인 MPC-app을 개발해 보자. 통상적으로 여기에 UI도 있다.

  • 웹 애플레케이션을 Node.js 서버에 호스팅
  • UI를 가진 웹 스택
  • app.js가 블록체인 서비스를 다루는 web3를 호출해서 애플리케이션 로직을 결합

여러 오프체인 오퍼레이션(플라스틱 수거, 수집소에서 수거 상자를 확인하고, 주관자에게 통보, 주관자에 의한 마이크로 페이먼트 디지털 서명) 중에서 MPC-Dapp 예제에서 다룰 것은 오직 마이크로 페이먼트 디지털 서명 부분뿐이다. 주관자는 이후 지급 요청에서 검증될 마이크로 페이먼트에 대해 디지털 서명을 한다.

profile
무엇이 나를 살아있게 만드는가

0개의 댓글