Ethereum Token 발행 번역 (CREATE YOUR OWN CRYPTO-CURRENCY WITH ETHEREUM) #2

in #kr7 years ago

#1 : https://steemit.com/ethereum/@yackjun/ethereum-token-create-your-own-crypto-currency-with-ethereum-1

이 글은 Ethereum의 token 발행의 번역글입니다. 원만한 내용의 진행을 위해 의역이 들어갔습니다. 번역의 실수로 오역이 있을 수 있습니다. 오역에 관해서는 댓글로 알려주시면 수정 하도록 하겠습니다.
원본 : https://ethereum.org/token

HOW TO DEPLOY

배포를 하기 위해서 이더리움 지갑을 열고 계약탭에 가서 "deploy new contract"를 클릭합니다. 위에서 작성한(역자 : #1 에서 작성한 코드들을 말합니다.) 를 " Solidity soure field"에 붙여 넣습니다. 코드가 에러 없이 컴파일이 되면 오른쪽에 있는 "pick contract" drop down을 클릭 하세요. 그리고 여기서 만든 "MyToken" 계약을 선택 합니다. 고르고 나면 파라미터들을 각자에게 맞게 채워 줘야 합니다. 어떤 내용을 적어도 상관 없긴 하지만, 튜토리얼을 원할 하게 진행 하기 위해서 다음과 같이 파라미터들을 설정 해주길 바랍니다. supply : 10000, name : (자유롭게), symbol : $, decimals : 2. 다 적었다면 아래와 같게 될 것 입니다.

지갑의 페이지의 끝으로 가면 계약의 computation cost의 추정치를 볼 수 있습니다. 그리고 몇 이더를 이에 대한 비용으로 지불 할 지를 결정할 수 있습니다. 초과 사용분에 대해서는 반환되니 그냥 기본 설정 값을 사용 하면 됩니다. "deploy"를 누르고 당신의 계정에 대한 비밀번호를 입력 한뒤, 이 계약을 담은 transaction이 네트워크에 담겨지길 기달립니다.

첫번째 페이지로 다시 연결 된 뒤, 이 페이지에서 해당 계약을 담은 transaction이 확인되길 기다리는 것을 볼 수 있습니다. "Ehterbase"(당신의 본 계정)을 클릭하면 1분도 되지 않아서 당신이 방금 만든 코인의 100%를 가지고 있는 것을 확인 할 수 있습니다. 다른 친구들에게 보내기 위해서 "send" 탭을 클릭 하고 보낼려고 하는 currency를 선택 한뒤(여기서는 새로만든 My DAO Shares), 친구의 주소를 "to" 에 넣은뒤 "send"를 누릅니다.

친구한테 보냈다고 하더라도, 친구 지갑에선 아직 아무것도 안 보일 것입니다. 왜냐하면 지갑은 지갑에 등록되어있는 코인만을 추적하기 때문이죠. 그래서 수동으로 이번에 만든 코인을 넣어주어야 합니다. 이제 "Contracts" 탭에 가면 새로만들어진 계약에 대한 링크를 볼 수 있을 겁니다.계약을 보기 위해 클릭을 하세요. 이건 매우 간단한 코인이기에 단지 해야 될 건 "copy address"를 클릭 합니다.

토큰을 추적하기 위해서 contract 페이지로가서 "Watch Token"을 클릭 합니다. 팝업 창이 뜨면 거기에 아까 복사한 계약의 주소를 넣습니다. 토큰 name, symbol, decimal은 자동으로 채워 질텐데, 그렇지 않다면 자유롭게 넣어도 됩니다.(이 값들은 단지 지갑에서 어떻게 보여지는지에 대해서만 쓰여집니다.). 이렇게 하고 나면 자동으로 토큰의 잔고가 보여지게 되고 다른 사람에게 보낼 수 있게 됩니다.

이제 너만의 토큰을 갖게 되었습니다! 토큰을 local communites에서 통화로 사용 할 수도, 일한 시간을 기록 하는 대에도, 아니면 다른 로얄티 프로그램에도 사용 할 수 있습니다. 하지만 토큰 자체를 유용하게 만들어서 가치를 갖게 할 방법은 없을까요?

Improve your token

crypto token을 위에 코드를 가지고 배포 할 수 도있지만, 진짜는 커스터마이징을 할 때 죠. 아래의 내용은 당신의 요구에 맞게 기능을 추가하는 방법을 알려 줍니다.

CENTRALIZED ADMINISTRATOR

모든 dapp은 기본적으로 decentralized 되어 있습니다. 하지만 이게 중앙 매니저 같은 걸 둘 수 없다는건 아닙니다. 원한다면 만들 수 있습니다. 당신은 코인을 늘릴 기능이나 사용자를 화폐를 사용 하지 못하게 하고 싶을 수 있습니다. 하지만 이런 기능들은 배포하기전에만 넣을 수 있습니다. 이점을 명심하고 코인을 만들어야 합니다.

이러한 기능들을 만들기 위해서는 화폐의 중앙 관리자가 필요 합니다. 이건 간단한 계정 일 수도 있고, 계약으로 만들어 새로운 토큰이 발행되는건 계약에 의해서 이루어지게 할 수도 있습니다. 만약 만든 계약이 민주적인 단체라면 투표에 의해서 할 수도 있고, 아니면 단지 토큰 소유자의 영향력을 제한 하는 것으로 될 수 있습니다.

이것들을 하기 위해서 우리는 간단한 계약의 특성을 배워 보겠습니다. 상속(inheritance)입니다. 상속을 통해서 계약은 부모 계약의 특성들을 따른 추가 작업 하지 않고 얻게 됩니다. 이 방법을 통해서 코드가 깔끔해지고, 재사용성이 높아 집니다. 다음 아래의 코드를 코드의 맨 첫줄에 넣어 주세요. MyToken { 전에 넣으면 됩니다.

contract owned {
    address public owner;

    function owned() {
        owner = msg.sender;
    }

    modifier onlyOwner {
        if (msg.sender != owner) throw;
        _;
    }

    function transferOwnership(address newOwner) onlyOwner {
        owner = newOwner;
    }
}

위의 계약 코드는 정말 간단한 코드로서 단지 generic 함수인 owned만을 정의 해놓았습니다. 이제 할 건 단지 원래 만들어진 계약에 is owned라는 코드를 추가 해주는 것 뿐입니다.

contract MyToken is owned {
    /* the rest of the contract as usual */

이로서 MyToken의 내부의 함수들은 변수 ownerisOnlyOwned modifier를 접근 할 수 있습니다. 또한 계약은 소유권을 넘길 수 있는 함수를 사용 할 수 있습니다. (transferOwnerShip) 계약이 생성 될때 소유자를 설정하는게 좋아 보임으로 constructor를 아래와 같이 구성하여 계약 생성 초기시 소유자를 명시 해줄 수 있습니다.

function MyToken(
    uint256 initialSupply,
    string tokenName,
    uint8 decimalUnits,
    string tokenSymbol,
    address centralMinter
    ) {
    if(centralMinter != 0 ) owner = centralMinter;

CENTRAL MINT(중앙 조폐)

만약 계약을 설계시에 토큰이 사용 되면서 양이 변하길 원할 수 있습니다. 오프라인에서 사용되는 블록체인 자원에 관해서 이런일이 벌어 질 수 있습니다. (금 인증이나 정부화폐 같은 경우죠) 그리고 실제의 것을 반영할 가상의 inventory가 필요 할 겁니다. 화폐 소유자가 토큰의 가치를 조정 하려고 하는 경우에도 필요 하게 됩니다. 이럴 경우 토큰을 유통에 추가 발행 하거나 토큰을 유통에서 지울 수 있는 기능이 필요 합니다.

먼저 totalSupply라는 변수를 추가 하고, constructor에서 그 값을 초기 설정 하게 해줍니다.

contract MyToken {
    uint256 public totalSupply;

    function MyToken(...) {
        totalSupply = initialSupply;
        ...
    }
    ...
}

이제 계약의 소유자가 토큰을 추가로 발행 할 수 있도록 함수를 추가 해 봅시다.

function mintToken(address target, uint256 mintedAmount) onlyOwner {
    balanceOf[target] += mintedAmount;
    totalSupply += mintedAmount;
    Transfer(0, owner, mintedAmount);
    Transfer(owner, target, mintedAmount);
}

함수 마지막에 modifier onlyOwner에 주목해 주세요. modifier를 통해서 이 함수는 compilation 될 때 modifier의 내용이 추가 되면서 다시 쓰여지게 된다는걸 의미 합니다. 위의 mintToken 함수는 modifier의 코드 아래 부분에 추가 되게 됩니다. 그렇게 됨으로서 이 함수는 owner에 의해서만 사용 될 수 있게 됩니다. 위의 코드를 owner modifier와 함께 계약에 추가 함으로서 이제 토큰을 더 만들 수 있습니다.

FREEZING OF ASSET

사용방법에 따라서 사용자로 하여금 토큰을 사용하지 못 하도록 하는 규제를 설정 해야 될 수 있습니다. 규제 기능을 사용 하기 위해서는 계약에 규제를 쓸 수 있게 하는 파라미터를 추가 해주 면 됩니다.

파라미터와 코드를 어떤 곳이든지 넣을 수 있습니다. 하지만 효율적으로 코드를 위해서 mapping은 mapping끼리, event는 event 끼리 묶어 놓는 것을 추천합니다.

mapping (address => bool) public frozenAccount;
event FrozenFunds(address target, bool frozen);

function freezeAccount(address target, bool freeze) onlyOwner {
    frozenAccount[target] = freeze;
    FrozenFunds(target, freeze);
}

위의 코드대로라면 모든 계정은 초기엔 unfrozen상태로 있습니다. 계약의 소유자가 특정 계정을 __ Freeze Account__을 통해 frozen 한다면 frozen 상태가 됩니다. 하지만 지금은 frozen 상태에 다른 기능들을 엮어 두지 않았기에 실제적인 제약은 없습니다. 아래의 코드를 통해서 transfer 함수가 frozen 상태면 throw를 하게 하도록 하겠습니다.

function transfer(address _to, uint256 _value) {
    if (frozenAccount[msg.sender]) throw;

이제 frozen된 계정은 자산이 존재하긴 하지만 다른 곳으로 보낼 수 없습니다.

위의 방법에선 계정을 기본적으로 unfrozen상태로 두고 frozen 상태의 계정만 활동을 막았지만, 반대로 허용 받은 계정은 활동을 허락하고 나머지는 활동이 불가능한 whitelist 방법으로 설계를 할 수 있습니다. frozenAccountapprovedAccount로 변경 한뒤, 바로 위의 transfer의 코드를 아래와 같이 바뀌면 됩니다.

    if (!approvedAccount[msg.sender]) throw;