Mac OS使用brew安装Nginx、MySQL、PHP-FPM的LAMP环境
Mac OS 内置了Apache 和 PHP,我的系统版本是OS X 10.13.4,可以通过以下命令查看Apache和PHP的版本号: httpd -v Server versi
顺晟科技
2021-06-16 10:45:36
359
本文是一篇学习文章,参考网络上的一系列DApp开发环境搭建而成,结合自己在这台机器上的测试和验证,从而加深对智能合同的理解。
1.1准备阶段
本文搭建的环境基于windows10(家庭版),相关软件版本如下:
Node.js:v8.11.3
solcjs:0 . 40 . 2 commit . 3155 DD 80 . Emscripten . clang
web3:0.20.2
块菌:v4.1.3(核心4.1.3)
Webpack:3.11.0
注意:本文搭建的环境没有安装节点模拟器ganache,而是直接部署Ethereum私有链eth。
步骤1:安装Node.js
打开官网下载链接。https://nodejs.org/en/download/下载了与你的系统相对应的Node.js版本
Node.js是运行在服务器上的JavaScript。Node.js是一个JavaScript运行环境。Node.js使用事件驱动的非阻塞I/O模型,使其轻量级且高效。Node.js的包管理器npm是世界上更大的开源库生态系统。下载64位软件包,下载后直接安装。安装后,打开控制台窗口,您可以使用节点:
C: \用户\45014node -v
v8.11.3
这里解释一下,新版Node.js有自己的npm,安装Node.js的时候会一起安装,npm的作用是管理Node.js所依赖的包,也可以理解为用来安装/卸载Node.js需要安装的东西。
注意:这里的环境配置主要配置npm安装的全局模块所在的路径和缓存的路径。配置的原因是将来执行类似npm install express [-g](可选参数-g,g代表全局安装)的安装语句时,安装的模块将被安装到C: \ users \ 45014 \ appdata
步骤2:安装可靠编译器
C: \用户\45014 npm安装g solc
安装完成后,执行命令验证安装是否成功
C: \用户\ 45014 solcjs版本
0.40.2提交
步骤3:安装web3
C: \用户\45014 npm安装g web 3 @ 0 . 20 . 2
安装验证:
C:\Users\hubwiz节点p ' require(' web 3 ')'
{[功能: Web3]
providers:{…}}
第四步:安装松露框架
执行以下命令安装桁架开发框架:
C: \用户\45014 npm安装g块菌
验证安装:
C: \用户\45014 truffle.cmd版本
块菌v4.1.3(核心4.1.3)
步骤5:安装网络包
执行以下命令安装webpack:
C: \用户\ 45014 NPM installg web pack @ 3 . 11 . 0
验证安装:
C: \用户\ 45014 web packv
3.11.0
1.2智能合同开发
1.2.1创建合同项目
D: \研究\获取mkdir测试
D: \研究\geth\testcd测试
D: \研究\geth\testmkdir HelloWorld
D: \研究\获取\测试光盘HelloWorld
D: \研究\获取\测试\ HelloWorld块菌初始化
此时将出现以下错误:
块菌初始化下载…错误:块菌盒
https://github.com/truffle-box/bare-box.git不存在。如果
您认为这是一个错误,请联系块菌支持。
解决方案可以是用直接的git代码替换truffle init命令
git克隆https://github.com/truffle-box/bare-box
需要先执行后续命令:cd裸盒
上面两个命令的功能相当于truffle init,框架是自动生成的。
目录结构描述:
合同/:块菌的默认合同文件存放地址;
迁移/:存储发布的脚本文件;
Test/:存储测试应用程序和合同的测试文件;
truffle-config . js:truss的配置文件。
1.2.2准备和部署合同
步骤1:在合同文件夹下创建一个新的HelloWorld.sol文件:
D: \研究\获取\测试\ HelloWorld\裸盒cd合同/
D: \研究\获取\测试\ HelloWorld\裸盒\合同块菌创建合同HelloWorld
写一个简单的HelloWorld代码如下:
复制代码
务实稳健的^0.4.22;
合同HelloWorld {
函数sayHello()返回public pure(string){
返回(' Hello World ');
}
}
复制代码
行命名当前的实度版本,不同的实度版本可能编译不同的字节码。是为了兼容性。
合同关键字类似于其他语言中较常见的上课。因为固态是专为智能合约(联系人)设计的语言,声明合同后即内置了开发智能合约所需的功能。也可以把这句理解为编译类扩展合同。
函数的结构与其他程序类似,但如果有传入的参数或回传值,需要指定参数或回传值的类型(类型).
第二步:编译合约:
现在执行块菌编译命令,我们可以将HelloWorld.sol原始码编译成以太网字节码:
D: \研究\获取\测试\ HelloWorld \裸盒编译
编译. contracts\HelloWorld.sol.
将工件写入。\构建\合同
命令运行成功后会多出一个建设的目录,如下:
在编译文件夹下面的建筑/合同文件夹下面会看见HelloWorld.json文件:
第三步:修改块菌-config.js文件内容:
添加以下内容到块菌-config.js文件并保存:
网络: {
发展: {
host: 'localhost ',
port: 8545,
network _ id : ' *//匹配任何网络编号
}
第四步:在迁移目录下创建移植文件:
D: \研究\获取\测试\ HelloWorld \裸盒\迁移选择创建迁移部署_helloworld
查看目录,生成如下文件:
修改1552730530 _ deploy _ hello world。射流研究…
var hello world=神器。要求(' ./hello world。sol’);
模块。exports=function(deployer){
部署者。deploy(hello world);
};
使用工件。需要语句来取得准备部署的合约。
使用deployer.deploy语句将合约部署到区块链上。这边编译是合同的名称而不是文件名。因此可以用此语法读入任一。溶胶文件中的任一合约。
第五步:执行块菌迁徙命令:
D: \研究\获取\测试\地狱世界\裸盒松露迁移
使用网络"开发"。
正在运行迁移: 1 _ initial _ migration。射流研究…
部署迁移.
.不明确的
遇到错误,正在退出。网络状态未知。手动检查成功的交易。
错误:帐户被锁定
在对象无效响应(c : \ Users \ 45014 \ AppData \ Routing \ NPM \ node _ modules \块菌\ build \ web pack : \ ~ \ web 3 \ lib \ web 3 \ errors。js :38:1)
在部署合约时需要一个解锁的账户。在桀斯控制台使用个人的对象的解锁帐户()方法来解锁指定的账户,参数为账户地址和账户密码(在创建账户时指定的那个密码):
在古英语字母或-D执行:
私人的。解锁帐户(eth。帐户[0])
密码:
真实的
然后再次执行:
D: \研究\获取\测试\地狱世界\裸盒松露迁移
使用网络"开发"。
正在运行迁移: 1 _ initial _ migration。射流研究…
部署迁移.
.0x 87 a3 F9 c 57 E1 d 01 BCD 8 f 138 c 67167028444 C1 de 145596338 a 0a F9 e 571 f 654984 f
迁移:0x 5980 c 9 cfbe 8 da C5 a 7f 0 b 100 c 6 fad 75 EC 7b 7763 bb
保存工件.
正在运行迁移: 1552730530 _ deploy _ hello world。射流研究…
更换编译.
.0x1e 24213 F8 f 21917d 9d 2159 B3 b 43845 B1 FB 13 f 19 ebc 5045 b 0 b 8976224 ba 136294
hello world d :0x 613 f 2408 babedbadd 55783 BD 60 a 893 CD 4a 89 c 0 b 9
保存工件.
(此时会停在部署阶段,需要启动挖矿,才可以部署完成)
我们先看下是否有交易在处理,在古英语字母或-D下执行命令。
txpool.status
{
pending:1,
queued:0
}
的确有一个挂起的交易!下面开启启动挖矿:
miner.start(1)
.
I 0316 213:08:35.926452 eth/API。go :1191]Tx(0x1e 24213 F8 f 21917d 9d 2159 B3 b 43845 B1 FB 13 f 19 ebc 5045 b 0 b 8976224 ba 136294)创建d 33600x 613 f 2408 babedbadd 55783 BD60 a 893 CD 4d 4
矿工/工人?开采区块(# 224/2190 b58b)10 .等待5个街区确认
我0316 21:08:37.286816矿工/工人。go :573]用1 txs 0大叔在225块提交新工作。拍摄了0
矿工/工人?219号区块后开采5个区块:
我0316 21:08:37.289809矿工/工人。go :573]用1 txs 0大叔在225块提交新工作。拍摄了0
矿工/工人?开采区块(# 225/d5e 9 a 63 b)4 .等待5个街区确认
我0316 21:08:42。536780矿工/工人。go :573]在块226上用0 txs 0大叔提交新工作。拍摄了0
矿工/工人?220号区块后开采5个区块:
我0316 21:08:42。542765矿工/工人。go :573]在块226上用0 txs 0大叔提交新工作。耗时964.2s
部署成功以后,我们可以得到合约的地址:0x 613 f 2408 babedbadd 55783 BD 60 a 893 CD 4a 89 c 0 b 9,后面会使用这个地址来实现与合约的交互,这里需要先记录下来。
稍等一段时间,再查看交易池的状态:
txpool.status
{
pending:0,
queued:0
}
交易已经成功提交了,然后我们可以停止挖矿了:
miner.stop()
1.3 与合约交互
步:首先我们找到建造/合同/地狱世界。数据中的踝肱指数的价值,通过数据压缩成一行在古英语字母或-D命令行执行:
abi=[{ 'constant': true,' inputs': [],' name': 'sayHello ',' outputs': [ { 'name': ' ',' type': 'string' } ],' payable': false,' stateMutability ' : ' pure ',' type': 'function'}]
第二步:注册合约对象:
hello=eth.contract(abi).at('0x 613 f 2408 babedbaddd d 55783 BD 60 a 893 CD 4a 89 c 0 b 9 ')
{
ab :[{
constant: true,
inputs: [],
姓名: '说你好,
outputs: [{.}],
payable: false,
状态可变性: '纯,
类型: '函数'
}],
地址: '0x 613 f 2408 babedbadd 55783 BD 60 a 893 CD 4a 89 c 0 b 9 ',
transactionHash: null,
allEvents:函数(),
sayHello:函数()
}
第三步:对象注册成功以后,就可以像正常合约那样去调用了。
hello.sayHello()
"你好,世界"
hello.sayHello()
"你好,世界"
这就是一个最基本的部署完成了个智能合约,也验证了合约确实可以运作,虽然没有实际意义,但可以帮助我们开始学习并了解智能合约
16
2021-06
16
2021-06
16
2021-06
16
2021-06
16
2021-06
16
2021-06