안녕하세요. 블록체인 개발자 최재필입니다.
이전 포스트에 이어서 이번에는 "탈중앙화된 개인간 중고 물품 거래"를 위한 스마트 컨트랙트 예제에 대해서 다루어 보도록 하겠습니다.
개인 간에 중개자가 없는 탈중앙화된 중고 거래가 가능하려면 우선 상호간에 신뢰할 수 있는 동등하고 안전한 거래가 가능해야 할 것입니다. 이를 위해서 스마트 컨트랙트의 거래는 다음과 같이 제안(Propose)-승인(Approve)-확정(Finalize)의 3단계를 거쳐서 거래가 이루어지면 될 것 같습니다.
- 판매자가 스토어(Store) 컨트랙트에 가격을 정하여 물품(Item)을 등록합니다.
- 구매자는 스토어에서 원하는 물품을 발견하면, 해당 물품에 대해서 주문(Order) 컨트랙트에 구매 제안을 합니다. 물론 사전에 주문 컨트랙트에 그 가격만큼 ICON 토큰(ICX)을 예치해 놓아하고, 제안한 토큰은 거래가 확정 또는 취소되기 전까지 아무도 인출할 수 없도록 묶이게 됩니다. 구매자는 판매자의 승인 전에는 구매 제안을 취소(Cancel)할 수 있습니다.
- 판매자는 제안을 받으면 수락(Accept) 또는 거절(Reject)을 결정하여 승인합니다. 수락 후에 물품을 구매자에게 배송합니다. 물론 거절을 하면 거래는 취소가 됩니다.
- 구매자는 물품을 수령하면 확정(Finalize)을 합니다. 이때 묶여있던 토큰이 판매자의 주문 컨트랙트 계좌로 이체됩니다. 판매자는 원할 때 언제든지, 주문 계좌로 부터 개인 지갑으로 토큰을 인출(Withdraw) 할 수 있습니다.
일단, 이 정도면 중개자 없이도 어느 정도 안전한 거래가 될 것 같습니다. 하지만, 만일 판매자가 수락하고 나서 물품을 보내지 않는다면 어떨까요? 판매자는 안 팔면 그만이지만, 구매자는 토큰이 묶여 있으니 불리한 상황이 됩니다. 따라서, 구매자와 동등한 조건을 만들려면, 3번 단계에서 판매자 역시 물품의 가격 만큼 토큰을 예치하고, 승인시 판매자의 토큰도 함께 묶여야 합니다. 그렇게 되면 판매자가 승인 후 물품을 보내지 않거나, 구매자가 물품을 수령하고도 확정을 하지 않는 사태를 방지하게 됩니다.
전반적인 흐름에 대해서는 설명을 드렸으니, 이제 좀 더 구체화 해보겠습니다. 빠른 이해를 돕기 위해 아래와 같이 모듈 뷰를 작성해 보았습니다.
이전 포스트에서 설명되었던 것처럼, 로직을 담당하는 컨트랙트(Logic Contract)와 상태를 관리하는 컨트랙트(Proxy Contract)를 분리하는 방식을 사용했습니다. 사용자는 주문 컨트랙트(UcOrderAgentProxy)와 스토어 컨트랙트(UcStoreAgentProxy)를 사용하게 되고, 이 프록시 컨트랙트들은 각각의 로직 컨트랙트(UcOrderAgent, UcStoreAgent)에게 처리 로직만 위임합니다.
전체 예제 및 테스트 코드는 아래 깃허브 링크를 참조하시면 됩니다. 노파심에 다시 말씀 드리면, ICON의 Audit을 받은 코드가 아니므로 참고용으로 사용해주세요. 그리고, json import하는 부분도 향후 정식으로 지원되면 수정 필요합니다.
다음은 주문 승인 후 의도치 않게 배송 중 물품이 분실 되거나, 하자 발생으로 반품 처리 등 "문제 해결까지 가능한 중고 거래 스마트 컨트랙트"에 대해서 공유할 예정입니다.
Congratulations @jeffry82! You received a personal award!
You can view your badges on your Steem Board and compare to others on the Steem Ranking
Vote for @Steemitboard as a witness to get one more award and increased upvotes!