区块链私有链搭建和智能合约部署


区块链私有链搭建和智能合约部署


何为私有链

区块链根据访问节点权限大致分为三类,私有链,联盟链,公有链。公有链任何人都可以访问,而私有链只有允许的个人或者单位才能访问,私有链可以方便我们在本地调试区块链和智能合约。

私有链搭建

说实话从入学就一直想入门区块链,去写智能合约,但奈何网络的资源还是太乱了导致怎么都不会搭建环境,最后不了了之。今天选了区块链的课,加上有了区块链项目的想法,就跟着课件走一遍就好了,下面写下笔记。以下内容基于Windows 10。

一、Go环境搭建

不作赘述,自行搜索安装和配置Go。

二、下载/安装Geth

官网链接:https://geth.ethereum.org/downloads/

这里我选择下载安装包,然后无脑安装,安装完应该会帮你配置完环境变量,成功的话命令行输入geth version会有版本信息。

三、创建配置文件

自行选定路径,新建文件夹private_chain并进入该文件夹

private_chain文件下新建data0文件夹和genesis.json文件(实际上名字可以随意)。最后文件夹的结构应该如下,检查下:

1
2
3
private_chain
\-------genesis.json
\-------data0

首先我们新建一个以太坊帐号,命令行输入geth account new --datadir ./data0,提示输入两次密码,这里比如输入123456,实际使用请使用强密码,这样我们得到一个新的帐号,我们需要记下公钥地址0x40bF84817A6Aa60b84597DcbEE8993f1556679dC

实际上新建的帐号都以json文件的形式存储着(虽然无后缀),文件名我们可以看到生成时间和公钥,文件内容有私钥信息,当需要调用时需要密码才能通过验证。因此保存一个帐号要么记住公私钥对要么保存好这个钥匙json。

2021-11-5-1-1.png.png

然后修改genesis.json如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"config": {
"chainId": 2333, //这个id很重要需要记下来,是区分链和链的属性,尽量取大点(1是以太坊公链的id)
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"ethash": {}
},
"difficulty": "2000", //挖矿难度
"gasLimit": "8000000",
"alloc" : {
//初始化一个号的余额,就是我们上面新建的账户的公钥地址
"0x40bF84817A6Aa60b84597DcbEE8993f1556679dC": {
//balance相当于账户余额
"balance": "20000000000000000000"
},
}
}

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我们能看到之前注册的帐号

2021-11-5-1-1.png

输入eth.getBalance(eth.accounts[0])可以看到第一个帐号(其实也就那一个帐号的余额)

image-20211104192447123.png

到这私有链其实就已经建立完成了,下面我们测试下转账

五、测试转账

首先我们再注册一个帐号,控制台输入personal.newAccount(),密码也是123456

image-20211104192710409.png

得到公钥地址0x1cd8499ad410233134A63BabaEbf98f8bA865495,再次使用eth.accounts我们可以看到帐号多了一个

然后要转账的双方就确定了,从天命之子0x029290c564Ef921c56a784AA16C97E930dAF7372(eth.accounts[0])到新建的穷光蛋0x1cd8499ad410233134A63BabaEbf98f8bA865495(eth.accounts[1])

先要解锁支付方的帐号,毕竟要给钱肯定要验证身份,输入personal.unlockAccount(eth.accounts[0]),然后输入密码123456

image-20211104193106005.png

看到true就是验证通过了,我们可以使用这个帐号转钱了,输入eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:200000}),这里的value为转的金额。

image-20211104193321521.png

输入完的话我们只是提交了交易事务(查询账户余额可以发现没变),想要真正的把帐记到区块链上还要挖矿,输入miner.start(1),括号里的1代表一个线程。

等一会可以看到日志里有锤子图标出现,代表已经开挖了,等挖一会可以试着关闭挖矿miner.stop(),看看是否成功。

image-20211104193944672.png

输入eth.getBalance(eth.accounts[0])eth.getBalance(eth.accounts[0])可以看到转账成功。

image-20211104194054143.png

六、使用METAMASK钱包

使用命令行是很nb的样子,但是对用户不是很友好,为了方便帐号管理和简单的汇款,我们可以使用metamask钱包。

metamask是谷歌浏览器的一个插件,可以自行搜索如何安装谷歌浏览器拓展功能。

image-20211104194744656.png

第一次使用该插件会进去选择创建新的助记词,然后就是配置访问密码(这插件的教程可以自行谷歌)。

都搞定后进入钱包就是这个界面

image-20211104195241633.png

这里先放下,为了让钱包连接上我们的私有链我们还需要对区块链进行一些设置,用下面的命令重启私有链

1
geth --http --http.api web3,eth,debug,personal,net --datadir ./data0 --networkid 2333 --allow-insecure-unlock console

image-20211104195521191.png

--http参数表示开启http的api,可以用geth的help命令查看详细用法,不再赘述。这时启动信息会提示IPC的地址为127.0.0.1:8485,我们不指定端口的话就是默认开启在本地8485端口。

接着回到metamask钱包,点击右上角头像左边的以太坊主网络的下拉箭头,选择自定RPC

image-20211104195920348.png

进入到RPC的设置界面,主要是填写RPC URL和链ID两个,其中刚刚启动信息可以看到,注意http协议;后者就是最重要的chainId。

image-20211104200002766.png

存储之后就连接到私有链了。

接着我们导入帐号,比如导入我们的天命之子。点击右上角头像,选择汇入帐号,类型选json,点击选择档案选择我们keystore目录下天命之子对于的密钥文件,最后输入123456密码,点击汇入,卡一会就成功了。

image-20211104200249704.png

点击头像切换到我们刚汇入的帐号,可以看到帐号余额正确

image-20211104200939324.png

这里的ETH是货币单位,实际上帐号余额为59999999999999800000,但换算过去四舍五入了。

以上就是导入帐号的方法,新建帐号和交易也很简单,这里也不写了,自行谷歌。

使用Remix编写和部署智能合约

Remix 是一个编写编译智能合约的IDE,网站:https://remix.ethereum.org/

比起下载整个IDE我觉得还是使用在线的版本舒服,具体怎么配置其实网站也说了。选择左边工具栏的Deploy&run transaction,ENVIRONMENT选择Web3 Provider后弹出提示

image-20211104201830842.png

第二个框框里的就是我们需要附加的启动参数,再组合一次就得到我们的终极启动命令:

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可以看到选择成功而且可以选帐号和看到帐号余额了,说明已经连接上了。

image-20211104-7-2.png

接下来试着部署合约,在左侧工具栏选择file expolorers,打开contracts文件夹,打开1_Storage.sol文件(这个示例合约作用就是存储一个数字),默认是会自动编译的(左侧工具栏选择Solidity complier可以选择参数编译)。然后左侧工具栏选择Deploy&run transaction,选择我们要部署这份合约的帐号,然后选择初始的GAS费用,选择正确的合约文件,在按下Deploy之前请先回去geth控制台输入personal.unlockAccount(eth.accounts[0], "123456")获得帐号使用权,毕竟初始的GAS费用也是从账号里扣的。

part7.png

最后按下Deploy按钮,查看日志我们可以看到创建合约的请求已经发起了,接下来和转账一样需要挖矿达成共识。

image-20211104203729836.png

挖了一会我们返回Remix可以看到下方的控制台提示部署成功了

UNP19FH5___EA_LA8_9Q_ZO.png

同时Deploy&run transaction栏下方也出现了合约信息

part7-1.png

点击合约前面的小方框展开合约,可以看到两个方法store和retrieve,前者负责存数字,后者负责获取这个数字。

先回去geth解锁一下帐号,然后回来在store那个输入框填入数字后按下store就会提交时间到区块链上,在开挖后就会正式存储这个数字。

part7-3.png

image-20211104-7-8.png

之后我们点击retrieve按钮调用retrieve函数获取值,查询的话就不需要开挖了

image-20211104-7-9.png

part7-5.png

到此如何用Remix部署合约就结束了,实际上还可以用Remix编译得到字节码然后手动在geth部署,但真的不推荐,毕竟太麻烦。

后语

接下来就要去学编写智能合约了,语法可以看官网,学下Solidity,说实话这玩意还挺怪的,特别是以为自己学过js和go无敌,但一些特性又特别反人类,哎。还有就是注意合约编写的严谨性和安全性,业务逻辑和平时写的服务器程序可以说有很多不同。

先写到这,也算是入门区块链了。