날씨가 아직도 덥습니다. 그래서 오늘은 약간은 시원해 보이는 눈내리는 사진으로 시작해 봅니다.
오늘 이야기할 내용은 EOS 메인넷에 자신만의 토큰을 발행하는 방법에 대한 것입니다. 또한 발행한 토큰을 다른 계정으로 전송하는 것 까지 다루어 보려고 합니다.
오늘의 방법은 EOS를 설치하지 않아도 되는, EOSJS를 이용한 방법입니다. EOS를 설치하려면 Ubuntu가 설치된 RAM 8GByte이상의 PC가 필요하기 때문에, 여간 귀찮은 일이 아닌데요, EOSJS를 쓰면 EOS를 설치하지 않고 손쉽게 하실수 있습니다.
필수 준비물
- 손가락..(코딩을 해야 함)
- 노트북..(코딩을 위한)
- eosio.token smart contract 의 wasm과 abi 파일.
- EOS 계정 2개.
- 40EOS (200KB상당의 RAM을 EOS RAM market에서 구매해야 합니다.)
만약 mainnet이 아니라 jungle testnet에서 한다면 4, 5번은 모두 공짜 입니다. 실제 메인넷에 발행 하실 것인지, 혹은 시험용으로 jungle testnet에 하실 건지는 선택을 하시면 됩니다.
일단은 testnet 기준으로 설명을 드리겠습니다.
편의상 여기에서는 2개의 계정을 사용하겠습니다.
- eoscafekorea : token을 최초 발행하는 계정
- awesometeddy : eoscafekorea가 발행한 token을 시험으로 받아볼 계정.
아래 내용부터는 node.js를 기반으로 설명합니다.
Contract의 loading 및 토큰의 발행
const wasmUrl = "./contract/eosio.token.wasm";
const abiUrl = "./contract/eosio.token.abi";
wasm과 abi파일을 로컬에 복사하거나 혹은 알고 계신 곳의 주소를 입력합니다. github에 많이 있고, EOS를 만약 설치하셨다면 설치한 곳의 contract폴더에 있습니다.
Eos = require('eosjs');
const fs = require('fs');
config = {
chainId: "038f4b0fc8ff18a4f0842a8f0564611f6e96e8535901dd45e43ac8691a1c4dca", // 32 byte (64 char) hex string
keyProvider: process.env.key, // WIF string or array of keys..
httpEndpoint: 'http://193.93.219.219:8888',
expireInSeconds: 60,
broadcast: true,
verbose: false, // API activity
sign: true
}
eos = Eos(config);
EOSJS를 초기화 합니다.
main net 인 경우에는 chainId와 httpEndpoint만 달라지게 됩니다. chainid는 get_info로, httpEndpoint는 Block producer의 것중 아무것이나 사용하시면 됩니다.
"process.env.key" 에는 eoscafekorea의 EOS private key를 넣으시면 됩니다. 공개가 되면 안되는 것이니 잘 보관하셔야 합니다.
eos.transaction(tr => {
tr.buyrambytes({
payer: 'eoscafekorea',
receiver: 'eoscafekorea',
bytes: 2000*1024
})
});
우선 RAM을 구입합니다. test net에는 계정을 만들면 EOS가 충분히 들어 있으니 2MByte정도는 쉽게 살수 있습니다.
wasm = fs.readFileSync(wasmUrl);
abi = fs.readFileSync(abiUrl);
console.log("Wasm", wasm);
console.log("Abi", abi);
eos.setcode("eoscafekorea", 0, 0, wasm) // @returns {Promise}
eos.setabi("eoscafekorea", JSON.parse(abi)) // @returns {Promise}
위에서 정의한 주소에 있는 wasm, abi파일을 읽어서 eoscafekorea계정에 로딩을 합니다. 이제 토큰 발행 준비가 완료 되었습니다.
async function createToken(account){
await eos.transaction(account, myaccount => {
myaccount.create(account, '1000000000.0000 DAB')
myaccount.issue(account, '1000000.0000 DAB', 'issue')
})
여기서 중요한 절차가 있습니다. 토큰은 생성과 실제 발행으로 나뉘게 됩니다. 즉
create로 생성을 해도 issue를 하지 않으면 토큰을 전송할수 없습니다.
account는 아까 contract을 로딩한 account이고, 두번째는 토큰의 발행량과 이름입니다. 여기서 주의할 것은
100과 100.0000 은 서로 다른 의미입니다. 즉 "."이하의 값은 토큰의 최소 단위를 결정합니다. 그리고 그 숫자 뒤에 토큰의 이름을 적어 줍니다.
자 이제 실제로 전송 가능한 가용한 토큰이 만들어 졌습니다. 처음부터 create한 숫자와 같은 token을 issue하셔도 되고, 혹은 필요할때마다 issue를 하셔도 됩니다.
자 이제 실제 토큰이 만들어졌는지 보겠습니다.
const balance = await eos.getCurrencyBalance(account, account, 'DAB')
console.log('Currency Balance', balance)
아까 issue한 만큼 토큰이 보입니다. Create한 만큼이 아니라 issue한 만큼입니다.
전송은 다음과 같이 합니다.
async function transfer(from, to, amount){
const myaccount = await eos.contract(from);
await myaccount.transfer(from, to, amount + " " + "DAB","");
}
myaccount.transfer("eoscafekorea", "awesometeddy", '1000000.0000 DAB', "first transfer test");
자 실제 token이 전송되었는지 볼까요?
http://jungle.cryptolions.io/#accountHist:awesometeddy
에서 조회를 해보시면 다음과 같이 DAB토큰이 전송되었습니다.
Block: # 8182451
TXid: 40d7fb8ca05b81c3c072f64d255780715915e5b66be0c90be038de1b29b65f4b
Date: 2018-08-04T07:37:19
Action: eoscafekorea::transfer
From: eoscafekorea
Info: eoscafekorea>awesometeddy
1000000.0000 DAB
first transfer test
node.js로 위의 코드를 순서대로 복사해서 붙여넣기 하여 실행하시면(계정만 바꾸어서) 토큰을 만들고 전송까지 하실수 있을 겁니다.
하시다가 안되는 것이 있으시면 댓글로 남겨 주세요.
혹시 정글 testnet에서 계정 생성이나 관련 정보가 궁금하신 분이 계시면, 해당 글을 별도로 작성해 보겠습니다.
감사합니다!
날이 너무 덥습니다......덥다 ㅠ
감사합니다. 벌써 이글이 7일이 지났군요..
https://dabble.cafe 에 오셔서 글 남겨 주시면, 약속하지만 DAB 토큰이 보상으로 주어 집니다. 이곳은 payout이 영원히 되는 곳입니다!