主页 > imtoken钱包苹果版用不了 > 以太坊私有链建立、合约编写、部署
以太坊私有链建立、合约编写、部署
--rpcport:指定HTTP-RPC服务监听端口号(默认8545);
--datadir:指定区块链数据的存放位置;
--port:指定用于连接其他节点的端口号(默认为30303);
--nodiscover:关闭节点发现机制,防止加入初始配置相同的陌生节点。
执行上面的命令,你应该看到如下信息:
INFO [10-1503:14:50] IPC端点打开:/Users/liyuechun/Desktop/1015/privchain/geth.ipc
信息 [10-1503:14:50] HTTP 端点已打开::8545
如果切换到 data1 文件夹,您将看到 geth、geth.ipc 和密钥库。
liyuechun:1015 yuechunli$ cd data1/
liyuechun:data1 yuechunli$ ls
gethgeth.ipc 密钥库
liyuechun:data1 yuechunli$
保持节点运行,不要关闭终端,重新打开一个终端,使用geth attach连接节点,打开geth控制台
liyuechun:privchain yuechunli$ geth attach ipc:/Users/liyuechun/Desktop/1015/privchain/geth.ipc
欢迎使用 Geth JavaScript 控制台!
实例:geth/v1.7.1-stable-05101641/darwin-amd64/go1.9.1
模块:admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 shh:1.0 txpool:1.0 web3:1.0
>
这是一个交互式 JavaScript 执行环境,可以在其中执行 JavaScript 代码,其中 > 是命令提示符。 在这个环境中,还内置了一些操作以太坊的JavaScript对象,可以直接使用这些对象。 这些对象主要包括:
eth:包含一些操作区块链相关的方法;
net:包含一些查看p2p网络状态的方法;
admin:包含一些与管理节点相关的方法;
miner:包含一些启动和停止挖矿的方法;
personal:主要包括一些管理账户的方法;
txpool:包含一些查看交易内存池的方法;
web3:包含了上面的对象,也包含了一些单位换算的方法。
3.相关api命令
浏览账户
> personal.listAccounts
[]
>
创建账户
> personal.newAccount('李月春')
“0xb6d7d842e7dc9016fa6900a183b2be26fc90b2d8”
>
PS:里面的liyuechun是你账号的密码,输入你喜欢的密码。
浏览账户
> personal.listAccounts
[“0xb6d7d842e7dc9016fa6900a183b2be26fc90b2d8”]
>
4. web3命令
> web3.eth.coinbase
“0xb6d7d842e7dc9016fa6900a183b2be26fc90b2d8”
>
5. 编写智能合约代码
pragma solidity ^0.4.4;
合同测试{
函数乘法(uint a)返回(uint d){
返回 * 7;
}
}
6.获取智能合约字节码和abi
代码被复制进去,编译,字节码和ABI被复制。
字节码
6060604052341561000f57600080fd5b5b60ab8061001e6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa114603d575b600080fd5b3415604757600080fd5b605b60048080359060200190919050506071565b6040518082815260200191505060405180910390f35b60006007820290505b9190505600a165627a7a7230582067d7c851e14e862886b6f53dad6825135557fb3a4b691350c94ea5b80605f6770029
阿比
[
{
“常数”:真实的,
“输入”:[
{
"姓名": "一个",
“类型”:“uint256”
}
],
“名称”:“相乘”,
“输出”:[
{
“名字”:“d”,
“类型”:“uint256”
}
],
“应付”:假的,
“类型”:“功能”,
“stateMutability”:“视图”
}
]
7.在bejson中转义为字符串
[{\"常数\":true,\"输入\":[{\"名称\":\"a\",\"类型\":\"uint256\"}],\"名称\": \"multiply\",\"outputs\":[{\"name\":\"d\",\"type\":\"uint256\"}],\"payable\":false,\" type\":\"function\",\"stateMutability\":\"view\"}]
7.通过abi创建合约对象
> var abi = JSON.parse('[{\"constant\":true,\"inputs\":[{\"name\":\"a\",\"type\":\"uint256\" }],\"name\":\"multiply\",\"outputs\":[{\"name\":\"d\",\"type\":\"uint256\"}],\ "payable\":false,\"type\":\"function\",\"stateMutability\":\"view\"}]')
> myContract = web3.eth.contract(abi)
{
阿比:[{
常量:假,
输入:[{...}]以太坊开源代码,
名称:“相乘”,
输出:[{...}],
应付款:假的,
类型:“功能”
}],
伦理:{
帐户:[“0x2abf46d8b0d940cdeedd55872bc0648add40227d”],
区块编号:384,
币库:“0x2abf46d8b0d940cdeedd55872bc0648add40227d”,
编译:{
lll:函数(),
蛇:函数(),
坚固性:功能()
},
默认帐户:未定义,
默认块:“最新”,
天然气价格:0,
哈希率:0,
采矿:假的,
待交易: [],
协议版本:“0x3f”,
同步:假,
调用:函数(),
契约:函数(abi),
估计气体:函数(),
过滤器:函数(fil,回调),
getAccounts:函数(回调),
获取余额:函数(),
获取块:函数(),
getBlockNumber:函数(回调),
getBlockTransactionCount: 函数(),
getBlockUncleCount: 函数(),
获取代码:函数(),
getCoinbase:函数(回调),
获取编译器:函数(),
getGasPrice: 函数(回调),
getHashrate:函数(回调),
getMining:函数(回调),
getPendingTransactions:函数(回调),
getProtocolVersion:函数(回调),
getRawTransaction:函数(),
getRawTransactionFromBlock: 函数(),
getStorageAt:函数(),
getSyncing:函数(回调),
getTransaction:函数(),
getTransactionCount:函数(),
getTransactionFromBlock:函数(),
getTransactionReceipt:函数(),
getUncle: 函数(),
得到工作:函数(),
伊班:功能(伊班),
icapNamereg:函数(),
正在同步:函数(回调),
名称注册:函数(),
重新发送:函数(),
sendIBANTransaction:函数(),
发送原始交易:函数(),
发送交易:函数(),
符号:函数()以太坊开源代码,
signTransaction:函数(),
提交交易:函数(),
提交工作:函数()
},
在:功能(地址,回调),
获取数据:函数(),
新:功能()
}
8.查看coinbase账户余额
> account1 = web3.eth.coinbase
“0x2abf46d8b0d940cdeedd55872bc0648add40227d”
> web3.eth.getBalance(account1)
>
如果余额大于0,则继续,否则,开始挖矿。
> miner.start();
无效的
>
在挖矿过程中,切换到节点终端,会发现挖矿一直在进行。
矿业
如果您认为差不多完成了,您可以运行以下命令停止挖矿。
矿工。 停止();
9.停止挖矿并查看余额
> miner.start();
无效的
> miner.stop();
真的
> web3.eth.getBalance(account1)
1.152e+21
>
10.解锁coinbase账户,我们使用coinbase账户支付部署合约的费用
liyuechun:换成你的密码。
> personal.unlockAccount(account1, '李月春')
真的
>
11.预估手续费
> bytecode = "6060604052341561000f57600080fd5b5b60ab8061001e6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa114603d575b600080fd5b3415604757600080fd5b605b60048080359060200190919050506071565b6040518082815260200191505060405180910390f35b60006007820290505b9190505600a165627a7a7230582067d7c851e14e862886b6f53dad6825135557fb3a4b691350c94ea5b80605f6770029"
"6060604052341561000f57600080fd5b5b60ab8061001e6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa114603d575b600080fd5b3415604757600080fd5b605b60048080359060200190919050506071565b6040518082815260200191505060405180910390f35b60006007820290505b9190505600a165627a7a7230582067d7c851e14e862886b6f53dad6825135557fb3a4b691350c94ea5b80605f6770029"
> web3.eth.estimateGas({数据:字节码})
错误:参数 0 无效:json:无法将没有 0x 前缀的十六进制字符串解组到 hexutil.Bytes 类型的 Go 结构字段 CallArgs.data 中
在 web3.js:3104:20
在 web3.js:6191:15
在 web3.js:5004:36
在:1:1
> bytecode = "0x6060604052341561000f57600080fd5b5b60ab8061001e6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa114603d575b600080fd5b3415604757600080fd5b605b60048080359060200190919050506071565b6040518082815260200191505060405180910390f35b60006007820290505b9190505600a165627a7a7230582067d7c851e14e862886b6f53dad6825135557fb3a4b691350c94ea5b80605f6770029"
"0x6060604052341561000f57600080fd5b5b60ab8061001e6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa114603d575b600080fd5b3415604757600080fd5b605b60048080359060200190919050506071565b6040518082815260200191505060405180910390f35b60006007820290505b9190505600a165627a7a7230582067d7c851e14e862886b6f53dad6825135557fb3a4b691350c94ea5b80605f6770029"
> web3.eth.estimateGas({数据:字节码})
98391
>
备注:需要在字节码前加0x。 手续费约为98391gas。
12.部署合约,为了方便理解,设置一个回调函数
> contractInstance = myContract.new({data: bytecode gas: 1000000, from: account1}, function(e, contract){
如果(!e){
如果(!合同。地址){
console.log("合约交易发送:交易哈希:"+contract.transactionHash+"等待被挖掘...");
}别的{
console.log("合约挖矿!地址:"+contract.address);
安慰。 日志(合同);
}
}别的{
安慰。 日志(e)
}
})
合约交易发送:交易哈希:0x5e2aebbf400d71a32e807dc3f11f1053b6ee3b2a81435ed8ace2fa54eebb9f3d 等待开采...
{
阿比:[{
常量:假,
输入:[{...}],
名称:“相乘”,
输出:[{...}],
应付款:假的,
类型:“功能”
}],
地址:未定义,
事务哈希:“0x5e2aebbf400d71a32e807dc3f11f1053b6ee3b2a81435ed8ace2fa54eebb9f3d”
}
>
13. 你的合约正在等待挖矿,开始挖矿,稍等片刻,停止
> miner.start()
无效的
> 合同开采! 地址:0xbf8b24283f2516360d3a4ba1db0df78ae74689db
[对象对象]
> miner.stop()
真的
>
14.查看合约是否部署成功
> eth.getCode(contractInstance.address)
"0x60606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa114603d575b600080fd5b3415604757600080fd5b605b60048080359060200190919050506071565b6040518082815260200191505060405180910390f35b60006007820290505b9190505600a165627a7a7230582067d7c851e14e862886b6f53dad6825135557fb3a4b691350c94ea5b80605f6770029"
>
15.调用合约方法
> 合同实例。 相乘(6)
42
>
PS:这里之所以加上call是因为multiply函数没有加常量。
pragma solidity ^0.4.4;
合同测试{
函数乘法(uint a)返回(uint d){
返回 * 7;
}
}
游戏结束!!!!