美文网首页
geth客户端搭建及智能合约的部署

geth客户端搭建及智能合约的部署

作者: ag4kd | 来源:发表于2019-10-16 19:18 被阅读0次

智能合约

Solidity smart contract wrapper

1 创世区块

image.png

1.1 创世区块文件genesis.json

{
    "config":{
        "chainId":15,
        "homesteadBlock":0,
        "eip155Block":0,
        "eip158Block":0
    },
    "coinbase":"0x0000000000000000000000000000000000000000",
    "difficulty":"0x40000",
    "extraData":"",
    "gasLimit":"0xffffffff",
    "nonce":"0x0000000000000042",
    "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
    "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
    "timestamp":"0x00",
    "alloc":{

    }
}

1.2 执行创建创世区块命令

geth --datadir "privateChain" init genesis.json

1.3 进入控制台

image.png

(下次可直接进入控制台)

geth --datadir "privateChain" console

输入exit可以退出控制台。

1.4 查看账户信息

personal.listAccounts

或者

eth.accounts

1.5 创建账户

1.5.1 创建一个账户。密码设置为789

personal.newAccount("passowrd")

1.5.2 同时会输出地址

0xc4d205f1d0c0edcc1c69390a96b6fe16c6cf65c4

1.5.3 定义一个变量addr0,方便后面使用

addr0 = "0xc4d205f1d0c0edcc1c69390a96b6fe16c6cf65c4"

1.5.4 再创建一个账号

personal.newAccount("passowrd")

1.5.5 同时会输出其地址

0xe8c48bf1c6ad70a8751898da6a898bfcec7e1334

1.5.6 定义一个变量addr1,方便后面使用

addr1 = "0xe8c48bf1c6ad70a8751898da6a898bfcec7e1334"
image.png

1.6 查询余额

web3.eth.getBalance(addr0)

或者

eth.getBalance(eth.accounts[0])

现在查询到的余额为0

2 挖矿

开始挖矿

miner.start()

挖一个区块

admin.sleepBlocks(1)

停止挖矿

miner.stop()

2.1 同步执行上述代码

miner.start();admin.sleepBlocks(1);miner.stop()

产生一个区块3分多钟,一个区块奖励5个ETH


image.png

2.2 再次查询余额

eth.getBalance(eth.accounts[0])
image.png
addr0的余额为5000000000000000000wei,即5ETH
[图片上传失败...(image-f1b3a-1571224710528)]

3 转账

3.1 创建一个金额变量amount,额度为1个ETH,转账的以wei作为基本单位

amount = web3.toWei(1)

3.2 从addr0转给addr11一个ETH

eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})

出现一个错误,解锁即可


image.png

3.3 解锁出账账户,解锁时需要密码789

personal.unlockAccount(eth.accounts[0])
image.png

或者

personal.unlockAccount(eth.accounts[0],"789");

或者,也可以为账号设置解锁有效时间10000秒,传第3个参数,秒级参数,如:

personal.unlockAccount(eth.accounts[0],"789",10000);

3.4 紧接着查询转账后的余额

image.png

结果余额并没有变动。

一笔交易发送出去,并不会立即返回交易的变动信息。需要区块打包完成后,才能查询到结果。

3.5 需要挖矿打包这笔交易,将这笔交易信息打包到新的区块中。

miner.start();admin.sleepBlocks(1);miner.stop()
image.png

那个null是个什么鬼。。。。

3.6 再次查询余额,发现新的区块打包后,又把奖励给了addr0

image.png

addr1 = 1000000000000000000(18个0)

addr0 = 9000000000000000000(18个0)

4 合约部署

在部署合约前需要先解锁账户(就像银行转账要输入密码一样),解锁操作参考 3.3小节。

解锁成功后,账户就准备完毕啦,接下来就是编写合约代码。

4.1 编写合约代码

pragma solidity ^0.4.0;

contract SimpleStorage {
    uint storedData;

    function set(uint x) public {
        storedData = x;
    }

    function get() public view returns (uint) {
        return storedData;
    }
}

浏览器中编译合约代码

image.png
var simplestorageContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]);
var simplestorage = simplestorageContract.new(
   {
     from: web3.eth.accounts[1], 
     data: '0x6060604052341561000f57600080fd5b60d38061001d6000396000f3006060604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c14606e575b600080fd5b3415605857600080fd5b606c60048080359060200190919050506094565b005b3415607857600080fd5b607e609e565b6040518082815260200191505060405180910390f35b8060008190555050565b600080549050905600a165627a7a723058205716ac70f9ebadb10d8a3d10a0b40b9abbf4343f3c709084b86d9f129c9709500029', 
     gas: '4700000'
   }, function (e, contract){
    console.log(e, contract);
    if (typeof contract.address !== 'undefined') {
         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
 })

部署成功后,控制台输出如下

Contract mined! address: 0x0ebb2886e4c38e4ed7a0ba43fe6cee46939c7d8a transactionHash: 0x4344ee2d82f1193aa98ee2d9d40a48504de0967e05403cf728171f290ced723b

现在我们查看下新账户的余额,可以看到余额有所变化

eth.getBalance(eth.accounts[1])

调用合约函数

simplestorage.set()
simplestorage.get()

相关文章

网友评论

      本文标题:geth客户端搭建及智能合约的部署

      本文链接:https://www.haomeiwen.com/subject/mkoumctx.html