Block_Chain_Project - 4 [ERC-20, ERC-721거래]

Lumi·2021년 12월 30일
0

Block_Chain_Project

목록 보기
10/30
post-thumbnail

github :https://github.com/codestates/BEB_01_WhyDoesItWork/tree/hojin

  • 들어가지지 않는다면 아직 프로젝트 기간이 끝나지 않았다는 것을 의미합니다!

🔥 문제점 해결

정말 간단한 문제였습니다.

일단 코드상의 문제는 하나도 없었습니다.

사용한 코드

const account = await web3.eth.accounts.create();
  console.log(account.address);

  console.log("mintToken");

  let tx = await web3.eth.accounts.signTransaction(
    {
      from: adminAddress,
      to: ERC_20_CA,
      gas: 500000,
      data: TokenContract.methods
        .mintToken(account.address, 1000000000000000)
        .encodeABI(),
    },
    adminPri
  );
  let tran = await web3.eth.sendSignedTransaction(
    tx.rawTransaction,
    (err, hash) => {
      if (!err) console.log(hash);
      else console.log(err);
    }
  );

  console.log("mint_Token성공");
  • 테스트용으로 따로 작성한 코드 입니다.

만들어진 계정에 트랜잭션을 토큰을 minting하는 코드로 작성을 하였습니다.

이떄 제가 안되던 부분은 바로 gas의 설정입니다.

제가 오류가 발생했던 이유는 바로 gas비를 너무 적게 주었기 떄문입니다...

  • 정말 단순한 문제였습니다..ㅠㅠ

이상으로 문제를 해결하였으니 이제 본격적으로 프로젝트를 꾸며보도록 하겠습니다.

제가 생각한 로직은 이와 같습니다.

정말 간단합니다.

하지만 서버의 과부화를 막기위해서 배치서버를 구성을 해보고자 합니다.

처음해보는 작업이기 때문에 성공적으로 구성할수 있을지는 모르겠지만.. 최대한 해보고자 합니다.

저희의 프로젝트가 굳이 배치서버를 구성을 할 필요는 없습니다.

  • 트랜잭션이 몰릴떄를 대비하여 만드는 서버를 배치서버라고 합니다.
  • 하지만 저희는 개인적은 프로젝트이기 떄문에 굳이 할 필요는 없습니다.

그래서 할수 있으면 하고 아니면 공부를 하자는 식으로 접근을 하고 있습니다

다음 블로그에서는 이제 전반적인 코드 설명을 해볼것 입니다!! 감사합니다!

🔥 문제점 발견 - 솔리디티 코드

하나를 해결하니.. 또 바로 문제가 발생을 하였습니다.

이번에는 솔리디티 코드의 구조적인 문제였습니다.

로직 자체가 서버에 토큰을 민팅해 준뒤 서버를 통해서 작동이 이루어 집니다.

단순히 토큰을 transferFrom으로 거래하는 것은 문제가 되지 않습니다.

하지만 문제는 NFT를 만드는 코드에서 발생을 합니다.

일단 ERC-20 토큰 거래가 문제가 없는 이유는 토큰을 발행할떄 _approve를 통해서 _allowance[서버][실행자]로 구성이 되기 떄문입니다.

function transferFrom( address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");

            _approve(sender, _msgSender(), currentAllowance - amount);

        return true;
}

이후 require문을 통해서 _allowance[서버][실행자]를 검증하기 떄문에 문제 없이 전송이 이루어 지는 것 입니다.

하지만 NFT를 만드는 코드에서는

token.transferFrom(recipient, msg.sender, nftPrice);

이렇게 인자가 전달이 되며 이는 결국 _allowance[사용자][실행자]를 검증하는 로직이 됩니다.

최초 approve를 통해서 따로 등록을 해주려고 했지만

approve는 msg.sender를 사용하기 떄문에 어떤 방법으로도 _allowance[실행자][사용자] 구조에서 벗어날 수가 없습니다.

이러한 부분을 해결하기 위해서 고민을 해보는 시간을 가져볼꺼 같습니다.

갑자기 말썽을 부리니... 혼자서 작업을 하는 것이 많이 어렵기는 하군요 ㅠ

🔥 문제점 해결 - 솔리디티 코드

저는 서버를 통해서 토큰을 transferFrom해주려고 했습니다. 하지만 서버를 통해서 _allowance를 구축하면 도저히 해결 방법이 생각이 나지 않았습니다..ㅠㅠ

그러기 떄문에 코드 자체를 조금 수정을 하였습니다.

  • 사실 코드 자체가 완벽한데 내가 잘못사용하고 있구나 라는 생각이 박혀 있어서 해결하는데에 오랜 시간이 걸렸습니다.

    전반적으로 어떻게 로직이 이루어 지는지를 알아보겠습니다.

일단 transferFrom을 사용하지 않는것으로 진행을 해보았습니다.

특정 서버 계정을 두어서 그 계정에서 TransferFrom으로는 해결을 할수 없다고 생각을 하였기 때문에 배포자를 통해서 사용자마다 모두 mintToken을 해주자는 방식으로 접근을 하였습니다.

  • 다른분의 의견을 참고하였습니다.

또한 _approve 의 인자로 msg.sender가 아닌 NFTCA의 값을 넘겨 주었습니다.

그럼 사진에서 보이는바와 같이 사용자마다 저러한 구조를 가지고 있는 _allowance가 만들어질 것 입니다.

그후 mintNFT를 할떄에는 인자로 사용자,배포자,가격 을 넘겨주게 됩니다.

이떄 굉장히 중요한 부분이 있습니다.

mintNFT함수를 실행할떄의 msg.sender는 배포자가 맞지만

transferFrom입장에서는 msg.sender는 CA가 됩니다.

  • 즉 함수 자체를 실행시키는 것은 배포자이지만 함수 내의 함수를 실행시키는 것은 CA입니다.

그러면 mintNFT함수 내에서의 검증은 _allowance[사용자][CA]를 통해서 이루어 지게 되며

이는 최초 mintToken할떄에 구성을 해놓았기 떄문에 문제 없이 NFT생성이 완료가 됩니다.

🔥 후기

혼자서 작업을 하는 것이 많이 힘든것 같습니다... 처음에는 3명의 팀에서 시작을 하엿지만 한분은 갑자기 말도 없이 나가버리셨고...ㅠㅠ 공부하자는 방식으로 개인적인 프로젝트를 진행하자는 합의가 맞아서 개인적으로 진행을 해보고 있습니다.

많이 꼬이는 많큼 그래도 많이 배우는 시간을 가지고 있는것 같습니다 감사합니다.

profile
[기술 블로그가 아닌 하루하루 기록용 블로그]

0개의 댓글