那個瘋狂的比特幣,從不足1美分到19000美元,漲了2600萬倍,漲得令世人懷疑人生。為什麼漲得這麼瘋狂?最根本的原因是它提出了區塊鏈的技術。巨大的財富效應導致如今各種區塊鏈項目像螞蟻一樣層出不窮。其中為首的當屬比特幣、以太坊、EOS最熱門。我在想,如果自己也在淘寶請人寫一個區塊鏈白皮書,在百度上搜索幾個歐美成熟男士然後給他貼上哈佛大學,麻省理工大學高級教授的標籤,然後在EOS上發行一個EGC(EggCoint)幣,發行個一萬億, 然後上街就給人送幾萬個EGG,那該是什麼樣的情景。。。如果你也覺得好玩,那就和我一起來了解一下自己發行EOS代幣需要知道的一些基礎知識,然後發行一個自己的幣吧。
回顧區塊鏈的發展歷史
區塊鏈1.0
以比特幣為代表,僅支持代幣的交易功能,區塊鏈技術由此誕生。
區塊鏈2.0
以以太坊(ETH)為代表, 在代幣交易基礎上提出虛擬機的概念, 出現了智能合約,DAPP(分佈式應用)。以太坊區塊鏈相當於一個操作系統,可以各種智能合約(可以理解為代碼或程序)可以在這個操作系統裡運行。
關於智能合約:說得簡單一些,智能合約就是將代碼存放在區塊鏈裡,代碼被區塊鏈保護,沒有人可以篡改,所有的人都可以看到代碼,合約代碼由區塊鏈來執行,沒有人可以干預和操控。
區塊鏈3.0?
以太坊(ETH)仍像比特幣那樣,需要挖礦來創造區塊;智能合約在以太坊虛擬機執內行效率低下。EOS考慮了這些痛點,提出DPOS共識機制。在EOS中,區塊的生產由21個超級節點完成,解決了區塊鏈項目讓世人詬病的浪費電力的問題,提高了區塊鏈網絡處理事務的效率,DAPP得以快速增長。
這裡標題加了一個問號,是在於EOS這樣的做法本身似乎違背去中心化的初衷,仍值得考量。
簡單瞭解EOS
EOS全稱為Enterprise Operation System,即企業操作系統。一聽這個名字就覺得很高大上,操作系統是什麼,那可是核高基啊,例如windows,android,ios操作系統,可是跑各種應用軟件。不同的領域,只要有人開發app部署到EOS上就行,想象空間非常大。
相比以太坊,EOS有哪些優勢
- 效率優勢:
- 以太坊每秒處理10到20個交易請求。EOS在白皮書中號稱每秒處理百萬交易,實際上EOS主網上線後也就6000的TPS,與最初吹的牛相差甚遠,但也比以太坊高效很多了。
- 交易費用低廉的優勢:
- 以太坊為了避免被DOS攻擊,在轉賬,執行智能合約涉及到計算,存儲的每一步都要收GAS費用。這導致以太坊的DAPP生態完全發展不起來。
- EOS中採取抵押EOS的模式來避免被DOS攻擊,要發動對EOS的攻擊,你需要持有大量的EOS代幣,而持有大量EOS代幣的你發動攻擊對自己有什麼好處呢?
- 在EOS的生態中,DAPP的使用者,基本不用花錢,只是DAPP的開發者在部署DAPP合約的時候需要花錢。
EOS錢包
- 錢包本質上是一個加密文件,需要密碼才能打開。
- 錢包裡邊管理多個私鑰,用於對交易進行簽名。
EOS賬戶
賬號存在於區塊鏈中,一個賬號的操作(轉賬、調用合約等)需要私鑰來簽名才會被區塊鏈網絡接受。
EOS的共識機制
EOS採用DPOS共識機制,將挖礦權委託給21個超級節點(競選這21個節點當然是財力最雄厚的才會有機會)。這21個超級節點不用像比特幣和以太坊那樣需要搶著挖礦,而是輪流進行區塊的打包,普通節點只有權選舉這21個超級節點。這種共識機制與比特幣的POW共識機制相比,不用浪費大量的電力進行挖礦。由於強者恆強,這21個超級節點基本上很難變動,變成了財閥統治的區塊鏈,所以以太坊的創始人炮轟EOS是集中式的垃圾堆。
EOS的資源分配機制
- RAM資源,購買型資源;
- RAM是損耗型的資源,需要用EOS來購買。一些操作(如創建合約,創建賬號)需要足夠的RAM才能被執行。執行需要RAM的操作後,RAM被扣除損耗掉了,但剩餘沒用完的RAM資源你可以拿去賣給別人。
- 這種機制導致有人囤貨炒作,導致EOS RAM的價格暴漲,但相比以太坊也還是便宜一些。
- CPU和網絡帶寬,抵押型資源。
- CPU和網絡帶寬資源可以通過抵押你的EOS幣來獲得,當你不再使用時,可以全部贖回來,相當於沒花錢。
下邊是我的EOS錢包中顯示的資源情況:
EOS的安裝使用
測試環境
推薦採用ubuntu 18.04版本linux操作系統。
軟件的安裝
EOS是開源的,可以從github上下載源碼並編譯,但是為了快速瞭解,下載安裝即可。
1#下載
2wget https://github.com/EOSIO/eos/releases/download/v1.7.2/eosio_1.7.2-1-ubuntu-18.04_amd64.deb
3
4#安裝
5sudo dpkg -i eosio_1.7.2-1-ubuntu-18.04_amd64.deb
驗證安裝
輸入cleos -h看到下邊的輸出就說明安裝好了。
$ cleos -h
Command Line Interface to EOSIO Client
Usage: cleos [OPTIONS] SUBCOMMAND
Options:
-h,--help Print this help message and exit
-u,--url TEXT=http://127.0.0.1:8888/
理解nodeos,keosd,cleos
EOS安裝好後,我們主要了解nodeos keosd cleos這三個可執行程序即可。
- nodeos
nodeos用於連接區塊鏈網絡,生產區塊。
和以太坊默認連接主網的做法不同,如果你想用nodeos來同步EOS主網數據,你需要先做特定的配置,否則就按本地私有測試網絡的模式運行。
注意:默認情況下,運行nodeos會創建本地範圍使用的EOS網絡,也就是說只要只有一個節點就可以產生區塊,創建賬戶,部署合約,但這種網絡和真實的EOS網絡相差很大。網上大部分的文章都是類型的,我們並不採用。
- keosd
keosd是一個精簡版的nodeos,除掉了很多功能,只保留管理本地錢包的功能。我們用keosd管理我們的錢包,並提供使用錢包裡的私鑰進行數據簽名。
- cleos
cleos是(cli eos), 也就是一個命令行客戶端。它通過網絡連接nodeos或者keosd來執行對應的功能。
cleos與keosd和nodeos的關係
連接區塊鏈節點
默認情況下cloes連接的nodeos地址為:http://127.0.0.1:8888/,即本地運行的nodeos的8888端口。
cleos get info
相當於
cleos -u http://127.0.0.1:8888/ get info
所以,要鏈接主網,應該這樣:
#mainnet.meet.one是主網上的一個真實節點
cleos -u https://mainnet.meet.one:443 get info
連接錢包服務
默認連接本地錢包管理模塊
cleos --wallet-url unix:///~/eosio-wallet/keosd.sock
如果要通過網絡連接一個錢包模塊,需知道其錢包服務地址,例如:
cleos --wallet-url http://192.168.15.191:9999
cleos的本質
例如我通過cleos查詢我主網上的賬號的金額,把詳細過程打印出來:
cleos -u https://mainnet.meet.one:443 --print-request --print-response get currency balance eosio.token yinmingxuan5
REQUEST:
---------------------
POST /v1/chain/get_currency_balance HTTP/1.0
Host: mainnet.meet.one
content-length: 74
Accept: */*
Connection: close
{
"account": "yinmingxuan5",
"code": "eosio.token",
"symbol": null
}
---------------------
RESPONSE:
---------------------
[
"0.0432 EOS"
]
---------------------
0.0432 EOS
可以看出,cleos本質上其實就是一個HTTP的客戶端而已。
理解EOS主網、測試網、本地測試網
- EOS主網
- 因特網上真實的EOS網絡,chain_id為:
aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906
- EOS測試網
- 由於EOS主網創建賬戶和部署合約都需要花錢,所以不適合測試用。EOS提供了公網環境的EOS測試網絡,它的EOS幣是可免費領取的,網絡與主網沒有任何差異,只是chain_id不同。
目前英特網上有多個EOS測試網可用。
- 本地EOS測試網
- 安裝EOS軟件後,我們執行nodeos後即可創建一個本地測試網絡。這種網絡默認沒有部署過系統合約,與主網有很大差異。
由於我們的目的是快速瞭解自己發行一個EOS代幣是怎麼的,所以我們應該在和主網一樣的網絡環境中進行,所以我們首選因特網上的EOS測試網。
有哪些可用的測試網
官方測試網
官網:
http://jungle.cryptolions.io/
代碼:
https://github.com/CryptoLions/EOS-Jungle-Testnet
RPC 入口:
https://jungle.eosio.cr
https://api.jungle.alohaeos.com
chainID:
038f4b0fc8ff18a4f0842a8f0564611f6e96e8535901dd45e43ac8691a1c4dca
區塊瀏覽器:
https://jungle.bloks.io/
在線錢包:
https://jungle.bloks.io/wallet
https://eostoolkit.io/
Kylin測試網
官網:
https://www.cryptokylin.io/
代碼:
https://github.com/cryptokylin/CryptoKylin-Testnet
RPC 入口:
https://api.kylin.alohaeos.com
https://api-kylin.eoslaomao.com
chainID: 5fff1dae8dc8e2fc4d5b23b2c7665c97f9e9d8edf2b6485a86ba311c25639191
瀏覽器:
http://tools.cryptokylin.io
https://kylin.bloks.io/
https://kylin.eosq.app/
在線錢包:
https://kylin.bloks.io/wallet
https://eostoolkit.io/
理解手機錢包app是如何完成轉賬的
當我們發現自己的代幣後,我們可能需要一個我們自己的錢包來展示賬戶的金額,轉賬,調用合約接口等操作,所以必須理解錢包app是如何完成轉賬等操作的。
可以參考這個:
https://github.com/EOSBlock/EOS-Tutorials/blob/master/EN/transfer-tokens-using-RPC.md
其原理,就是創建一個交易的請求,然後用賬戶的私鑰對交易進行簽名,然後發送給區塊鏈進行打包和確認。理解了這個,我們就很容易開發出自己的錢包app。創建交易核心的東西是對交易進行簽名,有兩種類型:
- 第一種類型:交易簽名由錢包app完成。
這種情況你手機上的錢包就管理了你的私鑰,而你的手機是接入因特網的,我覺得有點危險。
- 第二種類型:交易簽名由本地內部服務器的keosd來完成。
這種方式內部的keosd不接入網絡,感覺安全點。
如何基於EOS發行自己的代幣
我們在EOS裡發行代幣可以理解成:創建一個賬戶,然後在賬戶裡部署一個代幣智能合約。
以測試網為例子,演示如何發行自己的代幣:
第一步:創建兩個EOS賬戶
http://faucet.cryptokylin.io/create_account?yinmingxuan1
http://faucet.cryptokylin.io/create_account?yinmingxuan2
返回結果如下:
{"msg": "succeeded", "keys": {"active_key": {"public": "EOS5pRyMQe2zF9MVhe3VozMija954roVeHQmvqdJ6aV8jGTLzsfn5", "private": "5JahshimirqoqQw4Kz7YAdKmfWhq31QVnk6gVz8cNfPUBSNMmUW"}, "owner_key": {"public": "EOS5WyJEc6C7EiKSyXWzfHuY8ZegEXciodypMXSX1nhYGJ3rcwL21", "private": "5K4n2B1GnWvWLYw93ATB9gaXMnQ536hSsZSE2ccD8gmEzsrgG4i"}}, "account": "yinmingxuan1"}
{"msg": "succeeded", "keys": {"active_key": {"public": "EOS5esafkz4MYjxmULedXkcGhXYESLrmfzzfPTVYFSVqsiUVjzeZa", "private": "5JfEJzvazLeRZUzpaZyi45FBdCKuYEa3Avq65rQZAQBKKkxoy5P"}, "owner_key": {"public": "EOS89Re5XQvzawyVHtSbbHhbk4pBkFdEyMewqQbZViyfjAV8x8EYD", "private": "5JEo197icSDLcFUW69wxX1Rh27UU3SPBe1L43jx1EBcTFGvpBNo"}}, "account": "yinmingxuan2"}
第二步:申請一點EOS幣:
測試網的EOS是免費申請的,執行下面的HTTP GET請求:
http://faucet.cryptokylin.io/get_token?yinmingxuan1
返回結果:
{"msg": "succeeded"}
第三步:部署代幣合約到EOS賬戶
我們直接基於EOS源碼裡的eosio.token合約部署成我們的代幣合約。如果有特殊要求,可以參照eosio.token合約修改成自己的代幣合約。
cleos -u https://api.kylin.alohaeos.com set contract yinmingxuan1 /home/wakuang/eos/unittests/contracts/eosio.token/ --abi eosio.token.abi -p yinmingxuan1@active
返回消息:
Reading WASM from /home/wakuang/eos/unittests/contracts/eosio.token/eosio.token.wasm...
Publishing contract...
Error 3080001: Account using more than allotted RAM usage
Error Details:
account yinmingxuan1 has insufficient ram; needs 230064 bytes has 9550 bytes
提示RAM不足,通過cleos買一點RAM:
wakuang@wakuang01:~/eosio-wallet$ cleos -u https://api.kylin.alohaeos.com system buyram yinmingxuan1 yinmingxuan1 "20 EOS"
輸出:
executed transaction: 6d5840d7b4f4c1a61a860951c121e6f787d84223d1dd16c73ecc8a4ddc817821 128 bytes 590 us
# eosio <= eosio::buyram {"payer":"yinmingxuan1","receiver":"yinmingxuan1","quant":"20.0000 EOS"}
# eosio.token <= eosio.token::transfer {"from":"yinmingxuan1","to":"eosio.ram","quantity":"19.9000 EOS","memo":"buy ram"}
# yinmingxuan1 <= eosio.token::transfer {"from":"yinmingxuan1","to":"eosio.ram","quantity":"19.9000 EOS","memo":"buy ram"}
# eosio.ram <= eosio.token::transfer {"from":"yinmingxuan1","to":"eosio.ram","quantity":"19.9000 EOS","memo":"buy ram"}
# eosio.token <= eosio.token::transfer {"from":"yinmingxuan1","to":"eosio.ramfee","quantity":"0.1000 EOS","memo":"ram fee"}
# yinmingxuan1 <= eosio.token::transfer {"from":"yinmingxuan1","to":"eosio.ramfee","quantity":"0.1000 EOS","memo":"ram fee"}
# eosio.ramfee <= eosio.token::transfer {"from":"yinmingxuan1","to":"eosio.ramfee","quantity":"0.1000 EOS","memo":"ram fee"}
# eosio.token <= eosio.token::transfer {"from":"eosio.ramfee","to":"eosio.rex","quantity":"0.1000 EOS","memo":"transfer from eosio.ramfee t...
# eosio.ramfee <= eosio.token::transfer {"from":"eosio.ramfee","to":"eosio.rex","quantity":"0.1000 EOS","memo":"transfer from eosio.ramfee t...
# eosio.rex <= eosio.token::transfer {"from":"eosio.ramfee","to":"eosio.rex","quantity":"0.1000 EOS","memo":"transfer from eosio.ramfee t...
warning: transaction executed locally, but may not be confirmed by the network yet ]
購買成功,再查看賬戶的資源信息:
wakuang@wakuang01:~/eosio-wallet$ cleos -u https://api.kylin.alohaeos.com get account yinmingxuan1
輸出:
created: 2019-04-24T08:03:06.500
permissions:
owner 1: 1 EOS5WyJEc6C7EiKSyXWzfHuY8ZegEXciodypMXSX1nhYGJ3rcwL21
active 1: 1 EOS5pRyMQe2zF9MVhe3VozMija954roVeHQmvqdJ6aV8jGTLzsfn5
memory:
quota: 373.2 KiB used: 224.9 KiB
net bandwidth:
delegated: 1.0000 EOS (total staked delegated to account from others)
used: 9.446 KiB
available: 696.3 KiB
limit: 705.7 KiB
cpu bandwidth:
delegated: 1.0000 EOS (total staked delegated to account from others)
used: 3.691 ms
available: 129.1 ms
limit: 132.8 ms
EOS balances:
liquid: 279.0000 EOS
staked: 0.0000 EOS
unstaking: 0.0000 EOS
total: 279.0000 EOS
現在資源充足了,再次嘗試部署合約:
wakuang@wakuang01:~/eosio-wallet$ cleos -u https://api.kylin.alohaeos.com set contract yinmingxuan1 /home/wakuang/eos/unittests/contracts/eosio.token/ --abi eosio.token.abi -p yinmingxuan1@active
輸出:
Reading WASM from /home/wakuang/eos/unittests/contracts/eosio.token/eosio.token.wasm...
Publishing contract...
executed transaction: e00d8238fa60ee89cb3b31a0ad3b033fc2c52b9f37486755da973a56f5511062 9312 bytes 677 us
# eosio <= eosio::setcode {"account":"yinmingxuan1","vmtype":0,"vmversion":0,"code":"0061736d0100000001aa011c60037f7e7f0060047...
# eosio <= eosio::setabi {"account":"yinmingxuan1","abi":"0e656f73696f3a3a6162692f312e310008076163636f756e7400010762616c616e6...
warning: transaction executed locally, but may not be confirmed by the network yet ]
第四步:創建代幣
cleos -u https://api.kylin.alohaeos.com push action yinmingxuan1 create '[ "yinmingxuan1", "1000000000.0000 EGG"]' -p yinmingxuan1@active
輸出:
executed transaction: a9329b6f1405aa68d163f5c8390c4a038a5078abeb75ba6b8ee3920974c9964a 120 bytes 535 us
# yinmingxuan1 <= yinmingxuan1::create {"issuer":"yinmingxuan1","maximum_supply":"1000000000.0000 EGG"}
warning: transaction executed locally, but may not be confirmed by the network yet ]
第五步:將代幣發行給自己
wakuang@wakuang01:~/eosio-wallet$ cleos -u https://api.kylin.alohaeos.com push action yinmingxuan1 issue '["yinmingxuan1", "1000.0000 EGG", "you eat some egg!"]' -p yinmingxuan1
輸出:
executed transaction: ae7d4099b2efa41aa427fafa0ed517d23046ea0bb5f8e951e4cceb126487f6fc 136 bytes 215 us
# yinmingxuan1 <= yinmingxuan1::issue {"to":"yinmingxuan1","quantity":"1000.0000 EGG","memo":"you eat some egg!"}
warning: transaction executed locally, but may not be confirmed by the network yet ]
第六步:測試代幣轉賬
wakuang@wakuang01:~/eosio-wallet$ cleos -u https://api.kylin.alohaeos.com push action yinmingxuan1 transfer '["yinmingxuan1", "yinmingxuan2", "200.0000 EGG", "here you are, 200 egg" ]' -p yinmingxuan1@active
輸出:
executed transaction: 6595f0a1de8e5a0ca3f1b18f524b97fd5568a8a7825ca32afaf30390af988b04 152 bytes 207 us
# yinmingxuan1 <= yinmingxuan1::transfer {"from":"yinmingxuan1","to":"yinmingxuan2","quantity":"200.0000 EGG","memo":"here you are, 200 egg"}
# yinmingxuan2 <= yinmingxuan1::transfer {"from":"yinmingxuan1","to":"yinmingxuan2","quantity":"200.0000 EGG","memo":"here you are, 200 egg"}
warning: transaction executed locally, but may not be confirmed by the network yet ]
第七步:查看轉賬結果
cleos -u https://api.kylin.alohaeos.com get currency balance yinmingxuan1 yinmingxuan2 EGG
輸出:
1200.0000 EGG
可以看到,我轉的200個蛋幣,已經轉賬成功!
如何創建真實的EOS主網賬戶
創建EOS賬戶的本質是:通過一個已有賬戶,執行EOS的系統智能合約中的一個創建賬戶方法。因此我們要創建賬戶,必須先有一個EOS賬戶。執行創建賬戶合約是需要花費RAM資源的,所以創建賬戶要給幫你創建賬戶的人一些錢。
網上說需要2個EOS才能創建賬戶,太貴了!我通過tokenpocket這個錢包,通過購買激活碼的方式,4.9元開通了一個賬戶。
填寫要的賬戶名後,選擇激活碼註冊,在給對方支付4.9元后,你會收到一個激活碼,填進去,然後點擊創建錢包就能創建成功了。
創建成功後,記得把你的私鑰給收藏起來並不能告訴別人,這是你擁有並控制這個賬戶的唯一憑證。
查看賬戶信息
在區塊鏈裡,賬戶的餘額都不是秘密,所以我們知道賬戶名就可以查看任意一個賬戶的賬號餘額。
我的:
cleos -u https://mainnet.meet.one:443 get currency balance eosio.token yinmingxuan5
30.0432 EOS
土豪的,好多錢啊:
cleos -u https://mainnet.meet.one:443 get currency balance eosio.token binancecold1
350208884.8429 EOS
如何讓自己的EOS代幣在主流錢包app裡看到
通過上面提到的cloes就可以看到代幣的數量,但是一般人為了使用方便,都用手機app錢包。所以只要錢包app收錄我們的代幣,就能查看代幣餘額信息了,下邊舉兩個例子來說明。
imtoken錢包
如果需要EOS代幣可以顯示,需要按照imtoken的要求,在github上向他提供一個git pull請求,把資料提交上去等待審核。如果需要顯示價格,還需要代幣被block.cc收錄。
具體請參考:
https://github.com/consenlabs/token-profile/blob/master/tutorial/eos-tutorial.zh-CN.md
tokenpocket錢包
這個錢包幾乎所有代幣都能顯示出來,只是沒有審核過的代幣被加上了骷髏頭的圖標。
自己的代幣怎麼才能在主流交易所上幣
創建代幣誰都可以,但是想讓你的代幣上市流通必須讓你的代幣在交易所流通,也就是上幣。
主流交易所上幣條件
上幣條件除了填寫項目資料外,還要交上幣費用。下面是網上洩露的上幣費用表:
幣安20BTC+100BTC保證金;OKEx 0-50萬OKB;火幣50萬HT
可以看到,上幣費有幾百萬人民幣的,如火幣,這都是土豪才能玩呀;也有免費的,如imtoken;還有暢思交易所據說對優秀項目免費上幣。
下面是收500萬上幣費的火幣網的上幣申請條件,搞的像證監會一樣:
去中心的交易所
中心化的交易所,上幣費用,交易費用非常昂貴,所以有人希望有去中心的交易所。這種交易所依附與區塊鏈的智能合約來管理,目前這樣的交易所有:NEWDEX。官方網站為:https://newdex.io
自建交易所需要考慮的幾點
上幣麻煩而且貴,如果自己建一個交易網站交易自己的代幣就好啦。如果自己建交易所,起碼考慮下邊幾點:
- 撮合交易引擎
- 這是交易所最核心的東西。
- 用戶充幣
- 交易所本身得擁有區塊鏈的錢包,用戶交易前先將幣轉入交易所錢包託管,便於交易所撮合交易。
- 用戶提幣
- 用戶可將轉入交易所內屬於自己的幣提出到自己的錢包。
- 安全
- 要保證數字貨幣的安全,即使被攻擊也不能丟幣!
- 高併發
結束語
關於自己發行EOS代幣必須瞭解的,最基礎的東西我們就先講這麼多了。如果你真想開發自己的高逼格的智能合約,肯定還需要深入理解EOS原理才行。歡迎關注我們的同名微信公眾號“麻辣軟硬件”,然後在公眾號內回覆“EOS開發”獲取《深入理解EOS原理與開發實踐》一書,這書還不錯哦。
閱讀更多 麻辣軟硬件 的文章