벌써 5번째 업로드입니다~ 이번에는 수수료와 마이닝 관련 내용이네요ㅎ
수수료 부분에서는 토큰을 받는 사람이 수수료를 지불하도록 만드는 방법도 있다니 ㅋㅋㅋㅋ 물론 아직 테스트는 안해봤습니다^^
(본문에 있는 코드는 혹시 모르니 이더리움 홈페이지에서 복사 하는걸 추천 드려요)
원제 : Create your own CRYPTO-CURRENCY with Ethereum
출처 : https://ethereum.org/token
[IMAGE: https://cdn.steemitimages.com/DQmXhEnJn5vFsdVto393btSbBwCv3rjUtuZXcWLerv9w41P/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= 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 분을 목표로 위아래로 조정됩니다.
보상을 제공하는 번호를 찾으려는 이 프로세스는 ‘마이닝’이라고 하는 것입니다. 난이도가 높아지면 행운의 숫자를 찾는 것이 매우 어려울 수 있지만, 발견 한 것을 확인하는 것은 언제나 쉽습니다.