前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >10岁小表妹也能“吃透”Geth 客户端 !360秒,快速部署 ICO Token

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

作者头像
区块链大本营
发布2018-08-15 16:02:08
7660
发布2018-08-15 16:02:08
举报
文章被收录于专栏:区块链大本营区块链大本营
作者 | 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创建一个新帐户(已有账户者可自行跳过)

输入以下命令:

代码语言:javascript
复制
$ geth account new

Geth将会以全局方式存储你的私钥文件,

然后,根据操作系统类型选择检查位置:

  • Linux: ~/.ethereum
  • OSX: ~/Library/Ethereum

如果你要创建一个新帐户,它的公有地址是这样的:

代码语言:javascript
复制
0x2f5e0ff2c960852e76be73b7cff8ea20d42d2ec

检查账号是否创建成功,输入:

代码语言:javascript
复制
$ geth account list

终端会显示当前你已拥有一个账号,账号就创建成功啦。

2、如果你已经拥有一个账号,使用以下命令将私钥文件导入Geth中:

代码语言:javascript
复制
$ geth account import

然后,你只需要按照它的指令去做就可以了。

将私钥文件导入Geth中后,就需要创建 genesis.json 啦!

创建 genesis.json

genesis.json 包含了整个区块链的一系列规则和配置,包括 chainID、difficulty、gasLimit 等。每笔交易完成都将遵循 genesis.json 中的规则。

在这一步中,利用 genesis.json 创建初始区块:只需在此处更改账户地址,再把这个文件存储起来。

代码语言:javascript
复制
 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}

初始区块创建好之后,接下来,一起来创建一个区块链。

创建一个区块链

如果节点能够完全同步,区块链上的所有区块都将存储在相应节点的本地磁盘中。也就是说,你需要指定一个文件夹来存储整个区块链。

使用以下命令:

代码语言:javascript
复制
$ geth --datadir "./LocalNode1/" init genesis.json

这条命令首先会在当前文件夹中创建一个子文件夹:LocalNode1,然后利用genesis.json 初始化区块链,并将数据文件存储到 LocalNode1中。

(敲黑板!) genesis.json 的路径必须保证是正确的,否则不能正常运行

如果一切进展顺利,你会收到消息“Successfully wrote genesis state”。在LocalNode1文件夹中,可以找到两个子文件夹 geth 和 keystore,以及另外一个文件 geth.ipc。

LocalNode1文件夹下的文件

区块链已创建好并完成初始化,接下来,与刚创建的区块链进行交互吧! 与区块链进行交互

与刚创建的区块链进行交互,输入以下命令:

代码语言:javascript
复制
$ geth --datadir "./LocalNode1" --networkid 1234 --port 10000 --nodiscover console

该命令指定了以下几点内容:

  • datadir:用于存储区块的数据文件夹
  • networkid:必须匹配 genesis.json 中的 chainID
  • port:占有一个给定的端口
  • nodiscover:使节点不会自动与其他节点发生交互

添加现有账户

到这一步,在 LocalNode1 文件夹中没有任何帐户。虽然之前创建了一个新帐户,但是由于你正在运行 LocalNode1 中的数据,Geth 无法找到它。为了向 LocalNode1 中添加现有帐户:

打开一个新的命令终端,并输入以下内容:

代码语言:javascript
复制
$ cp ~/.ethereum/keystore/UTC--<rest of account file's
name>pathbeforelocalnode1/LocalNode1/keystore/

现在,请用以下指令检查LocalNode1中的账户:

代码语言:javascript
复制
> personal.listWallets

或者检查账户余额。

代码语言:javascript
复制
> web3.fromWei(eth.getBalance(eth.accounts[0]), "ether");

记住,需要指定genesis.json 中的账户余额为1011。

连接到其他节点

做到这里,你可以打开一个新的终端,在 LocalNode1 文件夹下创建一个名为 LocalNode2 的新文件夹。要想把两个节点相互连接起来,我们需要得到完全相同的区块链信息,因此需要做与旧节点相同的处理。也就是说,新节点应该用 genesis.json 初始化所有信息,并在此区块链中同步所有过去的交易。

创建一个新的数据文件夹,并用 genesis.json 进行初始化:

代码语言:javascript
复制
$ geth --datadir "./LocalNode2/" init genesis.json

打开Geth控制台:

代码语言:javascript
复制
$ geth --datadir "./LocalNode2" --networkid 1234 --port 10001 -- nodiscover console

需要注意,此处的端口号应当与前一个不同。

为节点2创建一个新帐户:

代码语言:javascript
复制
> personal.newAccount()

首先,在节点2的终端中,可以通过以下方式获取节点2的信息:

代码语言:javascript
复制
> admin.nodeInfo.enode

接着,在节点1的终端中,我们通过以下方式添加节点2的信息:

代码语言:javascript
复制
> admin.addPeer("enode://123456789...")

然后,用以下指令检查进行连接:

代码语言:javascript
复制
> admin.peers

或者

代码语言:javascript
复制
> net.peerCount

连接成功

好啦,节点连接成功,接下来,我们需要设置矿工,一起去挖矿吧!

设置矿工

矿工是为获得奖励而提供计算能力的节点。每一笔交易都必须由矿工进行挖掘放到一个区块上。因此,会有成千上万的矿工相互竞争以执行交易。有时候,交易提供的 gas 越多,竞争就越激烈。

要设置矿工,只需在节点1的终端中输入以下内容:

代码语言:javascript
复制
> miner.setEtherbase(eth.accounts[0])

这意味着 eth.accounts[0] 不仅扮演着调用者的角色,也会扮演矿工的角色。你当然也可以把其他账户设为矿工。

同样,在节点2的终端上,使用以下命令设置矿工:

代码语言:javascript
复制
> miner.setEtherbase(eth.accounts[0])

到这里,你已经设置好所有本地需求,可以使用Geth在本地开发和测试智能合约啦。利用标准的ERC20 Token,你可以使用Geth编译可靠性源代码,将智能合约写入区块链,然后发布、挖掘。

安装Solidity

Solidity是一种面向合约的高级语言,用于实施智能合约。在Mac上,你可以在终端运行以下命令以安装solidity:

代码语言:javascript
复制
1brew update
2brew upgrade
3brew tap ethereum/ethereum
4brew install solidity

编译一份合约

使用 GitHub 的 HelloCoin.sol 合约,它是一个标准的 ERC20 Token ,具有加密货币的基本功能。

在准备好 HelloCoin.sol 脚本后,运行以下命令进行编译:

代码语言:javascript
复制
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 的内容:

代码语言:javascript
复制
1$ geth --datadir "~/Libarary/LocalNode1" --networkid 1234 --port 11111 --nodiscover console
2...
3> loadScript("HelloCoin.js")
4true
5> HelloCoinOutput
6...

正在加载编译后的数据

就像这样,编译后的智能合约已经加载到 Geth 上了。然后开始运行:

代码语言:javascript
复制
1> HelloCoinContract = web3.eth.contract(JSON.parse(HelloCoinOutput.contracts[“HelloCoin.sol:HelloCoin”].abi));
2...

不出意外的话,Geth 将会解释我们提供的 JSON 文件中的数据,显示如下:

HelloCoin JSON

然后,运行以下指令:

代码语言:javascript
复制
 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,运行以下命令:

代码语言:javascript
复制
> miner.start()

矿工开采了合约创建交易

然后等待几秒钟,接着运行:

代码语言:javascript
复制
> miner.stop()

一切准备就绪后,智能合约就可以在区块链上发布了!切换到node 1并尝试以下操作:

代码语言:javascript
复制
> 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(备注:区块链大本营+商务合作)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 区块链大本营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装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
  • 创建一个新账户
  • 创建 genesis.json
  • 创建一个区块链
  • 区块链已创建好并完成初始化,接下来,与刚创建的区块链进行交互吧! 与区块链进行交互
  • 添加现有账户
  • 连接到其他节点
  • 设置矿工
  • 安装Solidity
  • 编译一份合约
  • 发布合约
  • 采矿过程模拟
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档