主页 > imtoken客户端 > 6.2 以太坊应用

6.2 以太坊应用

imtoken客户端 2023-03-22 06:12:24

2021-08-05

6.2.1 测试链和私有链

以太坊是一条公共链。 官方不仅提供了主链,还提供了测试链。 不过对于想进一步了解以太坊结构的读者来说,就有点不方便了。 如果是在主链上使用,有以下几个问题:

1)以太坊上的转账交易或智能合约部署需要消耗以太坊,显然不适合开发测试需要;

2)以太坊公链的运营节点遍布全球。 即使使用测试链,运行速度也达不到实验级别的要求,不方便控制网络中的每一个节点;

3)对于公链的使用,只是通过客户端直接连接,但是看不到网络是怎么搭建的,很多细节看不到;

4)如果只是想在某些场合使用以太坊搭建本地网络,类似于局域网,一定不要直接使用公链。

基于以上原因,我们有必要自己搭建一条测试链。 由于这条测试链通常运行在用户自己的局域网中,一般不对公网开放,所以这条测试链也被称为私有链。 在本节中,我们将演示如何使用以太坊客户端构建私有链。 以下过程在 MacOS 上完成。 如果您在 Linux 或 Windows 上操作,过程是相同的。

工欲善其事,必先利其器。 要做私有链,首先要准备好工具。 准备材料如下:

1)以太坊核心客户端可在官网下载。 我们使用官方推荐的Go语言版本geth,下载版本为1.6.5。 为了操作方便,可以将geth放在系统的环境变量目录下。 Go语言版本,所以请确保机器已经安装了Go运行环境;

2)创建一个数据目录来配置私有链,我们命名为ethprivate;

3)为创世块准备一个初始化文件,我们命名为genesis.json,放在ethprivate目录下,内容如下:

{

“配置”:{

“链号”:15,

“家园块”:0,

“eip155块”:0,

“eip158块”:0

},

"难度": "200000000",

"gasLimit": "2100000",

“分配”:{

“7df9a875a174b3bc565e6424a0050ebc1b2d1d82”:{“余额”:“300000”},

“f41c74c9ae680c1aa78f42e5647a62f353b7bdde”:{“余额”:“400000”}

}

}

可以看出,主要配置了初始难度值和两个初始钱包地址及其余额。 你可以根据自己的需要设置这些值。 这里需要注意的是,如果使用的geth客户端版本不是1.6.x而是1.5.x(比如1.5.9),配置文件中一定不能有config部分,否则会报错。

接下来,创建一个私有链。 创建过程非常简单。 进入ethprivate目录,执行以下命令:

geth --datadir "./" init genesis.json

在命令中,数据目录由datadir参数指定。 这里指定了当前目录,即ethprivate目录。 执行命令后可以看到在ethprivate目录下生成了两个子目录:一个是geth; 另一个是密钥库。 创建完成后,我们就可以启动私有链了,命令如下:

geth --datadir "./" --networkid 989898 --rpc console --port 0

可以看到这里指定了networkid,开启了rpc服务。 当然,参数不限于这些。 更多参数应用可以参考geth命令的帮助。 如果要指定端口,可以执行如下启动命令:

geth --datadir "./" --networkid 989898 --rpc console --port 30304 --rpcport 8546

启动成功后默认进入命令控制台,可通过命令和私链节点访问。 我们可以通过admin.nodeInfo命令查看节点摘要信息。 请注意,我们现在只启动了一个节点。 如果需要启动第二个节点,步骤同上。 新建一个文件夹,将genesis.json复制到该目录下,然后运行初始化和启动节点命令。 是的,需要注意的是必须指定不同的端口,否则可能会出现端口占用冲突。 如果创建了多个节点,可以通过admin.addPeer将节点连接起来,可以在本地启动多个节点,也可以在不同的电脑上运行,这样就可以模拟一个私有链网络。

在节点启动后的控制台中,可以进行各种操作。 其实就是调用以太坊节点的RPC服务。 例如,要创建一个新的帐户地址,您可以使用以下命令:

个人的。 新账户

创建账户后,就可以开始挖矿了。 挖矿命令如下:

//开始挖矿

miner.start()

// 停止挖矿

矿工。 停止()

必须注意的是以太坊二层网络有哪些币,如果要将某个节点上的操作数据写入区块并同步到网络中的其他节点,就必须开始挖矿。 挖矿是一个区块打包和传播同步的过程。 只有开启挖矿,私链主账户才能获得以太币,用于继续测试转账交易、合约部署、合约调用等功能。

有的读者可能会觉得这种配置私链的方式还是有点麻烦。 对于想要快速方便地测试和开发智能合约的读者来说,还有另一种配置私有链的方式,那就是结合使用TestRPC和Truffle。 TestRPC 是一个在本地使用内存模拟的以太坊环境。 可用于搭建测试环境,基于Node.js开发。 因此,要使用TestRPC,必须先安装Node.js环境,版本必须大于6.9.1。 Truffle 是以太坊智能合约应用程序的开发框架。 让我们来看看如何构建它。

1)使用npm安装TestRPC,命令如下:

sudo npm install -g ethereumjs-testrpc

2)安装完成后,可以输入以下命令查看版本信息:

testrpc –版本

3)运行后输出如下信息:

EthereumJS TestRPC v3.0.5

可用帐户

===================

(0) 0xb43333d44136f351fd30d20215490432e0f3968d

(1) 0x34f73354540fa4b653bf33568c7ba9f69ad6c84d

(2) 0x047bf66a5be28bb84502f3baaa40b10cb04d44e8

(3) 0x1dc4d3ce33b05e24219f93f28612b9a80e2724de

(4) 0xaa82bb04532d560139eeae495fc6d00706dbc7f7

(5) 0xe2ee5d9e955277b6f5e13d10beb686e069859731

(6) 0xfe023592bc7bbb7dac6051950a0b8774206c1f5b

(7) 0x34b1b1b6a36348912be0b943e3f34db38339a192

(8) 0x860638afa0bbecf8ea5c5808e95108710ec92acc

(9) 0xd7a701bd9cffbf887b1e3f03ac91c68ead3032ec

私钥

===================

(0) 6e94ed2e32818d2bb1d58bd0119407096691ec683ed8a43a2975ff6003bb1924

(1) ccc8fca886b7666c0e2707cc9a429d4a1c941dd170b8c0f5f55c71ce966fa835

(2) d0ba307ed8ff2ec12deeb59d0c85884d74735b8ab26329e74cb37966f656634b

(3) c057235669dd341ebb4ce1185b469eeac3d1cd2f763e95aa36e0e22adaa9ce84

(4) 7c6d6a7268fd9f76d2868f650168ba67a2901d427de85357b6a453dfad784db4

(5) 2baaacc4818dfc605b0c91ba5418826a86c09b375861123aa393d7411cce6595

(6) 147d63765df501f94179514459660502b00692b4aab0dfcc2316aea9fc0877dd

(7) bbded13290bcefc551d1cc9bf36921a2e65024b03401014388a6ce52c2159494

(8) 53df9b7d172746d9a0a548f62bc1d21ca78bd6202456221241b36a7fa1cf3b91

(9) 03691c7d31ce9b041d2a66bdc48397b13660f097164d443e3f8ba3f09ae9272e

高清钱包

===================

助记词:交易目标识别乐趣凄凉愿望领域情感旅程上升决定以上

基本高清路径:m/44'/60'/0'/0/{account_index}

在本地主机上收听:8545

可以看到,默认自动配置了10个账户地址。 注意,以上信息是每次启动时动态随机生成的,不是固定的。 最后一行数据的提示表示TestRPC启动后使用8545端口监听。

4)同样使用npm安装Truffle,命令如下:

sudo npm install –g 松露

5)安装成功后,输入truffle --version,输出如下:

6.2 以太坊应用

可以看到输出了v3.2.5的版本信息,下面列出了可以使用的各种命令。

6)安装解决方案:

sudo npm install -g solc

注意安装后的命令是solcjs,用于编译智能合约代码。

7) 运行测试

首先运行TestRPC,可以在命令行直接通过testrpc命令启动,然后开始初始化Truffle目录,命令如下:

mkdir mytruffle && cd mytruffle

松露初始化 webpack

这个命令其实就是下载一个项目框架,也可以直接通过网址下载压缩包,解压,复制到对应目录下,效果是一样的。 执行初始化命令后,输出如下信息:

6.2 以太坊应用

提示信息很简单,就是下载项目框架后进行初始化。 初始化完成后以太坊二层网络有哪些币,目录下生成如下文件:

6.2 以太坊应用

其中,contracts存储在contracts中。 当 trufflecompile 编译时,它会在其中寻找合约文件。 JavaScript 文件存储在 migrations 目录中,这有助于将合约部署到以太坊网络。 它们代表执行部署任务的步骤。 ,truffle.js文件内容如下:

模块.exports = {

网络:{

发展: {

host: "localhost", //节点地址,如果是私链,一般是本机

port: 8545, //节点RPC端口

network_id: "*" //自定义网络号

}

}

};

默认配置与testrpc的参数一致,也可以根据需要修改。

8) 启动testrpc并初始化truffle,现在尝试编写合约。 可以看到contracts中已经有几个example contracts,不用着急,新建一个MyCalc.sol,源码如下:

pragma solidity ^0.4.11;

合同我的计算器{

函数 SumAdd(uint a) 返回(uint d) {

返回 + 100;

}

}

这是一段非常简单的代码。 合约名称为MyCalc,其中包含一个方法SumAdd,通过传入一个整数参数返回一个值加100。 这是一个智能合约。 智能合约并不像我们想象的那么简单。 复杂,与传统应用软件开发最大的不同在于,书面合约一旦部署到以太坊上,就会同步到各个节点,整个以太坊网络基础设施将保证合约的刚性执行和不可篡改修改。 我们先来看看如何部署和执行书面合约。 代码写好后,就可以编译了。 以太坊中的智能合约都运行在EVM(Ethereum Virtual Machine,以太坊虚拟机)上,首先必须编译成EVM能够理解的字节码。

9) 回到mytruffle所在目录,编译执行如下命令:

须藤松露编译

10)如果编译没有问题,会出现如下提示:

正在编译 ./contracts/MyCalc.sol...

将工件写入 ./build/contracts

11)可以看到生成了一个build目录,编译可以部署,没有问题。 进入migrations目录,编辑“2_deploy_contracts”文件,在最后一行插入“deployer.deploy”(合约名称),编辑内容如下:

var ConvertLib = 工件。 require("./ConvertLib.sol");

var MetaCoin = 人工制品。 require("./MetaCoin.sol");

var MyCalc=artifacts.require("./MyCalc.sol"); //新的

模块。 出口=功能(部署){

deployer.deploy(ConvertLib);

deployer.link(ConvertLib, MetaCoin);

deployer.deploy(元币);

deployer.deploy(MyCalc); //添加

};

12)编辑保存后,执行部署命令:

须藤松露迁移

13) 注意一定要保证运行过程中开启了TestRPC。 命令执行成功后,可以在TestRPC中看到响应。 接下来,调用合约中的方法。 要调用合约的功能,必须与TestRPC模拟节点进行交互,首先进入控制台,命令如下:

须藤松露控制台

14)进入控制台后,我们进入MyTruffle目录下的build子目录,找到MyCalc.json,打开找到abi的content部分,复制出来,然后回到控制台,执行以下命令:

abi=复制的abi内容

15)同时在MyCalc.json中找到合约的地址,在控制台执行命令:

myContract=web3.eth.contract(abi).at("0xc7b8a297b99e473feeaf447993600336482c8a8a")

16) 接下来就可以执行合约中的函数了,执行如下命令:

我的合同。 总加。 打电话(10)

终于可以看到结果了。

至此,我们就完成了以太坊私链配置和开发测试环境的介绍。 您可以根据您的具体需要配置各种参数。 另外,还必须注意一些版本变化带来的问题,比如geth的不同版本之间会有一些差异。 比如1.6版本去掉了内置的JavaScript环境编译功能,但是1.5版本就有了。 因此,1.5版本可以直接使用相关的合约编程和编译功能。 以太坊是一个开源系统,其功能开发也在不断演进。 随着发展,会出现更多方便的功能。 大家可以在具体的使用过程中多加注意。

6.2.2 编写代币合约

在上面的章节中,我们演示了一段合约代码的编写,但这只是一个简单的加法操作,让人真正感受到智能合约的特性。 在本节中,我们将演示如何通过以太坊智能合约创建数字代币。 我们参考了以太坊官网的示例,提供了最简单的代币合约示例。 代码如下:

pragma solidity ^0.4.11;
contract MyToken {
    //声明数组,用以存储代币所有人的地址列表
    mapping (address => uint256) public balanceOf;
    // 初始化代币总额,赋值给合约创建者的账户地址中
    // 这是一个构造函数,只会被执行一次
    function MyToken(
        uint256 initialSupply
        ) {
        balanceOf[msg.sender] = initialSupply; 
    }
    /* 代币发送 */
    function transfer(address _to, uint256 _value) {
        require(balanceOf[msg.sender] >= _value);            // 检查余额是否足够
        // 检查是否会溢出,主要防止循环发送给自己
        require(balanceOf[_to] + _value >= balanceOf[_to]);  
        balanceOf[msg.sender] -= _value;     // 从发送者账户中减掉发送的金额
        balanceOf[_to] += _value;            // 在接收者账户中增加发送的金额
    }
}

通过上面代码的注释,我们大致了解到,在这个合约代码中定义了一个名为MyToken的token,并提供了一个构造函数来初始化token的数量。 构造函数中的msg.sender指的是当前调用者的以太坊。 账户地址,由于合约一般由创建者部署,因此通过执行构造函数,将初始化的token一次性全部记录在创建者的账户地址中。 除了构造函数之外,这个合约还提供了一个用于令牌传输的发送方法。 逻辑很简单。 参数包括转账目标账户地址参数_to和转账金额参数_value。 流程是做一些基本的验证和改变转出转入账户的金额,我们通过以太坊官方钱包部署。 为了操作方便,我们使用比较新的0.9.0版本,geth是1.6.5版本自带的,支持直接配置为本地单节点私链,下面来看看操作步骤。

(1) 配置为单节点私链

6.2 以太坊应用

可以看出配置还是挺简单的,只需要选择“Solo network”,选择之后就可以创建一个账户,然后点击“Start mining (Testnet only) network”,可以看到创建的账户很快就可以了可以获得以太币,如下:

6.2 以太坊应用

由于部署合约和调用合约方法都会消耗以太币,读者可以根据自己的需要确保账户内有足够的余额。

(2) 代币合约部署

通过下面第一个界面,可以部署和查看合约。

我们可以看到界面下方有一个WATCHTOKEN按钮,专门用来查看代币合约的。 请注意,代币合约的性质与其他基于以太坊的合约(如众筹合约等)相同。 代码的逻辑是不同的。 官方钱包在此专门设置了对代币合约的查看操作,只是由于代币合约的特殊性,方便操作。

下面我们来部署代币合约,在合约界面点击DEPLOY NEW CONTRACT进入部署界面,如下图第二个界面。

在这个界面中,我们将编写好的token合约代码复制到SOLIDITY CONTRACT SOURCECODE中,代码粘贴进去后会自动编译,编译后的字节码会显示在CONTRACT BYTE CODE中,然后我们选择在 SELECT CONTRACT TODEPLOY 端部署合约。 我们的代币合约名称是 MyToken。 选择后,在下方输入初始代币数量。 该金额将提供给构造函数以供执行。 我们输入10000,一切准备就绪后,点击界面下方的DEPLOY按钮执行部署,弹出的界面就是下方第三个界面。

6.2 以太坊应用

6.2 以太坊应用

6.2 以太坊应用

上图展示了合约创建的一些概要信息,部署的账户地址和需要消耗的Gas。 在主链上部署时,需要花费的以太币数量会根据Gas和GasPrice来计算。 我们现在是在单机私有链上运行,所以没有这个限制,可以直接部署,点击SENDTRANSACTION发起部署交易,执行后返回合约主界面,可以看到部署状态显示在底部,如下图:

6.2 以太坊应用

读者可能会发现一直显示这个状态,好像部署不了。 原因可能是未启用挖矿。 部署必须处于挖掘状态才能成功。 开启挖矿后,部署成功。 部署完成后,可以查看这个部署交易信息:

6.2 以太坊应用

可以看到本次部署交易的账户地址、确认区块数、部署合约的区块高度等信息,以及部署的合约地址。 在以太坊中,部署合约也是一种交易。 部署完成后,我们可以在合约操作主界面点击WATCHTOKEN,让以太坊钱包从数字货币的角度识别这个智能合约。 打开后界面如下图第一个界面所示。

在TOKEN CONTRACT ADDRESS中输入合约地址即可。 下面是名称、合规性等信息,可以填写也可以留空。 完成后点击确定按钮导入合约。 在主界面可以看到合约已经被识别。 如下图第二个界面图所示。 这表明初始数量为10,000,至此部署完成。

有的读者可能会觉得奇怪,这么部署之后竟然创建了一个数字代币? 这太简单了。 准确地说,开发基于以太坊的数字代币很容易。 如果没有这样的基础平台,从头开始开发还是有点复杂。 其实以太坊本身也是一个合约,只是合约规则固化在了以太坊代码中。 部署完成后,即可发送至账户地址。 我们再创建一个以太坊账户地址,然后做一个转账操作,进入SEND界面,选择主账户,选择MyToken代币,如下图第三个界面图。

6.2 以太坊应用

6.2 以太坊应用

6.2 以太坊应用

在转账金额栏中填写一个金额(比如2000),填写完成后点击“发送”。我们分别看一下主账户和收款账户的MyToken余额。

1)主账户:

6.2 以太坊应用

2)收款账号:

6.2 以太坊应用

通过上面的介绍,我们了解了以太坊中通过智能合约创建数字代币的过程。 当然,我们只是演示了最简单的代码版本。 通常,对于一个代币,还有很多其他的功能,比如获取账户余额,获取代币总量,设置冻结期限和数量等。以太坊上有一个智能合约代币的标准,即ERC20代币标准,规定了一系列的事件行为和规则。 如果应用开发者、交易平台、钱包客户端等各方按照标准来开发和识别代币,就可以提前实现接口对应,类似于一个协议,有利于代币在商业生态中的顺畅流通。