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

in #kr6 years ago (edited)

번역기 매뉴얼 두번째 입니다~
이제 코드 하나 하나에 대한 내용이 나오네요...... 머리가 살짝 아파옵니다ㅠ
(본문에 있는 코드는 혹시 모르니 이더리움 홈페이지에서 복사 하는걸 추천 드려요)

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

UNDERSTANDING THE CODE

1.png

기본부터 시작하겠습니다. 월렛 앱을 열고 계약 탭으로 이동 한 다음 새 계약 배포를 선택합니다. Solidity Contract Source code 텍스트 필드에 아래 코드를 입력하십시오.

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

contract MyToken {
    /* This creates an array with all balances */
    mapping (address => uint256) public balanceOf;
}

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

매핑이란 주소를 잔액와 연관시키는 연관 배열을 의미합니다.
주소는 기본 16 진수 Ethereum 형식이며, 잔액은 0에서 115 quattuorvigintillion(10^75) 범위의 정수입니다.
당신이 quattuorvigintillion(10^75)이 얼마인지 모른다면, 당신이 사용하려는 당신의 토큰 보다 많은 vigintillions(10^63)이 많은 것이다.
public 키워드는 블록체인에 있는 모든 사람이이 변수에 액세스 할 수 있음을 의미합니다.
즉, 모든 잔액이 공개되어 있어야합니다 (클라이언트가 표시 할 필요가 있음).

2.png

당장 계약서를 발행하면 제대로 작동하지만 아주 유용하지는 않습니다.
어떤 주소에 대해서도 동전의 잔액을 쿼리 할 수 있는 계약이 될 것입니다.

하지만 동전을 하나도 만들지 않았기 때문에 동전 하나 하나가 0을 반환합니다.
그래서 우리는 시작할 때 몇 개의 토큰을 만들 것입니다.
마지막 닫기 괄호 앞에 있는 이 코드를 mapping.. 행 바로 아래에 추가하십시오.

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

functionMyToken() public{
    balanceOf[msg.sender] = 21000000;
}

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

MyToken 함수는 MyToken 계약과 같은 이름을 가지고 있습니다.
이것은 매우 중요하며, 이름을 변경하면 다른 이름도 변경해야합니다.
이것은 계약이 네트워크에 처음 업로드 될 때 한 번만 실행되는 특수 시작 기능입니다.
이 함수는 계약을 전개 한 사용자 인 msg.sender의 잔액을 2100만 잔고로 설정합니다.
2100만 개를 선택하는 것은 다소 임의적 이었으므로 코드에서 원하는 대로 변경할 수 있지만 더 좋은 방법이 있습니다.
대신 다음과 같이 함수의 매개 변수로 제공하십시오.

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

functionMyToken(uint256 initialSupply) public{
    balanceOf[msg.sender] = initialSupply;
}

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

계약서 옆의 오른쪽 열을 살펴보면 계약서를 작성한 드롭다운 목록이 나타납니다. "MyToken"계약을 선택하면 Constructor parameters라는 섹션이 표시됩니다. 이들은 토큰에 대해 변경 가능한 매개 변수이므로 동일한 코드를 재사용하고 향후 이러한 변수 만 변경할 수 있습니다.

3.png

지금은 토큰의 잔액을 만든 기능적 계약이 있지만이를 이동하는 기능이 없기 때문에 동일한 계정에 머물러 있어야합니다.
이제 우리는 그것을 구현할 것입니다.
마지막 괄호 앞에 다음 코드를 씁니다.

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

/* Send coins */
function transfer(address _to, uint256 _value)public{
    /* Add and subtract new balances */
    balanceOf[msg.sender] -= _value;
    balanceOf[_to] += _value;
}

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

이것은 매우 직관적 인 기능입니다.
받는 사람과 값을 매개 변수로 가지며 누군가 호출 할 때마다 _value를 잔액에서 빼고 _to 잔액에 추가합니다.
바로 거기에 명백한 문제가 있습니다.
그 사람이 소유하고 있는 것보다 더 많이 보내고 싶다면 어떻게 됩니까?
이 특정 계약에서 부채를 처리하고 싶지 않으므로 빠른 확인을 하고 송금 자의 자금이 충분하지 않으면 계약 실행이 중지됩니다.
또한 오버플로가 있는지 확인하여 너무 큰 숫자가 없으면 다시 0이 되지 않도록 합니다.
중간 실행 계약 실행을 중지하려면 되돌릴 수도 있고 던지기도 할 수 있습니다. 전자는 비용은 더 적지 만 지금까지 계약서에서 변경 한 모든 내용이 유지되므로 더 많은 골칫거리가 될 수 있습니다.
반면에 '던지다'는 모든 계약 집행을 취소하고 거래가 할 수 있는 모든 변경 사항을 되돌려 보내고 발송인은 그가 가스로 보낸 모든 이더를 잃게 됩니다.
그러나 월렛에서는 계약서가 유출되는 것을 감지 할 수 있으므로 항상 경고 메시지를 표시하므로 이더가 전혀 사용되지 않도록 합니다.

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

function transfer(address _to, uint256 _value)public{
    /* Check if sender has balance and for overflows */
    require(balanceOf[msg.sender] >= _value && balanceOf[_to] + _value >= balanceOf[_to]);

    /* Add and subtract new balances */
    balanceOf[msg.sender] -= _value;
    balanceOf[_to] += _value;
}

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

이제 누락 된 모든 것은 계약에 관한 몇 가지 기본 정보를 가지고 있습니다.
가까운 장래에 이것은 토큰 레지스트리에 의해 처리 될 수 있지만 지금은 계약에 직접 추가 할 것입니다.

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

stringpublic name;
stringpublic symbol;
uint8 public decimals;

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

그리고 이제 우리는 생성자 함수를 업데이트하여 모든 변수가 처음부터 설정되도록 합니다.

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

/* Initializes contract with initial supply tokens to the creator of the contract */
function MyToken(uint256 initialSupply, string tokenName, string tokenSymbol, uint8 decimalUnits)public{
    balanceOf[msg.sender] = initialSupply;              // Give the creator all initial tokens
    name = tokenName;                                   // Set the name for display purposes
    symbol = tokenSymbol;                               // Set the symbol for display purposes
    decimals = decimalUnits;                            // Amount of decimals for display purposes
}

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

마지막으로 우리는 이제 이벤트라는 것을 필요합니다.
Ethereum Wallet과 같은 클라이언트가 계약에서 발생하는 활동을 추적 할 수 있도록 도와주는 특별하고 비어있는 함수입니다.
이벤트는 대문자로 시작해야합니다.
계약을 시작할 때 다음 줄을 추가하여 이벤트를 선언하십시오.

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

eventTransfer(address indexed from, address indexed to, uint256 value);

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

그리고 다음 두 줄을 "transfer"함수 안에 추가하면 됩니다.

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

    /* Notify anyone listening that this transfer took place */
    emit Transfer(msg.sender, _to, _value);

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

이제 토큰이 준비되었습니다!

NOTICED THE COMMENTS?
"@notice" 및 "@param" 주석은 무엇입니까?
Natspec(https://github.com/ethereum/wiki/wiki/Ethereum-Natural-Specification-Format)은 자연어 사양의 새로운 표준으로, 지갑이 사용자에게 계약 내용에 대한 자연어 설명을 보여줄 수 있습니다.
현재 많은 지갑에서 지원되지 않지만 향후 변경 될 예정이므로 준비하는 것이 좋습니다.

Sort:  

잘 보고 갑니당~^^

감사합니다~~~~ :D