主页 > imtoken钱包和tp钱包对比 > 以太坊本地私有链开发环境搭建
以太坊本地私有链开发环境搭建
以太坊本地私有链开发环境搭建
以太坊本地私有链开发环境搭建完成! 通过本文介绍的方法和项目中的脚本,我们可以快速搭建自己的私有链进行开发和测试。
存储库中包含的工具是:
一个测试账户导入脚本以太坊的节点相当于什么,在第一次部署时将五个测试账户私钥导入以太坊节点。
一个genesis.json配置文件为对应的五个测试账户提供初始资金(以太币),方便开发测试。
快速启动私有区块链节点并进入交互模式的脚本。
示例合约:contracts/Token.sol。 这是一个用合约语言 Solidity 编写的智能合约。 Token合约的作用是发行一种代币(可以理解为货币、积分等),只有合约的创建者才有发行权,代币的拥有者才有使用权和转让权钱自由。
测试账号的私钥是Github上的公开数据以太坊的节点相当于什么,不得在正式环境和公链上使用。 如果您在测试环境之外的任何地方使用这些私钥,您的资金就会被盗!
准备
在本地安装好 go-ethereum 和 solc 后,就可以执行 geth 和 solc 命令了。 如果操作系统是ubuntu,直接安装以太坊官方安装包即可。
通过git clone命令将这个仓库下载到本地。
安装 expect,它被工具脚本用来自动化一些流程。 例如在 ubuntu 上:sudo apt-get install expect
开始geth
进入仓库目录:cd ethereum-bootstrap
导入测试账号私钥:
启动私链节点:启动成功后,可以看到类似如下的输出:
此时以太坊交互控制台已经启动,我们可以开始测试和开发了。
注意:工具脚本假定你的geth安装在默认位置,可以直接通过geth执行。 如果 geth 命令安装在非标准位置,您可以设置 geth 环境变量来指定 geth 可执行文件的路径。 例如:
GETH=/some/weird/dir/geth
使用以太坊控制台编译和部署智能合约
在contracts目录下有一个智能合约示例文件Token.sol,通过Solidity语言实现了基本的token功能。 合约持有人可以发行代币,用户可以相互转账。
我们可以使用以太坊控制台来编译和部署这个合约。 以太坊控制台是最基本的工具,用起来会比较麻烦。 社区还提供了其他更方便的部署工具,这里不再赘述。
第一步是将合约代码压缩成一行。 新建一个ssh会话,切换到geth用户环境su-geth,然后输入:cat contracts/Token.sol | tr 'n' ' '。
切换到以太坊控制台,将合约代码保存为变量:
var tokenSource='contract Token { 地址发行者; 映射(地址=> uint)余额; 事件发行(地址账户,单位数量); 事件转移(地址从,地址到,单位金额); function Token() { issuer=msg .sender; } function issue(address account, uint amount) { if (msg.sender !=issuer) throw; 余额[账户] +=金额; } function transfer(address to, uint amount) { if (balances[msg.sender] < amount) throw; 余额[msg.sender] -=金额; 余额[至] +=金额; 转移(消息。发件人,至,金额); } function getBalance(address account) constant returns (uint) { return balances[account]; } } }';
然后编译合约代码:
var tokenCompiled=web3.eth.compile.solidity(tokenSource);
通过tokenCompiled.Token.code可以看到编译后的二进制代码,通过tokenCompiled.Token.info.abiDefinition可以看到合约的ABI。
接下来,我们需要将编译好的合约部署到网络中。
首先,我们使用 ABI 在 javascript 环境中创建一个合约对象:
var contract=web3.eth.contract(tokenCompiled.Token.info.abiDefinition);
我们通过合约对象来部署合约:
var initializer={from: web3.eth.accounts[0], data: tokenCompiled.Token.code, gas: 300000};
var callback = function(e, contract){
如果(!e){
如果(!合同。地址){
console.log("合约交易发送:TransactionHash: " + contract.transactionHash + "等待被挖掘...");
} 别的 {
console.log("合约挖矿!");
安慰。 日志(合同);
}
}
};
var 令牌 = 合同。 新的(初始化器,回调);
contract.new 方法的第一个参数设置了新合约创建者的地址,新合约的代码数据,以及创建新合约的成本。 gas.gas是一个预估值,只要超过需要的gas即可,合约创建后,剩余的gas会返还给合约创建者。
contract.new 方法的第二个参数设置了一个回调函数,告诉我们部署是否成功。
contract.new 执行时会提示输入钱包密码。 执行成功后,我们的合约Token已经广播到网络中了。 这时候我们只需要等待矿工将我们的合约打包保存到以太坊区块链中,部署就完成了。
在公链上,矿工打包平均需要15秒。 在私有链上,我们需要自己来做。 首先开始挖矿:
矿工开始(1)
此时需要稍等片刻,以太坊节点会生成挖矿所需要的数据,这些数据会放在内存中。 数据生成后,就会开始挖矿,稍后你可以在控制台输出中看到这样的东西。 :
:hammer: 开采块
信息,这意味着一个区块已经被开采,并且合约已经部署在以太坊网络上! 此时我们可以关闭挖矿:
矿工。 停止(1)
接下来,我们可以调用合约。 首先通过token.address获取部署合约的地址,可以在新建合约对象时使用。 这里我们直接使用原来的合约对象:
// 本地钱包首地址持有的token数量
> token.getBalance(web3.eth.accounts[0])
// 向本地钱包首地址发行100个代币
> token.issue.sendTransaction(web3.eth.accounts[0], 100. {来自: web3.eth.accounts[0]});
I1221 11:48:30.512296 11155 xeth.go:1055] Tx(0xc0712460a826bfea67d58a30f584e4bebdbb6138e7e6bc1dbd6880d2fce3a8ef) 至:0x37dc85ae639ec39556ae27
“0xc0712460a826bfea67d58a30f584e4bebdbb6138e7e6bc1dbd6880d2fce3a8ef”
// 发行token是一个交易,所以需要挖矿才能生效
> miner.start(1)
:hammer: 开采块
> miner.stop(1)
// 再次查询本地钱包首地址的token数量
> token.getBalance(web3.eth.accounts[0])
100
// 从本地钱包的第一个地址向第二个地址转30个代币
> token.transfer.sendTransaction(web3.eth.accounts[1], 30. {来自: web3.eth.accounts[0]})
I1221 11:53:31.852541 11155 xeth.go:1055] Tx(0x1d209cef921dea5592d8604ac0da680348987b131235943e372f8df35fd43d1b) 至:0x37dc852acc239ec39595a
“0x1d209cef921dea5592d8604ac0da680348987b131235943e372f8df35fd43d1b”
> miner.start(1)
> miner.stop(2)
> token.getBalance(web3.eth.accounts[0])
70
> token.getBalance(web3.eth.accounts[1])
30
其他
私有链的所有数据都会放在仓库根目录下的data目录下。 删除该目录可以清除所有数据并重新启动新环境。
做完这些,你应该对以太坊私链上的发展有了一个大概的了解。 如果你想了解更多,你可以看看上面执行的脚本代码。 它到底做了什么? 哪个命令行参数,第二,可以去看看ethfans上正在更新的solidity文档的中文版。
如果您想对炒币、新币、挖矿收益有全面深入的了解,可以添加我们的官方微信公众号进行更详细深入的沟通交流。 同时,我们可以邀请您到我们的公众号社区进行深入的学习和交流。 一级市场也有不少粉丝和币友。 其中一些是行业领导者和专业玩家。 他们的经验和知识都非常丰富,能够解答大家的疑问。 联系我们的客服申请加盟。