查看原文
其他

10岁小表妹也能“吃透”Geth 客户端 !360秒,快速部署 ICO Token

区块链大本营 区块链大本营 2018-10-26



作者 | 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)

编译后的输出(bytecode)



发布合约


在编译源代码并存储输出文件之后,你还要把它加载到 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...
3var 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 入群





了解更多区块链技术及应用内容

敬请关注:

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存