Block_Chain_Project - 10 [텍스트 P2E게임] - Solidity 수정

Lumi·2022년 1월 28일
0

Block_Chain_Project

목록 보기
23/30
post-thumbnail

🔥 개요

일단 ERC-20토큰을 수정하는 부분까지는 완성을 하였습니다.

기존의 minting시스템 보다는

Token의 CA값에 Token의 양을 저장하고

Solidity를 통해서 토큰을 지급하는 형태로 바꾸었습니다.

  • 이게 좀더 Swap이라는 용어에 어울린다고 생각을 하였습니다.

아직까지는 유니스왑가 같은 알고리즘을 구현하지는 못하였습니다.

일단 현재에도 보안적인 이슈가 발생할수 있다고 생각을 하고 있으며 과한 수정은 걷잡을수 없을꺼 같아서...

그러기 떄문에 이 컨트랙트에서 코드를 수정하기 보다는 그냥 따른 컨트랙트를 만들어서 해당 컨트랙트에서 작동을 하기로 계획을 수정하였습니다.

🔥 Solidity

코드자체가 어렵지 않으니 수정하거나 추가한 부분에 대해서만 조금 다루어 보겠습니다.

🔨 Token.sol

 constructor(string memory TokenName_, string memory TokenSymbol_) {
        _name = TokenName_;
        _symbol = TokenSymbol_;
        _balances[address(this)] = Token_totalSupply;
    }

일단 기본적으로 모든 Token의 양을 CA주소에 할당하였습니다.

function transfer(
        address recipient,
        uint256 amount
    ) external virtual override returns (bool) {
        _transfer(address(this), recipient, amount);
        emit Transfer(address(this), recipient, amount);
        return true;
    }

    function transfer_Token_to_Ether(address seller, uint256 amount) external returns(bool){
        _transfer(seller, address(this), amount);

        emit Transfer(seller, address(this), amount);
        return true;
    }

그후 이더를 주고받는 모든 함수는 이 두가지 함수에서 일어나고

해당 CA주소에서 토큰 거래가 이루어 지게 됩니다.

  • 이 두가지 함수는 ETH를 통해서 Token이 교환이 이루어 지거나
  • 특수 상황에 Token이 지급이 될떄 작동을 합니다.
function transferfrom(address recipient, address sender, uint256 amount) external{
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(_balances[sender] >= amount,  "ERC20: transfer amount exceeds balance");

        _balances[sender] -= amount;
        _balances[recipient] += amount;
    }

이 함수는 기존에 사용하던 함수를 사용하기 편하게 수정을 하였습니다.

  • 그러다보니 보안적인 이슈가 발생을 한다고 생각을 합니다.
  • approve를 사용하지 않기 떄문에
  • 하지만 수정을 하지 않은 이유는 중간중간 수정을 하다보니 로직이 너무 꼬인다고 생각하기 떄문입니다.
  • 그러기 떄문에 기본적으로 우선 사용에 의미를 두고 있습니다.

이 함수는 Auction을 통해서 Token이 상호간에 거래를 지원하기 위해 사용하는 함수 입니다.

🔨 Character.sol

function buyTokens() public payable {
        require(msg.sender != address(0x0), "No Existed address");
        // 단위 계산이 wei로 들어오기 때문에 나눠준다.
        uint256 tokenAmount = msg.value / 100000000000;

        Gold_transfer(msg.sender, tokenAmount);

        address payable p_owner = payable(owner);
        p_owner.transfer(msg.value);

        emit TokenPurchased(msg.sender, tokenAmount, owner);
    }

    function sellTokens(uint256 value, address seller) public payable onlyowner {
        // 중앙화된 서버 객체가 실행 시켜야 한다
        // payable함수 이기 떄문에 eth를 함께 전송해 주어야 한다.
        // 값 계산은 back_end에서 이루어 지게 구성하였다.
        gold.transfer_Token_to_Ether(seller, value);
        // 단위를 eth로 전송을 할 것이기 떄문에 value에서 나눠준다.

        address payable p_owner = payable(seller);
        p_owner.transfer(msg.value);

        emit Token_Sell(msg.sender, msg.value, owner);
    }

이 함수는 기본적으로 ETH와 Token간에 Swap를 지원하는 함수 입니다.

일단 ETH를 통해서 Token을 구매하는 부분은 사용자가 직접 실행시켜 처리가 가능합니다.

  • 왜냐하면 사용자가 가지고 있는 ETH양을 네트워크에서 보관을 하고 잇기 떄문입니다.

하지만 반면에 Token을 사용해서 ETH를 구매하는 행위는 서버 계정이 실행을 시켜야 합니다.

  • 이 부분에서 좀 프로젝트 구성이 잘못되었다고 생각을 하고 있습니다.

문제점 인식

왜냐하면 일단 기본적으로 프로젝트에서 프론트에 보이는 부분은 DB에 있는 값이 보이고있고

트랜잭션 기록은 후에 node_shedule을 통해서 이루어 집니다.

그러다 보니 실제 DB에 기록된 내용과 블록체인에 기록된 내용은 같지 않고 그러다보니 실제로 가지고 있지 않는 값을 가지고 사용자가 Token을 ETH로 교환이 불가능 합니다.

서버가 처리를 해야 합니다.

  • require(gold.balanceOf(msg.sender > value)) 이런식의 조건문을 통해서 활용해야 한다고 생각하는데 불가능 합니다.
  • 사용자가 이 시점에 실제로 Token을 가지고 잇는 것이 아니기 떄문에

이부분은 어차피 DB에 기록되는 Token의 양이 후에 블록체인에 기록되는 토큰의 양과 같기 떄문에 DB의 값을 가지고 실제로 토큰이 그만큼 있는 지확인을 하고

바로 서버 계정을 통해 트랜잭션을 송출시키는 방향으로 로직을 구성하려고 합니다.

🔥 느낀점

기획을 잘해야 겠다는걸 뼈저리게 느끼고 있습니다.

기본적으로 어느정도 아이디어를 가지고 행하였지만

역시나 변수는 상당하게 존재하였고 그러다 보니 해당 변수를 수정하는데에 좀 시간이 소요하게 되었던거 같습니다..ㅠㅠ

유니스왑과 같은 유동성 풀은 일단 web3작업을 마무리하고 따로 작성을 하고 공부를 한뒤 기록을 하도록 하겟습니다.

감사합니다!

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

0개의 댓글