主页 > imtoken钱包苹果版用不了 > 以太坊私有链建立、合约编写、部署

以太坊私有链建立、合约编写、部署

imtoken钱包苹果版用不了 2023-02-19 06:53:42

--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;

}

}

游戏结束!!!!