[초보] 스마트컨트랙 외부 접근 차단

안녕하세요. 현재 기초적인 민팅 코드를 클레이튼 IDE를 이용해서 배포하였습니다.

contract Test is KIP17Full, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    constructor() public KIP17Full("test", "ttt") {}

    function mintNFT(string memory tokenURI)
        public
        onlyOwner
        returns (uint256)
    {
        _tokenIds.increment();

        uint256 newItemId = _tokenIds.current();
        _mint(msg.sender, newItemId);
        _setTokenURI(newItemId, tokenURI);

        return newItemId;
    }

}

이런식으로 배포를 하였는데 공부를 하다보니 해당 컨트랙트를 외부의 누구든 사용할수 있다고하네요…
가스비를 제가 대납할 예정인데 이렇게 되면 누구든지 제 컨트랙트를 이용하여 민팅을 시도하고 가스비를 제가 대납하게되버리는데 보통 이를 막는 방법이 따로 있나요?

onlyOwer는 제거하여 외부에서 접근을 막을려하였지만 이렇게되면
민팅 버튼을 누르면 연결된 klip주소로 민팅을 할 예정이였는데 해당 유저들이 컨트랙트를 실행할수가 없으니까 고민입니다.

요약하자면

  1. 스마트 컨트랙의 외부 접근 차단
  2. 1번의 내용이 사실이맞는지
  3. 만약 맞다면 외부에서 해당 컨트랙트를 이용하여 NFT를 해당 발행자로 무분별한 민팅이 가능해지는데 이를 막는방법은?

이제막 공부 시작한 학생입니다… 미리 답변감사합니다.

안녕하세요, 네 우선 ownership이 없다면 해당 컨트랙트의 인터페이스와 주소를 안다면 누구나 해당 함수를 실행할 수 있습니다. 하지만, 함수를 실행하는 것과 실제 NFT를 발행하는 것은 별개의 문제입니다. 예를 들어, 발행 함수 내에서 whitelist를 관리하거나 기타 NFT를 발생할 수 있는 조건을 설정하실 수 있습니다.

걱정하시는 부분은 대납이실 것 같은데요, 아시다시피 대납기능은 컨트랙트에서 설정하는 것이 아닌 유저가 먼저 대납 트랜잭션을 사인하고, 해당 트랜잭션을 Q100님의 대납 계정으로 다시 사인하여야 정상적으로 반영이 됩니다. 이 뜻은, 아무나 함수를 실핼하여 트랜잭션을 만들 순 있겠지만 이를 Q100님의 private key로 사인하지 않으면 된다는 뜻입니다. (대납을 위한 사인을 하는 부분은 다른 서버에 구현되어 있을테니 그곳에서 관리할 수 있을 것 입니다.)

정리하자면,

  1. onlyOwner등 오너쉽 관리를 하지 않는다면 컨트랙트의 정보를 아는 누구나 함수를 실행할 수 있다.
  2. 하지만 NFT 민팅 자체는 조건 설정을 통해 원하는 유저에게만 하도록 할 수 있다.
  3. 대납 기능은 Q100님의 대납 계정으로 따로 서명해주지 않는 이상 단순한 함수 실행으로는 아무도 사용할 수 없다.

컨트랙트 함수의 실행 자체는 누구나 실행할 수 있고, 큰 문제가 없습니다. NFT 민팅의 조건을 원하는 대로 설정하셔서 사용하시면 됩니다. 더 질문있으시면 말씀주세요.

감사합니다.