使用以太坊创建自己的私链,部署一个简单的智能合约,以及遇到问题备忘

将以下信息备忘,方便以后查询。

1、 git clone https://github.com/ethereum/go-ethereum.git 下载速度很慢,直接下载源码包拷贝到环境中解压。
使用tar命令解压,提示错误,改用unzip解压
2、make geth
3、make all
4、cd build/bin
5、./geth version

WARN [09-13|00:04:31.170] Sanitizing cache to Go’s GC limits
provided=1024 updated=324
Geth
Version: 1.8.16-unstable
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.11
Operating System: linux
GOPATH=/usr/local/go
GOROOT=/usr/local/go
// 关于account的命令 : new , list ,update,import
6、./geth account new
输入密码
{50cc5eade81dbb4735f0f57cad08ce90b3cd487a}
{054050b65923b4d0e700bc064f0b4f1d7e054259}
7、./geth account list

初始化一个自己的私链// 这里最好通过puppeth(使用make all编译会生成所有的工具,包括puppeth)来配置gensis.json。
1、在bin目录下创建newgen.json //注意:chainid 为0 的情况会导致后续无法交易,一直提示费用不足。 以下json是从网上找的,实际使用时通过puppeth自己配置的。在测试中发现,在我的机器上使用POW共识特别慢,还会存在一些其他的问题。实际上是使用POA共识挖矿的,使用puppeth配置的时候需要选择共识算法。 由于POA挖矿无奖励,需要在json中预置余额。
{
“config”: {
“chainId”: 1108,
“homesteadBlock”: 0,
“eip155Block”: 0,
“eip158Block”: 0
},
“alloc” : {},
“coinbase” : “0x0000000000000000000000000000000000000000”,
“difficulty” : “0x20000”,
“extraData” : “”,
“gasLimit” : “0x2fefd8”,
“nonce” : “0x0000000000000042”,
“mixhash” : “0x0000000000000000000000000000000000000000000000000000000000000000”,
“parentHash” : “0x0000000000000000000000000000000000000000000000000000000000000000”,
“timestamp” : “0x00”
}
2、创建prichain目录,创建prichain/data0目录 mkdir prichain & mkdir prichain/data0
3、初始化chain
./geth --datadir prichain/data0 init newgen.json
//删除原来创世块,如下:
geth removedb --datadir chain1
然后再次执行如下命令,即可创建创世块成功。这样可保留原来的账户信息
geth --datadir chain1 init genesis.json
4、启动chain ,使用console表示启动节点并进入交互控制台
1108 是网络id,在连接其他节点的时候回用到。
这里可以添加 -nodiscover参数,用于关闭P2P的自动发现
./geth --datadir prichain/data0 --networkid 1108 console
5、查看用户 eth.accounts ,由于是新创建的私链无账户,创建账户:personal.newAccount() //注意区分大小写

6、查询账户余额
eth.getBalance(eth.accounts[0]) 或者直接用账号地址
7、开始挖矿 miner.start() //使用poa挖矿,在之前配置使用puppeth配置json的时候可以填写区块 生成的时间间隔,默认是15s。随着挖矿的进行,会出现账号被锁的提示导致挖矿失败,personal.unlockAccount(address)解锁账户。 这里可以通过第4步启动的时候添加–unlock参数来保证账户不被锁
8、新建console,通过./geth attach prichain/data0/geth.ipc 附加到启动的私链上
9、挖矿出现successfully sealed new block 说明挖矿成功了。
10、eth.getBalance(eth.accounts[0])查看余额。
11、进行交易,交易前查看钱包状态:personal.listWallets,发现两个钱包状态status:“Locked”
先解锁账户 personal.unlockAccount(eth.accounts[0])
12、解锁账户后进行交易,eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(1,‘ether’)})
13、此时查看交易内存池,txpool,可以看到有未打包的交易,此时两个账号余额没有发生变化。
14、等待挖矿成功后,查询eth.getBalance(eth.accounts[1])余额为1
15、查看区块数和区块信息:eth.blockNumber eth.getBlock(2) , 其中2为第二个区块,1为第一个区块,0即创世区块。
16、可以通过交易hash查询交易信息,eth.getTransaction(hash) ,此处hash为交易hash,不是区块hash
或者使用eth.getTransactionReceipt(hash)进行查询

17、配置多节点的时候需要使用同一个poa.json进行初始化
增加–port 30310 -rpcport 30311 来修改端口
然后通过admin.addPeer(nodeInfoenode)来添加节点。//nodeInfoenode 来自前面节点的admin.nodeInfo.enode

18、智能合约
1、编写solidity
pragma solidity ^0.4.7;
contract test {
function multiply(uint a) returns(uint d) {
return a * 7;
}
}
2、使用remix编译,通过details获取 contract 和 data值
//[{“constant”:false,“inputs”:[{“name”:“a”,“type”:“uint256”}],“name”:“multiply”,“outputs”:[{“name”:“d”,“type”:“uint256”}],“payable”:false,“stateMutability”:“nonpayable”,“type”:“function”}]
//0x608060405234801561001057600080fd5b5060bb8061001f6000396000f300608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b348015604f57600080fd5b50606c600480360381019080803590602001909291905050506082565b6040518082815260200191505060405180910390f35b60006007820290509190505600a165627a7a72305820b68f8d10b203be82347b5647417672c925c5ddfaa870adde5bac525b3b18a9d80029
3、abi = 上面的contract值
4、创建合约:multiplyContract = eth.contract(abi)
5、解锁账户,personal.unlockAccount(address)
6、部署合约 multiply = multiplyContract.new({from:address,data:“第二步中的data”,gas:30000}) //从测试情况看,不指定gas,会导致最后调用结果不正确。
7、此时txpool有未打包交易,挖矿打包合约
8、开始调用合约:获取合约对象,MyContract = eth.contract(abi)
9、实例化合约 myContract = MyContract.at(multiply.address) ,输出信息中address需要有值
10、调用合约:myContract.multiply.call(5)。 multiply是函数名,返回结果为35。 如果此处返回0,可以查看下第6步中是否指定了gas。
或者 myContract.multiply.sendTransaction(5,{from:address})

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值