별다른 코드적인 작업은 하지 않았고 앞으로 어떤 기능을 추가해야 할지 어떻게 오류를 잡아야 할지에 대해서 고민을 해보는 시간이 있었습니다.
사실상 트랜잭션이 실패해도 서버가 계속 돌아가려면 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의 형태를 생각하였습니다.
제가 블록체인을 좋아하는 이유가 제 3자가 없다는 이유로 인해서 신뢰있는 네트워크를 구축한다는 의미에서 좋아하였는데
게임을 플레이하는 유저 입장에서 생각해보면 트랜잭션이 검증되는 데에 많은 시간이 소요되고 기다리는것은 좋은 경험을 주지는 못할껏 같아서
중앙화되어있는 프로젝트가 구성이 되었습니다.
얼추 인자값들을 수정한뒤에 적용이 되면 그떄 부수적으로 다루어 보도록 하겠습니다.