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가 됩니다.
그러면 mintNFT함수 내에서의 검증은 _allowance[사용자][CA]
를 통해서 이루어 지게 되며
이는 최초 mintToken
할떄에 구성을 해놓았기 떄문에 문제 없이 NFT생성이 완료가 됩니다.
혼자서 작업을 하는 것이 많이 힘든것 같습니다... 처음에는 3명의 팀에서 시작을 하엿지만 한분은 갑자기 말도 없이 나가버리셨고...ㅠㅠ 공부하자는 방식으로 개인적인 프로젝트를 진행하자는 합의가 맞아서 개인적으로 진행을 해보고 있습니다.
많이 꼬이는 많큼 그래도 많이 배우는 시간을 가지고 있는것 같습니다 감사합니다.