이더리움으로 자신만의 토큰 만들기 #5
벌써 5번째 업로드입니다~ 이번에는 수수료와 마이닝 관련 내용이네요ㅎ
수수료 부분에서는 토큰을 받는 사람이 수수료를 지불하도록 만드는 방법도 있다니 ㅋㅋㅋㅋ 물론 아직 테스트는 안해봤습니다^^
(본문에 있는 코드는 혹시 모르니 이더리움 홈페이지에서 복사 하는걸 추천 드려요)
원제 : Create your own CRYPTO-CURRENCY with Ethereum
출처 : https://ethereum.org/token
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 분을 목표로 위아래로 조정됩니다.
보상을 제공하는 번호를 찾으려는 이 프로세스는 ‘마이닝’이라고 하는 것입니다. 난이도가 높아지면 행운의 숫자를 찾는 것이 매우 어려울 수 있지만, 발견 한 것을 확인하는 것은 언제나 쉽습니다.
음.. 글이라는 것이 길이를 조절하기 나름이겠지만,
eos 토큰 만드는 것은 한페이지 정도로 간단했던 것 같은데,
eth 토큰 만드는 것은 5 페이지를 넘어가는군요.
그래서 eos 가 eth 킬러 라고 내세우는 것인지.. ??
smt 는 더 편할 것이라는 주장을 하고는 있는 것 같은데,
과연 일정대로 나올지 의문이네요.
이미 제가 처음 본 일정이 2018.03 정도라고 했던 것 같은데, ??
2019.03 으로 공식 일정이 나온듯 ?
아직 잘 모르지만, 얼핏 몇개월 접한 느낌이,
ned 와 vitalik 은 말 뿐이고, ??
dan larimer 가 진정 실력자인 듯.. ??
예전에 다른분이 요청해주신게 있어서 EOS 토큰 만들기도 번역해 볼 예정 입니다.
@steamsteem님 께서도 EOS 말씀을 하셔서 홈페이지(https://developers.eos.io/eosio-cpp/docs/quick-start-token)에 들어가봤더니 토큰 만들기 보기 전에 C언어부터 공부해야 될지도 모르겠더군요;;;
https://steemit.com/kr/@elysia/re-steamsteem-re-elysia-5-20180829t122449483z
"예전에 다른분이 요청해주신게 있어서 EOS 토큰 만들기도 번역해 볼 예정 입니다.
@steamsteem님 께서도 EOS 말씀을 하셔서 홈페이지에 들어가봤더니 토큰 만들기 보기 전에 C언어부터 공부해야 될지도 모르겠더군요;;;
SMT는 어떤게 편하다는 건지 모르겠습니다. SMT 기반의 토큰 제작이 편하다는 건지 사용하기가 편하다는건지...."
아마 수정하시기 전의 글을 본것 같은데요,
-->
smt 는 클릭 몇번으로 쉽게 token 만들수 있다
는 둥 어떻다는 둥
그런 취지의 말을 얼핏 본 것 같아서, ??
관심이 생기더군요.
https://smt.steem.io/에 들어가보니 토큰만드는 방법이 간단하게 설명되어있네요ㅎ
정말 이렇게 간단하게 만들 수 있다면 좋을텐데 아직 개발중인가봐요ㅜㅜ
eos token 만들기 홈페이지,
@elysia 님 좋은 정보 감사.
결국 빠른 무엇인가를 만들려면, c, c++ 로 가야하고,
편한 무엇인가를 만들려면, python, js 등으로 가야하는 것인가 보군요 ?
--
혹시 smt 로 steem 토큰 만드는 것도 이미 알려져 있으면,
방법을 올려주시면 더욱 더 감사드리겠습니다.
--
이것 초면에 너무 요구 사항이 많은지 모르겠는데,
간단한 steem bot 예를 들면, 댓글 봇이나, 보팅 봇 만드는 것도
언제 편하게 시간 되실때, 올려주시면 감사..
smt로 토큰 만드는것은 한번 찾아봐야 할 것 같네요. 아직 이더리움도 잘 몰라서 열심히 공부중입니다ㅎㅎ
스팀봇은 저도 어떻게 만드는지를 모르겠어요. 제가 프로그래밍쪽을 모르다보니...^^;;
근데 보팅봇 만들 수 있으면 정말 편하겠네요ㅎ
아.. 프로그래밍을 모르시고도 eth eos 토큰 만드는 것을 따라하실 수 있는 정도로 이해가 되나 보군요.
저는 프로그래밍 도사들이나 따라할 수 있을까 걱정했는데요,
smt token 은 프로그램 몰라도 따라 할 수 있을 듯이 홍보하는 것 같기는 하더라고요.
저도 얼핏 어깨 넘어로 본 것이라, 정확한 정보는 아니고요.
암튼 관련 자료 올려주시면, 감사드립니다.
네 감사합니다~~^^
저도 smt 홈페이지 들어가보니 관심이 생기더라구요ㅎ
관련정보를 계속 찾아봐야겠어요 :-)
smt 홈페이지는 어디인가요?
저는 아직 그것도 모르고 있다는..
글구, smt 로 token 만드는 방법도 따라해 볼 수 있게 해주시면 감사드리겠습니다.