10岁小表妹也能“吃透”Geth 客户端 !360秒,快速部署 ICO Token
作者 | HaloBlock Official
编译 | kou、Carol
昨天,室友急匆匆找到我,问我如何利用 Geth客户端快速部署 ICO Token,简单交谈之后,我被震惊了。原来这是他 12 岁小表妹近期学习上的疑惑。
无独有偶,就在几天前,在地铁上发呆冥想,一不小心,“偷听”到了销售小姐姐和一个初中 boy 在讨论区块链在线课程。
原来,初中 boy 之前已报名一些区块链课程,觉得内容不是很通俗易懂...
然后,就在昨晚,小编连夜“赶了”一个简易教程,发给了室友,嗯,不知道反馈效果如何,甚是期待。
教程主要包括两部分:
1、本地需求设置,包括 Geth安装、账户创建、区块链创建及交互以及连接节点和设置矿工等;
2、利用标准的 ERC20 Token,使用 Geth 编译可靠性源代码,将智能合约写入区块链,然后发布、挖掘。
详细内容及必须划重点的地方,请往下看。
安装Geth
第一步,当然是要在操作系统中安装一个Geth啦。
如果你是非 MAC 用户,需要使用Linux环境,输入下列代码:
1sudo apt-get install software-properties-common
2sudo add-apt-repository -y ppa:ethereum/ethereum
3sudo apt-get update
4sudo apt-get install ethereum
对于亲爱的 MAC用户,在OS X环境下,代码是这样的:
1brew update
2brew upgrade
3brew tap ethereum/ethereum
4brew install ethereum
接下来,你可以输入 geth –help 来检查 Geth 是否已安装成功。如果此时显示出一些帮助信息,你就可以进行下一步,创建一个新账户。
创建一个新账户
1、利用Geth创建一个新帐户(已有账户者可自行跳过)
输入以下命令:
$ geth account new
Geth将会以全局方式存储你的私钥文件,
然后,根据操作系统类型选择检查位置:
Linux: ~/.ethereum
OSX: ~/Library/Ethereum
如果你要创建一个新帐户,它的公有地址是这样的:
0x2f5e0ff2c960852e76be73b7cff8ea20d42d2ec
检查账号是否创建成功,输入:
$ geth account list
终端会显示当前你已拥有一个账号,账号就创建成功啦。
2、如果你已经拥有一个账号,使用以下命令将私钥文件导入Geth中:
$ geth account import
然后,你只需要按照它的指令去做就可以了。
将私钥文件导入Geth中后,就需要创建 genesis.json 啦!
创建 genesis.json
genesis.json 包含了整个区块链的一系列规则和配置,包括 chainID、difficulty、gasLimit 等。每笔交易完成都将遵循 genesis.json 中的规则。
在这一步中,利用 genesis.json 创建初始区块:只需在此处更改账户地址,再把这个文件存储起来。
1{
2 "config": {
3 "chainID": 1234,
4 "homesteadBlock": 0,
5 "eip155Block": 0,
6 "eip158Block": 0
7 },
8 "alloc": {
9 // Remember to change your address here
10 "<Your account address>": {
11 "balance": "1000000000000000000000000000"
12 }
13 },
14 "difficulty": "0x4000",
15 "gasLimit": "0xffffffff",
16 "nonce": "0x0000000000000000",
17 "coinbase": "0x0000000000000000000000000000000000000000",
18 "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
19 "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
20 "extraData": "0x123458db4e347b1234537c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
21 "timestamp": "0x00"
22}
初始区块创建好之后,接下来,一起来创建一个区块链。
创建一个区块链
如果节点能够完全同步,区块链上的所有区块都将存储在相应节点的本地磁盘中。也就是说,你需要指定一个文件夹来存储整个区块链。
使用以下命令:
$ geth --datadir "./LocalNode1/" init genesis.json
这条命令首先会在当前文件夹中创建一个子文件夹:LocalNode1,然后利用genesis.json 初始化区块链,并将数据文件存储到 LocalNode1中。
(敲黑板!) genesis.json 的路径必须保证是正确的,否则不能正常运行。
如果一切进展顺利,你会收到消息“Successfully wrote genesis state”。在LocalNode1文件夹中,可以找到两个子文件夹 geth 和 keystore,以及另外一个文件 geth.ipc。
LocalNode1文件夹下的文件
区块链已创建好并完成初始化,接下来,与刚创建的区块链进行交互吧!
与区块链进行交互
与刚创建的区块链进行交互,输入以下命令:
$ geth --datadir "./LocalNode1" --networkid 1234 --port 10000 --nodiscover console
该命令指定了以下几点内容:
datadir:用于存储区块的数据文件夹
networkid:必须匹配 genesis.json 中的 chainID
port:占有一个给定的端口
nodiscover:使节点不会自动与其他节点发生交互
添加现有账户
到这一步,在 LocalNode1 文件夹中没有任何帐户。虽然之前创建了一个新帐户,但是由于你正在运行 LocalNode1 中的数据,Geth 无法找到它。为了向 LocalNode1 中添加现有帐户:
打开一个新的命令终端,并输入以下内容:
$ cp ~/.ethereum/keystore/UTC--<rest of account file's
name>pathbeforelocalnode1/LocalNode1/keystore/
现在,请用以下指令检查LocalNode1中的账户:
> personal.listWallets
或者检查账户余额。
> web3.fromWei(eth.getBalance(eth.accounts[0]), "ether");
记住,需要指定genesis.json 中的账户余额为1011。
连接到其他节点
做到这里,你可以打开一个新的终端,在 LocalNode1 文件夹下创建一个名为 LocalNode2 的新文件夹。要想把两个节点相互连接起来,我们需要得到完全相同的区块链信息,因此需要做与旧节点相同的处理。也就是说,新节点应该用 genesis.json 初始化所有信息,并在此区块链中同步所有过去的交易。
创建一个新的数据文件夹,并用 genesis.json 进行初始化:
$ geth --datadir "./LocalNode2/" init genesis.json
打开Geth控制台:
$ geth --datadir "./LocalNode2" --networkid 1234 --port 10001 -- nodiscover console
需要注意,此处的端口号应当与前一个不同。
为节点2创建一个新帐户:
> personal.newAccount()
首先,在节点2的终端中,可以通过以下方式获取节点2的信息:
> admin.nodeInfo.enode
接着,在节点1的终端中,我们通过以下方式添加节点2的信息:
admin.addPeer("enode://123456789...")
然后,用以下指令检查进行连接:
> admin.peers
或者
> net.peerCount
连接成功
好啦,节点连接成功,接下来,我们需要设置矿工,一起去挖矿吧!
设置矿工
矿工是为获得奖励而提供计算能力的节点。每一笔交易都必须由矿工进行挖掘放到一个区块上。因此,会有成千上万的矿工相互竞争以执行交易。有时候,交易提供的 gas 越多,竞争就越激烈。
要设置矿工,只需在节点1的终端中输入以下内容:
> miner.setEtherbase(eth.accounts[0])
这意味着 eth.accounts[0] 不仅扮演着调用者的角色,也会扮演矿工的角色。你当然也可以把其他账户设为矿工。
同样,在节点2的终端上,使用以下命令设置矿工:
> miner.setEtherbase(eth.accounts[0])
到这里,你已经设置好所有本地需求,可以使用Geth在本地开发和测试智能合约啦。利用标准的ERC20 Token,你可以使用Geth编译可靠性源代码,将智能合约写入区块链,然后发布、挖掘。
安装Solidity
Solidity是一种面向合约的高级语言,用于实施智能合约。在Mac上,你可以在终端运行以下命令以安装solidity:
1brew update
2brew upgrade
3brew tap ethereum/ethereum
4brew install solidity
编译一份合约
使用 GitHub 的 HelloCoin.sol 合约,它是一个标准的 ERC20 Token ,具有加密货币的基本功能。
在准备好 HelloCoin.sol 脚本后,运行以下命令进行编译:
1echo "var HelloCoinOutput=`solc --optimize --combined-json
2abi,bin,interface HelloCoin.sol`" > HelloCoin.js
大致来讲,这个命令的作用是在 .jsonformat 中编译 HelloCoin.sol ,将数据分配给 Javascript 变量 HelloCoinOutput ,并且将输出发送到 HelloCoin.js 文件中。
如果我们为这个文件执行 cat 命令(一个 Linux 命令),可以看到编译后的输出数据,包括新生成的字节码和 HelloCoin.sol 的 ABI (应用程序二进制接口)。
而将智能合约写入区块链,实际上是在发布已经编译的字节码,因为EVM会解释并执行字节码中的指令。字节码是驻留在区块链上的代码,ABI为用户提供人类可读的界面,以便与智能合约进行交互。
如果不使用ABI,就必须使用函数的十六进制编码,这就变得比较头大了。
编译后的输出(ABI)
发布合约
在编译源代码并存储输出文件之后,你还要把它加载到 Geth 控制台,以便与智能合约发生进一步交互。
在 Geth 中,加载 HelloCoin.js 的内容:
1 geth --datadir "~/Libarary/LocalNode1" --networkid 1234 --port 11111 --nodiscover console
2...
3 loadScript("HelloCoin.js")
4true
5 HelloCoinOutput
6...
正在加载编译后的数据
就像这样,编译后的智能合约已经加载到 Geth 上了。然后开始运行:
1> HelloCoinContract = web3.eth.contract(JSON.parse(HelloCoinOutput.contracts[“HelloCoin.sol:HelloCoin”].abi));
2...
不出意外的话,Geth 将会解释我们提供的 JSON 文件中的数据,显示如下:
HelloCoin JSON
然后,运行以下指令:
1> personal.unlockAccount(eth.accounts[0])
2...
3> var HelloCoinInst = HelloCoinContract.new(
4{
5 from: eth.accounts[0],
6 data: "0x"+HelloCoinOutput.contracts["HelloCoin.sol:HelloCoin"].bin,
7 gas:4700000
8},
9 function (e, contract) {
10 console.log(e, contract);
11 if (typeof contract.address !== 'undefined') {
12 console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
13 }
14 }
15);
16...
这段代码将会创建一个 Javascript 实例,进而生成一份合约,将合约的所有者设置为 eth.accounts[0],将交易发送至网络,然后等待其他矿工来挖掘合约。如果有矿工挖掘合约,将会增加一个日志
在这里,挖掘的意思是,矿工执行了智能合约字节码,创建了一份合约创建交易,并将其写入区块链。如果没有矿工将此交易挖掘到区块链,则该交易将在矿工系统的交易池中继续处于等待状态,直到有人挖掘为止。
正在发布合约
合约地址由创建者的地址(在本文中为 eth.accounts [0])和一个随机数共同组成,而且一经发布,就不能更改了哦。所以说,在向区块链部署合约之后,再有人想要与此合约发生互动,都必须提供它的地址。
采矿过程模拟
由于你部署的区块链和智能合约都是在本地环境中运行的,你需要自行挖矿。在另一个节点上,使用node2,运行以下命令:
> miner.start()
矿工开采了合约创建交易
然后等待几秒钟,接着运行:
> miner.stop()
一切准备就绪后,智能合约就可以在区块链上发布了!切换到node 1并尝试以下操作:
> HelloCoinTxHash = HelloCoinInst.transactionHash
> eth.getTransactionReceipt(HelloCoinTxHash)
好啦!做到这里,你应该已经收到一个智能合约已成功部署到区块链的消息啦。
对于本文,你还有哪些疑问?或者你有更多更有趣的看法?写在评论区和大家聊聊吧~
原文链接:
https://medium.com/haloblock/tutorial-deploy-your-own-ico-token-using-geth-part-i-9c76bf8cde54
https://medium.com/haloblock/tutorial-deploy-your-own-ico-token-using-geth-part-ii-feae9fbb2ed3
内容转载请联系微信:
qk15732632926(备注:微信公众号+转载)
商务合作请联系微信:
fengyan-1101(备注:区块链大本营+商务合作)
最新热文:
扫码加入区块链大本营读者群,群满加微信 qk15732632926 入群
了解更多区块链技术及应用内容
敬请关注: