区块链私有链搭建和智能合约部署
何为私有链
区块链根据访问节点权限大致分为三类,私有链,联盟链,公有链。公有链任何人都可以访问,而私有链只有允许的个人或者单位才能访问,私有链可以方便我们在本地调试区块链和智能合约。
私有链搭建
说实话从入学就一直想入门区块链,去写智能合约,但奈何网络的资源还是太乱了导致怎么都不会搭建环境,最后不了了之。今天选了区块链的课,加上有了区块链项目的想法,就跟着课件走一遍就好了,下面写下笔记。以下内容基于Windows 10。
一、Go环境搭建
不作赘述,自行搜索安装和配置Go。
二、下载/安装Geth
官网链接:https://geth.ethereum.org/downloads/
这里我选择下载安装包,然后无脑安装,安装完应该会帮你配置完环境变量,成功的话命令行输入geth version
会有版本信息。
三、创建配置文件
自行选定路径,新建文件夹private_chain
并进入该文件夹
在private_chain
文件下新建data0
文件夹和genesis.json
文件(实际上名字可以随意)。最后文件夹的结构应该如下,检查下:
1 | private_chain |
首先我们新建一个以太坊帐号,命令行输入geth account new --datadir ./data0
,提示输入两次密码,这里比如输入123456,实际使用请使用强密码,这样我们得到一个新的帐号,我们需要记下公钥地址0x40bF84817A6Aa60b84597DcbEE8993f1556679dC
实际上新建的帐号都以json文件的形式存储着(虽然无后缀),文件名我们可以看到生成时间和公钥,文件内容有私钥信息,当需要调用时需要密码才能通过验证。因此保存一个帐号要么记住公私钥对要么保存好这个钥匙json。
然后修改genesis.json
如下:
1 | { |
genesis.json
文件负责配置创世区块的数据
四、创建私有链
创建完genesis.json
后我们就可以开始创世了,private_chain
文件夹下打开命令行,输入
1 | geth --datadir ./data0 init ./genesis.json |
成功后data0
文件夹下会多出一些文件,其中keystore
文件夹负责存储我们的帐号
然后启动节点,当前文件夹下输入:(注意networkid和配置中的chainId一致)
1 | geth --datadir ./data0 --networkid 2333 console |
然后我们成功进入了控制台,可以看到Welcome to the Geth JavaScript console!
输入 eth.accounts
我们能看到之前注册的帐号
输入eth.getBalance(eth.accounts[0])
可以看到第一个帐号(其实也就那一个帐号的余额)
到这私有链其实就已经建立完成了,下面我们测试下转账
五、测试转账
首先我们再注册一个帐号,控制台输入personal.newAccount()
,密码也是123456
得到公钥地址0x1cd8499ad410233134A63BabaEbf98f8bA865495
,再次使用eth.accounts
我们可以看到帐号多了一个
然后要转账的双方就确定了,从天命之子0x029290c564Ef921c56a784AA16C97E930dAF7372
(eth.accounts[0])到新建的穷光蛋0x1cd8499ad410233134A63BabaEbf98f8bA865495
(eth.accounts[1])
先要解锁支付方的帐号,毕竟要给钱肯定要验证身份,输入personal.unlockAccount(eth.accounts[0])
,然后输入密码123456
看到true就是验证通过了,我们可以使用这个帐号转钱了,输入eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:200000})
,这里的value为转的金额。
输入完的话我们只是提交了交易事务(查询账户余额可以发现没变),想要真正的把帐记到区块链上还要挖矿,输入miner.start(1)
,括号里的1代表一个线程。
等一会可以看到日志里有锤子图标出现,代表已经开挖了,等挖一会可以试着关闭挖矿miner.stop()
,看看是否成功。
输入 eth.getBalance(eth.accounts[0])
和 eth.getBalance(eth.accounts[0])
可以看到转账成功。
六、使用METAMASK钱包
使用命令行是很nb的样子,但是对用户不是很友好,为了方便帐号管理和简单的汇款,我们可以使用metamask钱包。
metamask是谷歌浏览器的一个插件,可以自行搜索如何安装谷歌浏览器拓展功能。
第一次使用该插件会进去选择创建新的助记词,然后就是配置访问密码(这插件的教程可以自行谷歌)。
都搞定后进入钱包就是这个界面
这里先放下,为了让钱包连接上我们的私有链我们还需要对区块链进行一些设置,用下面的命令重启私有链
1 | geth --http --http.api web3,eth,debug,personal,net --datadir ./data0 --networkid 2333 --allow-insecure-unlock console |
--http
参数表示开启http的api,可以用geth的help命令查看详细用法,不再赘述。这时启动信息会提示IPC的地址为127.0.0.1:8485,我们不指定端口的话就是默认开启在本地8485端口。
接着回到metamask钱包,点击右上角头像左边的以太坊主网络的下拉箭头,选择自定RPC
进入到RPC的设置界面,主要是填写RPC URL和链ID两个,其中刚刚启动信息可以看到,注意http协议;后者就是最重要的chainId。
存储之后就连接到私有链了。
接着我们导入帐号,比如导入我们的天命之子。点击右上角头像,选择汇入帐号,类型选json,点击选择档案选择我们keystore目录下天命之子对于的密钥文件,最后输入123456密码,点击汇入,卡一会就成功了。
点击头像切换到我们刚汇入的帐号,可以看到帐号余额正确
这里的ETH是货币单位,实际上帐号余额为59999999999999800000,但换算过去四舍五入了。
以上就是导入帐号的方法,新建帐号和交易也很简单,这里也不写了,自行谷歌。
使用Remix编写和部署智能合约
Remix 是一个编写编译智能合约的IDE,网站:https://remix.ethereum.org/
比起下载整个IDE我觉得还是使用在线的版本舒服,具体怎么配置其实网站也说了。选择左边工具栏的Deploy&run transaction,ENVIRONMENT选择Web3 Provider后弹出提示
第二个框框里的就是我们需要附加的启动参数,再组合一次就得到我们的终极启动命令:
1 | geth --http --http.corsdomain="https://remix.ethereum.org" --http.api web3,eth,debug,personal,net --vmdebug --datadir ./data0 --networkid 2333 --allow-insecure-unlock console 2>> log.txt |
最后的console 2>> log.txt 是消息重定向,把控制台的信息存到log.txt里,毕竟之前我们可以看到这日志挺烦的,也是为了备份吧。
这样启动了之后再回去Remix选择Web3 Provider可以看到选择成功而且可以选帐号和看到帐号余额了,说明已经连接上了。
接下来试着部署合约,在左侧工具栏选择file expolorers,打开contracts文件夹,打开1_Storage.sol文件(这个示例合约作用就是存储一个数字),默认是会自动编译的(左侧工具栏选择Solidity complier可以选择参数编译)。然后左侧工具栏选择Deploy&run transaction,选择我们要部署这份合约的帐号,然后选择初始的GAS费用,选择正确的合约文件,在按下Deploy之前请先回去geth控制台输入personal.unlockAccount(eth.accounts[0], "123456")
获得帐号使用权,毕竟初始的GAS费用也是从账号里扣的。
最后按下Deploy按钮,查看日志我们可以看到创建合约的请求已经发起了,接下来和转账一样需要挖矿达成共识。
挖了一会我们返回Remix可以看到下方的控制台提示部署成功了
同时Deploy&run transaction栏下方也出现了合约信息
点击合约前面的小方框展开合约,可以看到两个方法store和retrieve,前者负责存数字,后者负责获取这个数字。
先回去geth解锁一下帐号,然后回来在store那个输入框填入数字后按下store就会提交时间到区块链上,在开挖后就会正式存储这个数字。
之后我们点击retrieve按钮调用retrieve函数获取值,查询的话就不需要开挖了
到此如何用Remix部署合约就结束了,实际上还可以用Remix编译得到字节码然后手动在geth部署,但真的不推荐,毕竟太麻烦。
后语
接下来就要去学编写智能合约了,语法可以看官网 ,学下Solidity,说实话这玩意还挺怪的,特别是以为自己学过js和go无敌,但一些特性又特别反人类,哎。还有就是注意合约编写的严谨性和安全性,业务逻辑和平时写的服务器程序可以说有很多不同。
先写到这,也算是入门区块链了。