체인의정석

논문에 사용하는 컨트렉트 구조 및 스마트컨트렉트 0.8 버전으로 구현한 주요 구문 정리 (Travel Rule Solution Example.sol) 본문

블록체인/Solidity

논문에 사용하는 컨트렉트 구조 및 스마트컨트렉트 0.8 버전으로 구현한 주요 구문 정리 (Travel Rule Solution Example.sol)

체인의정석 2022. 5. 15. 05:37
728x90
반응형

일단 현재 구상해 놓은 컨트렉트의 구조이다.

초기 구조와 달라진점은 바로 관리하는 ID이다.

 

내가 적용시키려는 것은 NFT 자체이기 때문에, NFT중 하나의 extension 처럼 활용할 예정이다.

TravelRule extenstion 과 같은 느낌으로 작성할 에정이다.

 

그리고 그걸 관리하는 TravelRule Registry 이 모든 걸 바탕으로 모든 트레블룰 솔루션을 통괄하는 TravelRuleManager 까지 나누어서 구현하는것이 목표이다.

실제 프로덕트라면 많은 시간을 들여 구조를 잡아야 한다.

하지만 지금은 POC 형태의 논문 연구용 구현이므로 간단하게 구조를 짜고 논문으로 넘어간다.

 

이번에 정리할 내용은 예시로 사용할 트레블룰 솔루션에 대한 구현코드이다. 해당 코드의 경우 IVMS101 표준에 부합하게 설계를 하였으며, open VASP에서 컨트렉트를 사용하여 구현한 부분을 보고 테스트를 위해 비슷하게 구현한 코드이다. 

 

먼저 hash에 대한 컨트렉트 코드는 다음과 같다. 이건 사용할까 말까 고민을 하였는데, 아무리 예시여도 가스비가 너무 나올거 같긴해서 해시를 해서 데이터를 넣는것으로 구상하였다.

    function hash(bytes32 _bytes) public pure returns(bytes32) {
     return keccak256(abi.encodePacked(_bytes));
    }

    function hashArray(bytes32[] bytesArray) {
        bytes32 = result 
        for(uint i=0; i < bytesArray.length; i++) {
            hash(bytes[i])
        }
    }

해시를 하는 부분과 배열을 받아와서 요소들을 해시하는 부분에 대한 코드이다. hashArray의 경우 기본 틀만 잡아놓은 상태라 참고해서 완성을 마저 시켜야한다.

 

다음으로 구조체에 대한 업데이트 구문이다. 오랜만에 작성을 하다보니 공식 문서와 예제를 수차례 찾아보고 나서 구현할 수 있었다.

처음에는 고객코드만 넣어서 처리할까 싶었지만, 어차피 예시이기 때문에 논문에서 검증을 더 우선으로 둔 부분이라 데이터에 대한 구분을 모두 해둔 상황이다. 해당 구현의 경우 openVASP도 비슷한 방식으로 정보를 저장시키기 때문에 이와 비슷한 트레블룰 솔루션이라는 컨셉으로 예시코드를 짰다.

 

enum도 하나 들어가 있는데 , 오랜만에 사용하다보니 역시 예시 코드를 찾아서 넣었다.

여기서는 법인계정과 개인계정의 큰 분류를 담당한다. 사실 법인이든 개인이든 결국 법인도 담당자의 정보가 들어가도 인정이 되기 때문에 테스트 시 큰 상관은 없다고 볼 수 있다. 하나의 변수 정도로 생각하면 된다.

    enum UserType { NATURAL, LEGAL }


	struct UserInfo {
        bytes32 userCode;
        UserType userType;
        bytes32 name;
        bytes32 nameID;
        bytes32 user_address;
        bytes32 datesAndPlacOfBirth;
        bytes32 NationalIdentification;
    }

    function updateInfo (
        address userAddress,
        bytes32 _userCode,
        UserType _userType,
        bytes32 _name,
        bytes32 _nameID,
        bytes32 _user_address,
        bytes32 _datesAndPlacOfBirth,
        bytes32 _nationalIdentification
    ) 
    public onlyOwner {
        
        UserInfo memory userInfo;
        userInfo.userCode = _userCode;
        userInfo.userType = _userType;
        userInfo.name = _name;
        userInfo.nameID = _nameID;
        userInfo.user_address = _user_address;
        userInfo.datesAndPlacOfBirth = _datesAndPlacOfBirth;
        userInfo.NationalIdentification = _nationalIdentification;

        UserInformation[userAddress] = userInfo;
    }

참고로 구조체에 대한 데이터가 들어가는 배열의 자료형은 아래와 같이 만들었다.

    mapping (address => UserInfo) private UserInformation;

테스트 시 일일히 다 넣어주어야 하는 불편함은 있지만 해당 데이터의 경우 

https://blog.naver.com/dmsrlgusrl/222732913176

 

공학논문 작성 등에 사용할 가짜 고객 데이터 만드는 법! (이더리움/비트코인 주소까지 생성 가

안녕하세요 체인의 정석입니다. 현재 저는 NFT에 트레블룰을 적용하는 논문을 작성중인데요. 오늘의 주...

blog.naver.com

여기에 언급한 사이트를 사용할 예정이다.

 

 

728x90
반응형
Comments