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)

编译后的输出(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...
 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(备注:区块链大本营+商务合作)

原文发布于微信公众号 - 区块链大本营(blockchain_camp)

原文发表时间:2018-08-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏区块链入门

【财务安全】如何使用imToken钱包进行离线签名

注: 使用你的联网手机是热钱包, 用来观察钱包, 未联网手机作为冷钱包用作离线签名授权

842
来自专栏智能计算时代

Ethereum - 以太坊项目

以太坊项目进一步扩展了区块链网络的能力,从交易延伸为智能合约(Smart Contract)。 其官网首页为 ethereum.org。 简介 根据以太坊官方的...

2857
来自专栏区块链入门

第十三课 如何在DAPP应用实现自带钱包转账功能?

区块链是一个伟大的发明,它改变了生产关系。很多生态,有了区块链技术,可以由全公司员工的"全员合伙人"变成了全平台的”全体合伙人”了,是真正的共享经济模式。

1476
来自专栏深入浅出区块链技术

如何编写一个可升级的智能合约

区块链信任基础的数据不可修改的特性,让它传统应用程序有一个很大的不同的地方是一经发布于区块链上就无法修改(不能直接在原有的合约上直接修改再重新发布)。

1691
来自专栏区块链大本营

【附代码】如何在私有链上编写、部署与以太坊进行交互的智能合约

40112
来自专栏极客编程

java程序员使用web3j进行以太坊开发详解

如何使用web3j为Java应用或Android App增加以太坊区块链支持,教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,...

1911
来自专栏区块链源码分析

比特币源码分析之一:总览

本文主要讲解比特币源码,下一篇文章会介绍比特币交易是如何通过非对称加密机制来完成安全交易的,欢迎大家互动留下问题和希望讲解的题目。

81617
来自专栏丑胖侠

以太坊Geth几种同步模式

同步模式分类 –fast Enable fast syncing through state downloads –light Enable light cli...

5009
来自专栏FreeBuf

利用树莓派探索以太坊第一部分:环境搭建

在本系列文章的第一部分中,我们将在一台树莓派Pi 3 Model B上安装并运行一个以太坊区块链客户端。 ? 毫无疑问,区块链绝对是当前的热点。之所以会这样,...

4346
来自专栏华仔的技术笔记

如何在Spectrum公链上开发Dapp?

Spectrum光谱链是由Ethereum以太坊的链发展而来,所以是完全兼容以太坊。 但是又有不同,主要是共识机制不同,二级架构layer2不同,更加兼容移动...

1182

扫码关注云+社区