【安装环境准备】
一、安装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%