作者 | 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(备注:区块链大本营+商务合作)


最新热文:

  • 硬! 他是Intel视频业务老大, 用个谷歌视频还被要高价,开始了他的区块链反击, 这回一怼就是仨

  • 别小看实干者,传统行业怎么了?欧洲能源一哥照样用区块链玩转2B的生意 | 人物志

  • 40000%通货膨胀,总统险些被杀,第三代加密货币却被他们玩转了

  • 27亿美金被狂撸!这些年,被狠狠抽脸的8次区块链安全祸事儿

扫码加入区块链大本营读者群,群满加微信 qk15732632926 入群



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

敬请关注:

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

  1. 10岁男孩开灯睡觉骨龄发育慢4年上热搜,开灯睡觉都有什么危害?

    衡宇 发自 凹非寺 量子位 | 公众号 QbitAI 连夜追完最新恐怖片,不敢关灯睡觉. 不知道你是否有过类似经历? 最近,有小朋友因睡觉不关灯致骨龄发育慢,上了热搜. 这名来自郑州的10岁小患者,身 ...

  2. 10岁就发布了5款App,被库克约见的小男孩长什么样

    当你的孩子还在沉迷王者农药,坑着队友的时候,10岁的他已经有5款App上架了. Yuma,6岁就开始编程. 学完了斯坦福大学的免费编程课. 之后的4年,给苹果开发了5款App,全部上架了. 他以&qu ...

  3. 10岁就发布了5款App,受邀WWDC的小男孩长什么样

    在玩泥巴的年龄就拥有梦想并实现了,是怎样一种体验. Yuma,6岁就开始编程. 学完了斯坦福大学的免费编程课. 之后的4年,给苹果开发了5款App,全部上架了. 他以"最年轻开发者" ...

  4. 38岁李光洁二婚小10岁娇妻晒近照,长相甜美颜值高

    李光洁晒找回的电脑,并感谢做好事的乘客,而网友发现了李光洁电脑上可爱的心型的贴纸,十分显眼.正巧,在今年李光洁迎来了人生的喜事,和1991年出生的隋雨蒙结婚,这次结婚也是李光洁的第二次结婚,两个人的年 ...

  5. c语言小红今年12岁小明13岁,[转载]三年级下“创新思维数学讲义”——年龄问题...

    三年级下"创新思维数学讲义"-- 年龄问题 邵 玲 热身场 相传,乾隆皇帝下江南时,遇到了一位老寿星.老人鹤发童颜,精神焕发,乾隆皇帝当即赠一上联给老人,写的是:"花甲重 ...

  6. (转)IT人员必读10个小故事

    (转)IT人员必读10个小故事 1. 从前,有两个饥饿的人得到了一位长者的恩赐:一根鱼竿和一篓鲜活硕大的鱼.其中,一个人要了一篓鱼,另一个人要了一根鱼竿,于是他们分道扬镳了.得到鱼的人原地就用 干柴搭 ...

  7. 和12岁小同志搞创客开发:手撕代码,做一款遥控灯

    机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html ...

  8. 和12岁小同志搞创客开发:手撕代码,做一款数字骰子

    机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html ...

  9. 和12岁小同志搞创客开发:手撕代码,做一款节拍电子鼓

    机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html ...

  10. 和12岁小同志搞创客开发:手撕代码,做一款亮度可调节灯

    目录 1.PWM呼吸灯 2.亮度可调节灯 机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/ca ...

最新文章

  1. 以下用于数据存储领域的python第三方库是-南开《网络爬虫与信息提取》19秋期末考核题目【标准答案】...
  2. 简单多进程任务处理程序
  3. QT学习-核心类列表-30、QtSerialPort
  4. 【活动(深圳)】告别2018之12.22 大湾区.NET Meet 大会 ,同时有网络直播
  5. C++ STL list构造
  6. LINUX下用C判断一个进程是否活着
  7. JAVA窗口——Frame
  8. iOS自带的GPS 定位
  9. 四招搞定托业(TOEIC)英语阅读
  10. 常见杀软对应的进程名
  11. log4cxx vs2019编译
  12. mac php pear pecl,MacOSX安装pecl - 米扑博客
  13. Arduino Uno 与 触摸模块 ttp223 实验详录
  14. 在 2040 年前,实现净零碳排放
  15. 阿里云服务器docker安装网心云容器魔方
  16. 【100%通过率】华为OD机试真题 Java 实现【猜字谜】【2022.11 Q4 新题】
  17. ue4导入倾斜摄影_一种基于Smart3D倾斜摄影技术输出实际地形等高线的方法与流程...
  18. fastapi 参数
  19. Android USB 扫码枪获取扫描内容
  20. 一文弄懂区块链技术原理

热门文章

  1. 2021.1.6寒假打卡Day3
  2. sh股票是什么意思?
  3. 光纤耦合系统的公差分析
  4. easyui分页查询为什么会有下拉框_Easyui 添加分页组件_EasyUI 教程
  5. mysql 从删库到跑路
  6. Vite 使用TSX/JSX
  7. 鏈接腳本、靜態庫、共享庫
  8. c语言定义浮点变量i和j,2012年计算机等级考试二级C语言基础教程:数据类型、变量和运算符...
  9. 有备无患!DBS高性价比方案助力富途证券备份上云
  10. 中兴zxr10路由器重启命令_ZXR10路由器基本操作和配置.doc