Block_Chain_Project - 8 [텍스트 P2E게임] - 스왑기능

Lumi·2022년 1월 22일
0

Block_Chain_Project

목록 보기
21/30
post-thumbnail

🔥 개요

별다른 코드적인 작업은 하지 않았고 앞으로 어떤 기능을 추가해야 할지 어떻게 오류를 잡아야 할지에 대해서 고민을 해보는 시간이 있었습니다.

사실상 트랜잭션이 실패해도 서버가 계속 돌아가려면 try-catch를 통해서 작동 시키면 되지만

이전에 실패했던 트랜잭션을 다시 성공시켜야 하기 떄문에 이 부분에 대해서 정확한 방법은 생각하지 못했습니다.

마찬가지로 화이트 리스트 부분에 대해서도 공부만 하고 있는 상황이지 어떤 방식으로 사용해야 할지가 떠오르지 않습니다...ㅠㅠ

그래서 이러한 부분에 대해서는 계속해서 공부를 해나갈 것입니다.

부수적으로는 스왑에 대하여 생각을 해보았습니다.

컨트랙트 자체를 DAO형식으로 생각하여 구성을 하였기 떄문에 직접적으로 프로젝트에 적용할수 있을지는 모르겠지만

DAO형식으로도 작성을 할수 있다는 점에 주목을 하고 싶었습니다.

Token

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

contract Token {
    string  public name = "DApp Token";
    string  public symbol = "DAPP";
    uint256 public totalSupply = 1000000000000000000000000; // 1 million tokens
    uint8   public decimals = 18;
    address  public owner;

    event Transfer(
        address indexed _from,
        address indexed _to,
        uint256 _value
    );

    event Approval(
        address indexed _owner,
        address indexed _spender,
        uint256 _value
    );

    mapping(address => uint256) public balanceOf;
    mapping(address => mapping(address => uint256)) public allowance;

    constructor()  {
        owner = msg.sender;
        balanceOf[owner] = totalSupply;
    }

    function transfer(address _to, uint256 _value) public returns (bool success) {
        require(balanceOf[owner] >= _value);
        balanceOf[owner] -= _value;
        balanceOf[_to] += _value;

        emit Transfer(owner, _to, _value);
        return true;
   }

    function approve(address _spender, uint256 _value) public returns (bool success) {
        allowance[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        require(_value <= balanceOf[_from]);
        require(_value <= allowance[_from][msg.sender]);
        balanceOf[_from] -= _value;
        balanceOf[_to] += _value;
        allowance[_from][msg.sender] -= _value;
        emit Transfer(_from, _to, _value);
        return true;
    }

    function showOwner () public view returns(address){
        return owner;
    }

    
}

Swap

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

import "./Token.sol";

contract EthSwap {
  string public name = "EthSwap Instant Exchange";
  Token public token;
  uint public rate = 100;


  event TokenPurchased(
    address account,
    address token,
    uint amount,
    uint rate
  );

  constructor(Token _token)  {
    token = _token;

  }

  function buyTokens() public payable {
    // Calculate the number of tokens to buy
    uint tokenAmount = msg.value * rate;
    // Require that EthSwap has enough tokens
    require(token.balanceOf(token.showOwner()) >= tokenAmount);
    // Transfer tokens to the user
    token.transfer(msg.sender, tokenAmount);
    address payable p_owner = payable(token.showOwner());
    p_owner.transfer(msg.value);
    // Emit an event
    emit TokenPurchased(msg.sender, address(token), tokenAmount, rate);
  }
}

유니스왑의 경우에는 고정적인 상수값을 통해서 가격을 유지하지만 저는 아직 그러한 방법은 확실하게 알지 못하여 일단 고정적으로 토큰을 변화시키는 방향으로 잡았습니다.

판매 기능은 따로 제공을 하지 않습니다.

  • 음.. 토큰 이코노미와는 굉장히 어울리지 않는 상황이지만
  • 개인적으로 아직 판매 기능을 구현하는데에 어려움이 있고
  • 저희의 목표는 게임에 현질을 구상하여 솔리디티를 짜보았기 떄문입니다.
  • 물론 구현을 해보도록 노력을 해볼 것 입니다.

저희의 프로젝트에 기능을 제공하기 위해서는 일단 인자값들을 수정해야 합니다.

  • 해당 컨트랙트는 DAo의 형태이기 떄문에
  • 중앙화가 되어있는 저희의 프로젝트에서는 해당 컨트랙트 만으로 적용하기는 힘들다고 생각합니다.

🔥 후기 및 느낀점

사실 초기 프로젝트 구상 자체는 DAO의 형태를 생각하였습니다.

제가 블록체인을 좋아하는 이유가 제 3자가 없다는 이유로 인해서 신뢰있는 네트워크를 구축한다는 의미에서 좋아하였는데

게임을 플레이하는 유저 입장에서 생각해보면 트랜잭션이 검증되는 데에 많은 시간이 소요되고 기다리는것은 좋은 경험을 주지는 못할껏 같아서

중앙화되어있는 프로젝트가 구성이 되었습니다.

  • 프로젝트를 진행하면서도 클레이튼 쓸껄 쓸걸 이생각을 많이 하였습니다...

얼추 인자값들을 수정한뒤에 적용이 되면 그떄 부수적으로 다루어 보도록 하겠습니다.

  • 사실 프로젝트는 거의다 마무리가 되었습니다
profile
[기술 블로그가 아닌 하루하루 기록용 블로그]

0개의 댓글