Windows平台下以太坊私有链搭建及钱包部署和运行

【安装环境准备】

一、安装Ethereum-Wallet

(1)在E盘新建文件夹Eth,专门放置以太坊开发环境

(2)把下载的Ethereum-Wallet-win64-0-11-1.zip压缩包win-unpacked解压到C:Eth目录下

二、安装geth

(1)geth下载:https://ethereum.github.io/go-ethereum/downloads/

(2)安装geth,安装在C:Eth 目录下

 

(3)在C:Eth目录下创建privatechain文件,用以存放区块链数据。

 接下来就可以看到Eth文件夹下的我们放的所有东西

【以太坊私有链搭建】

一、创建第一个节点

1)在E:Eth 目录下创建创世块文件genesis.json,文件内容如下:

{
  "nonce": "0x0000000000000042",
  "difficulty": "0x40000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x0000000000000000000000000000000000000000",
  "timestamp": "0x00",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
  "gasLimit": "0xffffffff",
  "alloc": {
    "3282791d6fd713f1e94f4bfd565eaa78b3a0599d": {
      "balance": "1337000000000000000000"
    },
    "17961d633bcf20a7b029a7d94b7df4da2ec5427f": {
      "balance": "229427000000000000000"
    }
  },
  "config": {
        "chainId": 15,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    }
}

(2)打开cmd,进入C:Eth 目录下(该目录下有geth.exe和genesis.json文件,便于运行geth命令),创世块文件初始化命令如下:

geth -datadir "%cd%privatechain
ode1" init genesis.json

执行该命令后会在C:Ethprivatechain下自动新建node1文件夹,并在node1下生成geth和keystore两个文件夹。其中geth存放的是区块信息,keystore中存放的是账户信息。

初始化完成以后你就拥有一条自己的私有链了,之后就可以启动自己的私有链进行一些操作。

(3)打开geth控制台:

geth -datadir "%cd%chain" console

(4)创建新账户,密码为liuxixi1,用以下代码来启动私有链的挖矿:

personal.newAccount('liuxixi1')

此时会返回一个账户地址

 (5) 输入exit,退出控制台

 (6)重新启动私有链节点

geth --targetgaslimit 4294967295 --rpc --rpcport "8101" --port "30301" --rpcapi "eth,web3,personal" --networkid 2020 --identity 2020 --nodiscover --maxpeers 5 --datadir "%cd%privatechain
ode1" --unlock 0 --rpccorsdomain "*" console
注释:

--targetgaslimit:每个块的gas上限,这里可以暂时理解为容量

--rpc:启动rpc通信,可以进行智能合约的部署和调试

--rpcaddr:rpc接口的地址

--rpcport:rpc接口的端口号

--port:网络监听端口,用于节点之间通信

--rpcapi:设置rpc的范围,暂时开启eth,web3,personal足够

--networkid:设置当前区块链的网络ID,是一个数字,可以随便写

--identity:区块链的标示,随便填写,用于标示目前网络的名字

--nodiscover:禁止被网络中其它节点发现,需要手动添加该节点到网络

--maxpeers:最大节点数量

--datadir:设置当前区块链网络数据存放的位置

--unlock:解锁某用户(此处用用户坐标来控制,解锁后的用户调用接口发起交易时,不要需要提供密码),0代表存储在账号数组中的第一个账号,如果一开始没有创建账号,改参数可以去掉,不然会报错,找不到该账号。

--rpccorsdomain:限制rpc访问源的ip,代表不限制

--mine:允许挖矿

--console:启动命令行模式,可以在Geth中执行命令*

192.xx.xx:要改为自己的IP

  

  该命令的主体是geth consoal,表示启动该节点并进入交互控制台。其中--networkid 2020 表示私有链的网络id。网络id在连接到其他接点时也会用到。以太坊公网的id是1,为了不产生冲突,这里要指定自己的网络id。

 然后输入刚建的账户密码:liuxixi1

 (7)进入C:Ethwin-unpacked ,运行Ethereum Wallet.exe ,若果出现版本更新窗口,不用理它,关掉就行了

点击启动

 

 可以看到上面都显示的0,因为还没有开始挖矿,是没有以太币的。

创建两个账号

  点击”ADD ACCOUNT” 按钮,添加一个钱包,程序会弹出一个对话框,提示输入两遍密码,输入完密码后,账号即创建成功。创建其他的账号,一样的操作,从上面的截图可以看到,有三个账号,一个是MAIN ACCOUNT,一个是ACCOUNT2,一个是ACCOUNT3

 

 

挖矿获取一些以太币

账号创建后,还没有以太币,需要在私有链上挖矿,切换到Geth界面,输入

miner.start(1)

miner命令括号中的1表示用一个线程进行挖矿,如果不配置,就会让CPU全速运行,影响计算机的使用。

 

运行一会后,主账号就会获取很多以太币,这个时候屏幕会快速刷屏,不用管,输入命令miner.stop()停止挖矿。

 这里就可以看Aain account已经有余额了

将一个用户的以太币转给另一个用户

先点击ACCOUNT2账号,进入账号详情的界面,点击右侧的“COPY address”,把ACCOUNT2的地址拷贝下来,系统会提示你现在你处在一个测试网络,不要转入真正的以太币到这个账号。

 Account 2地址:0xd4B8b428aA6D0135Ae0E70AF6805004acace9114

点击钱包中“SEND”按钮,从MAINACCOUNT给ACCOUNT2转入一定以太币,同时可以看到执行这笔交易的费用是0.000378个以太币。

 

 点击发送后会提示如输入密码,但这时还没有发送成功,根据区块链的交易规则,需要矿工的确认,并且每笔交易需要确认12个块,一个块是16秒的生成时间。切换到Geth程序,输入挖矿命令,直到ACCOUNT2上显示100个以太币,然后停止挖矿。

 如下图看到账户2还未有以太币

输入挖矿命令进行挖矿

 由上图看到账户2已经有以太币了 说明转账成功!然后停止挖矿

部署智能合约

 点“CONTRACTS”,进入智能合约管理界面,点击“DEPOLY NEW CONTRACT”,开始部署智能合约,

 选择部署智能合约的账号,并输入智能合约的代码后,如下图

pragma solidity ^0.4.18;
contract SimpleStorage {
uint storedData;
function set(uint x)public {
storedData= x;
 }
function get() public constant returns (uint) {
return storedData;
}
}

 

输入完毕后点击“DEPLOY”,系统会提示输入账号密码,因为部署智能合约是需要费用的。

 这个时候是看不到部署的智能合约的,切换到Geth界面,进行挖矿,在12个块后,智能合约就能确认并显示出来。

运行智能合约

点击DEPLOY NEW CONTRACT,部署合约

选择智能合约发起账户,这里选择Main account, 合约以太币数量填0,其他智能合约的运行也是一样,无非就是函数多点,输入多点。

复制solidity语言编写的智能合约代码,选择需要部署的智能合约。

pragma solidity ^0.4.18;
contract MyToken{
    /*在合约中使用public关键字定义所有能被别的合约访问的变量*/
    string public name;
    string public symbol;
    uint8 public decimals;

    /*建立一个数组存储账户的余额*/
    mapping (address => uint256) public balanceOf;

    /*建立一个公共的事件用于用户通知*/
    event Transfer(address indexed from, address indexed to, uint256 value);

    /*初始化合约,当合约内的函数名和合约名相同时(MyToken),则该函数是合约的构造函数*/
    function MyToken(uint256 _supply, string _name, string _symbol, uint8 _decimals) public 
    {
        /*默认将股份分为10000份,即股权的最小单位是0.01%*/
        if (_supply == 0) _supply = 1000000;

        /*可自定义股权数量和最小单位*/
        balanceOf[msg.sender] = _supply;

        /*定义股权名称*/
        name = _name;

        /*设定股权所使用的单位符号,例如%*/
        symbol = _symbol;

        /*设定小数位数*/
        decimals = _decimals;
    }

    /*创建股权转移函数*/
    function transfer(address _to, uint256 _value) public {
        /*检验是否有足够的股权*/
        if (balanceOf[msg.sender] < _value) require(balanceOf[msg.sender] > _value);
        if (balanceOf[_to] + _value < balanceOf[_to]) require(balanceOf[_to] + _value > balanceOf[_to]);

        /*更新股权转让信息*/
        balanceOf[msg.sender] -= _value;
        balanceOf[_to] += _value;

        /*通知用户股权转让成功,并将数据写入区块链*/
        Transfer(msg.sender, _to, _value);
    }

 

 

 输入账户密码确认,然后部署

当智能合约得到区块确认,说明智能合约被保存到区块中,部署智能合约成功

调用智能合约

回到主页面,点击CONTRACTS,

点击进入智能合约,点击进入刚才部署的智能合约 

智能合约页面的函数以及函数参数,以及执行

main account地址:0x7A280bEf63e47a18c129E4676929E92Dc06897CA

ACCOUNT2地址:0xd4B8b428aA6D0135Ae0E70AF6805004acace9114

 点击EXECUTE执行,发送交易输入密码进行确认

挖矿后,Main account的股权占比变为90%,ACCOUNT2的股权占比变为10%

 

原文地址:https://www.cnblogs.com/xixi3/p/12604405.html