当时做这个作业时找了很多资料,写一下关于这个作业的过程吧。
内容:
以太坊的安装、私有链创世区块搭建、私有链节点的加入
对getBlock中所得区块的各个字段进行解释
对日志输出进行解释
编写简单的智能合约,在remix下进行调试,并部署在链上进行调用
对交易的字段进行解释
实现:
- 以太坊的安装
使用了geth作为以太坊客户端。
- 私有链创世区块搭建
要先创建一个genesis.json文件,内容如下:
其中参数解释如下:
然后运行以下命令初始化:
接着启动私有链,运行以下命令:geth --datadir data0 --networkid 1108 --nodiscover console 2>>geth.log
--datadir 代表文件夹地址,
--nodiscover 代表该链条不希望被其他节点发现,
--networkid 示这个私有链的网络id为1108,网络id在连接到其他节点的时候会用到
console >> geth.log 代表将控制台输出到文件geth.log中去
- 私有链节点的加入
我们通过通过分享enode地址的方式来让两个节点建立链接。
新建一个节点:
使用不同的端口,记得要加—ipcdisable参数,否则会报错,因为同时打开两个geth进程:
两个不同结点命令
geth --datadir data0 --networkid 1108 --nodiscover --ipcdisable console 2>>geth.log
geth --datadir data1 --networkid 1108 --nodiscover --ipcdisable --port 30304 console 2>>other.log
用addpeers加进来
这样就连接上了
- getBlock()所得区块的各个字段解释
difficulty:大小4字节,存储格式为 难度系数的HASH值,该字段标记着当前区块被“挖”出来的难度(哈希碰撞出来的难度);
ExtraData:与此区块相关的附加数据
asLimit:当前区块允许使用的最大gas。
gasUsed:当前区块累计使用的gas。
Hash:区块的哈希值。如果区块没有被确认,这个字段会是null值。
LogsBloom:区块日志的布隆过滤器,区块没被确认是值为null
Miner:取得该区块记账权的矿工。
mixhash:与nonce配合用于挖矿,由上一个区块的一部分生成的hash。
Nonce:大小4字节,当前区块工作量证明(Proof of Work)的参数(是以一坨0开头的数),存储格式为Hash值。hash计算的目标值,改值随机。当“矿机”节点经过Hash计算出的值为该随机数时,即为“挖矿”初步成果(经过后续六个区块的认证之后,才是真正的成果,终态)
Number:区块号
parentHash:前一个区块的哈希值
receiptsRoot:收据树的根哈希值
Sha3Uncles:数据块的哈希值
size: 区块大小
stateRoot:区块状态树的根哈希
Timestamps:大小4字节,核心字段,自1970-01-01T00:00 UTC之后开始的秒数;
totaldifficulty:截止到本块的链上总难度
transactions:交易对象数组
transactionsRoot:交易的区块数根哈希值
Uncles:叔哈希的数组
- 对日志输出进行解释
这个我乱写的,略
- 编写简单的智能合约,在 remix 下进行调试
用remix编译一个简单的智能合约,如果找不到编译器,记得使用v*n,因为似乎有部分功能被墙了
Run:在run中点击deploy后就会显示可以调用的函数
重新启动私有链,要在geth上加上rpc,将environment改成web3
geth --datadir data0 --networkid 1108 --rpc --rpcaddr 0.0.0.0 --rpcport 8545 --rpcapi "admin,debug,eth,miner,net,personal,shh,txpool,web3" --rpccorsdomain "*" --nodiscover --ipcdisable console 2>>geth.log
解锁账号,否则不能部署
personal.unlockAccount(eth.accounts[0],"密码",0)
要先挖矿赚钱,否则没钱部署。。。
然后点击deploy,需要注意的是remix似乎不支持带有library的合约。
在geth上调用合约
remix有一个复制abi的按钮(见下图),地址就在上图可以找到,abi要化为一行(百度查看在线json压缩)
成功了!
- 对交易的字段进行解释
在两个账号间发送一笔交易
字段意思就不列了,接下来有时间的话可能会更新使用truffle.js部署一个带有library的智能合约。