이더리움으로 자신만의 토큰 만들기 #5

in kr •  6 years ago  (edited)

벌써 5번째 업로드입니다~ 이번에는 수수료와 마이닝 관련 내용이네요ㅎ
수수료 부분에서는 토큰을 받는 사람이 수수료를 지불하도록 만드는 방법도 있다니 ㅋㅋㅋㅋ 물론 아직 테스트는 안해봤습니다^^

(본문에 있는 코드는 혹시 모르니 이더리움 홈페이지에서 복사 하는걸 추천 드려요)

원제 : Create your own CRYPTO-CURRENCY with Ethereum
출처 : https://ethereum.org/token

5lJi5beb.jpg

AUTOMATIC SELLING AND BUYING

지금까지 유틸리티와 신뢰를 토대로 가치를 평가했습니다.
그러나 원하는 경우 자동으로 판매하고 시장 가치로 구매하는 펀드를 만들어서 토큰의 가치를 이더(또는 다른 토큰)가 뒷받침하도록 만들 수 있습니다.
먼저 구매 및 판매 가격을 설정해 보겠습니다.

...................................................................................................

uint256 public sellPrice;
uint256 public buyPrice;

function setPrices(uint256 newSellPrice, uint256 newBuyPrice) onlyOwner {
    sellPrice = newSellPrice;
    buyPrice = newBuyPrice;
}

...................................................................................................

이것은 새로운 가격 변경이 거래를 실행하고 약간의 이더를 소비해야하기 때문에 자주 변경되지 않는 가격에 적용됩니다. 변동 가격을 일정하게 유지하려면 standard data feeds(https://github.com/ethereum/wiki/wiki/Standardized_Contract_APIs#data-feeds)를 조사하는 것이 좋습니다.
다음 단계는 구매 및 판매 기능을 만드는 것입니다.

...................................................................................................

functionbuy() payablereturns (uint amount){
    amount = msg.value / buyPrice;                    // calculates the amount
    _transfer(this, msg.sender, amount);
    return amount;
}

functionsell(uint amount) returns (uint revenue){
    require(balanceOf[msg.sender] >= amount);         // checks if the sender has enough to sell
    balanceOf[this] += amount;                        // adds the amount to owner's balance
    balanceOf[msg.sender] -= amount;                  // subtracts the amount from seller's balance
    revenue = amount * sellPrice;
    msg.sender.transfer(revenue);                     // sends ether to the seller: it's important to do this last to prevent recursion attacks
    Transfer(msg.sender, this, amount);               // executes an event reflecting on the change
    return revenue;                                   // ends function and returns
}

...................................................................................................

이것은 새로운 토큰을 생성하지는 않지만 계약이 소유하는 잔액을 변경함을 주목하십시오.
이 계약은 자체 토큰과 이더 및 계약 소유자를 둘 다 보유 할 수 있지만 가격을 설정하거나 경우에 따라 은행의 토큰 또는 이더를 만질 수없는 새로운 토큰(해당되는 경우)을 만들 수 있습니다.
이 계약이 자금을 이동할 수 있는 유일한 방법은 그것들을 판매하고 구매하는 것입니다.

Note

"가격"은 이더에서는 설정되지 않지만 wei에서는 시스템의 최소 통화 (유로 및 달러의 센트 또는 Bitcoin의 Satoshi와 동일)로 설정됩니다.
1 ETH는 1000000000000000000 wei입니다.
따라서 이더에서 토큰 가격을 설정할 때 마지막에 18 개의 0을 추가하십시오.
계약서를 작성할 때 시장에 있는 모든 토큰을 다시 구매할 수 있도록 충분한 Ether을 보내야합니다. 그렇지 않으면 계약이 파산하여 사용자가 토큰을 판매 할 수 없게 됩니다.
이전 예제는 물론 단일 중앙 구매자와 판매자와의 계약을 설명했지만, 훨씬 더 흥미로운 계약은 누구나 다른 가격을 입찰 할 수 있는 시장을 허용하거나 아니면 외부 소스에서 가격을 직접로드 할 수 있게 합니다.

AUTOREFILL

Ethereum에서 거래를 할 때마다 스마트 계약의 결과를 계산할 블록 채굴자에게 수수료를 지불해야합니다.
이것은 미래에 변경 될 수 있지만(https://github.com/ethereum/EIPs/issues/28), 순간적으로 수수료는 이더로만 지불 될 수 있으므로 당신의 토큰을 사용하는 모든 사용자는 이를 필요로 합니다. 수수료보다 잔액(이더)이 적은 계정의 토큰은 소유자가 필요한 수수료를 지불 할 수 있을 때까지 붙어 있습니다.
그러나 일부 사용 케이스에서는 사용자가 Ethereum에 대해 (블록체인이나 어떻게 이더를 얻을지)생각하기를 원하지 않을 수도 있습니다. 그래서 가능한 한 가지 접근법은 잔액이 위험 할 정도로 낮으면 동전이 자동으로 사용자의 잔액을 보충 하도록 합니다. 이를 위해서, 먼저 임계값을 유지할 변수와 이를 변경하는 함수를 만들어야합니다. 값을 모르는 경우 5 finney (0.005 에테르)로 설정하십시오.

...................................................................................................

uintpublic minBalanceForAccounts;

function setMinBalance(uint minimumBalanceInFinney) onlyOwner {
     minBalanceForAccounts = minimumBalanceInFinney * 1 finney;
}

...................................................................................................

그런 다음이 함수를 전송 함수에 추가하여 보낸 사람을 환불합니다.

...................................................................................................

/* Send coins */
functiontransfer(address _to, uint256 _value) {
    ...
    if(msg.sender.balance < minBalanceForAccounts)
        sell((minBalanceForAccounts - msg.sender.balance) / sellPrice);
}

...................................................................................................

대신 발신자가 수신자에게 요금을 지불하도록 변경할 수도 있습니다.

...................................................................................................

/* Send coins */
function transfer(address _to, uint256 _value){
    ...
    if(_to.balance<minBalanceForAccounts)
        _to.send(sell((minBalanceForAccounts - _to.balance) / sellPrice));
}

...................................................................................................

이것은 토큰을 받는 어떤 계좌도 수수료를 지불하는데 필요한 이더 보다 적지 않도록 보장합니다.

PROOF OF WORK

코인공급을 수학 공식에 묶는 방법에는 몇 가지가 있습니다.
가장 간단한 방법 중 하나는 Ether과 함께 "merged mining"으로 만드는 것이고, 그 의미는 Ethereum에서 블록을 발견 한 사람은 누구든지 해당 블록에서 보상 기능을 호출하면 동전에서 보상을 받게 됩니다.
블록을 찾은 채굴자를 지칭하는 특수 키워드 coinbase(https://solidity.readthedocs.io/en/latest/units-and-global-variables.html#block-and-transaction-properties)를 사용하여 이를 수행 할 수 있습니다.

...................................................................................................

functiongiveBlockReward() {
    balanceOf[block.coinbase] += 1;
}

...................................................................................................

또한 수학 공식을 추가하여 수학을 할 수 있는 사람이라면 누구나 보상을 받을 수 있습니다.
다음 예제에서는 현재 도전의 세제곱근을 계산해야하고 다음 도전을 설정할 수 있는 권한을 얻습니다.

...................................................................................................

uintpublic currentChallenge = 1; // Can you figure out the cubic root of this number?

function rewardMathGeniuses(uint answerToCurrentReward, uint nextChallenge) {
    require(answerToCurrentReward**3 == currentChallenge); // If answer is wrong do not continue
    balanceOf[msg.sender] += 1;         // Reward the player
    currentChallenge = nextChallenge;   // Set the next challenge
}

...................................................................................................

물론, 세제곱근을 계산하는 것은 누군가가 머리에하기가 어려울 수 있지만, 계산기로는 매우 쉽습니다. 따라서 이 게임은 컴퓨터로 쉽게 깨질 수 있습니다. 또한 마지막 우승자는 다음 도전 과제를 선택할 수 있기 때문에 그들이 알고 있는 과제를 골라 낼 수 있으므로 다른 플레이어에게는 매우 공정한 게임이 아닙니다. 인간에게 쉬운 작업이지만 컴퓨터에게는 어려운 작업이 있습니다. 하지만 대개 이러한 간단한 스크립트로 작성하는 것은 매우 어렵습니다. 대신, 더 공정한 시스템은 컴퓨터가 수행하기가 매우 어려운 시스템이어야하지만 컴퓨터가 검증하는 것은 그리 어렵지 않습니다. 훌륭한 후보자는 도전자가 여러 개의 숫자로 부터 주어진 난이도 보다 낮은 하나를 찾을 때까지 해시를 생성해야 하는 해시 챌린지를 만드는 것입니다.

이 프로세스는 1997년 Adam Back에 의해 Hashcash(https://en.wikipedia.org/wiki/Hashcash)로 처음 제안 된 후 2008년에 Satoshi Nakamoto의 Bitcoin에서 구현되었습니다. Ethereum은 보안 모델을 위해 그러한 시스템을 사용하여 시작되었지만 작업 증명 보안 모델에서 Casper(https://blog.ethereum.org/2015/12/28/understanding-serenity-part-2-casper/)라는 지분 및 베팅 시스템의 혼합 증명으로 전환 할 계획입니다. 그러나 해싱을 코인의 무작위 발행 형태로 좋아하는 사람이라면, 작업 증명서 발행이 있는 자신의 Ethereum 기반 통화를 만들 수 있습니다.

...................................................................................................

bytes32 public currentChallenge;                         // The coin starts with a challenge
uintpublic timeOfLastProof;                             // Variable to keep track of when rewards were given
uintpublic difficulty = 10**32;                         // Difficulty starts reasonably low

function proofOfWork(uint nonce){
    bytes8 n = bytes8(sha3(nonce, currentChallenge));    // Generate a random hash based on input
    require(n >= bytes8(difficulty));                   // Check if it's under the difficulty

    uint timeSinceLastProof = (now - timeOfLastProof);  // Calculate time since last reward was given
    require(timeSinceLastProof >=  5 seconds);         // Rewards cannot be given too quickly
    balanceOf[msg.sender] += timeSinceLastProof / 60 seconds;  // The reward to the winner grows by the minute

    difficulty = difficulty * 10 minutes / timeSinceLastProof + 1;  // Adjusts the difficulty

    timeOfLastProof = now;                              // Reset the counter
    currentChallenge = sha3(nonce, currentChallenge, block.blockhash(block.number - 1));  // Save a hash that will be used as the next proof
}

...................................................................................................

또한 Constructor function (처음 업로드 시, 호출되는 계약과 동일한 이름을 가진)을 변경하여 이 행을 추가하면,
난이도 조정은 미치지(crazy) 않을 것입니다.

...................................................................................................

timeOfLastProof = now;

...................................................................................................

계약서가 온라인 상태가 되면 "작업 증명"기능을 선택하고 nonce field에 원하는 번호를 추가하여 실행하십시오.
확인 창이 "Data can't be execute"라는 빨간색 경고 메시지가 나타나면 거래가 진행될 때까지 다른 번호를 선택 하십시오. 이 프로세스는 임의적입니다. 하나를 찾으면 마지막 보상이 주어 졌으므로 매 순간마다 1 토큰을 받게 됩니다. 그리고 챌린지 난이도는 보상 당 평균 10 분을 목표로 위아래로 조정됩니다.

보상을 제공하는 번호를 찾으려는 이 프로세스는 ‘마이닝’이라고 하는 것입니다. 난이도가 높아지면 행운의 숫자를 찾는 것이 매우 어려울 수 있지만, 발견 한 것을 확인하는 것은 언제나 쉽습니다.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!