truffle构建以太坊应用并测试第一个helloworld智能合约

2023-05-16

     最近因为国家对区块链又重视起来了,相信今年年底到明年年初会是一个区块链的新的爆发点,也是碰巧学习了一下以太坊构建区块链应用,以前都是简单的了解,并没有实际动手演练。今天趁机会也学习一下区块链,同时也学习了几个新名词。比如账户,私钥,智能合约(smart contract),编译合约(compile),迁移合约(migrate),测试合约(test)。

     truffle是一个nodejs的库,他可以构建node版本的以太坊应用,所以我们的机器需要安装node,而且版本需要8以上。truffle,可以直接通过npm install -g truffle的方式来安装,很方便。

    安装了node,会默认带上npm包管理工具,我们为了让国内下载包更快,可以更换国内阿里的镜像地址。具体操作如下所示:

    npm config set registry=https://registry.npm.taobao.org/

    因为我已经提前安装并且设置好了淘宝的镜像,所以这系统里显示如下:

    

    另外,设置了淘宝npm镜像地址,会相应的在本机用户目录下生成一个.npmrc的文件,里面的内容就是registry=https://registry.npm.taobao.org/,所以我们可以手动的设置这个文件,会达到一样的效果。

    下面就开始安装truffle了,他的安装很简单,但是为了在所有的命令行下使用,最好使用全局的方式安装。

     npm install -g truffle

    安装了truffle,我们可以验证一下。

    

      理论上,安装了truffle就可以了,整个实验也就够了,但是有的也推荐安装geth,ganache-cli(老版本叫ethereumjs-testrpc),我觉着没有必要,因为truffle develop命令就可以开启以太坊客户端。我们不妨也安装一下ganache-cli,或者ethereumjs-testrpc,如下所示,当我们安装ethereumjs-testrpc的时候,系统提示ethereumjs-testrpc已经被重命名为ganache-cli了,所以安装ganache-cli就可以了。

    

    npm install -g ganache-cli 

    当我们安装完了ganache-cli,我们可以直接在命令行下输入命令ganache-cli,就可以开启以太坊的客户端。

    

    启动了客户端,开启了8545端口,这种方式开启以太坊客户端,没有进入一个交互模式,而我们通过truffle develop命令启动,同样会开启类似的客户端,并且打印信息几乎一样,不同的是账户和秘钥每次都不同。但是开启的端口是一样的,而且truffle develop可以进入交互模式,可以在命令行下进行compile编译合约与migrate迁移合约,还可以进行合约调用。前提是需要进入一个truffle构建的以太坊工程。

    truffle官方提供了很多truffle的工程盒子box,像webpack,react,metacoin,pet-shop等等,我们可以在官网上看到:

    

    官方说通过命令truffle unbox react或者truffle unbox metacoin可以构建项目,意思是会自动下载这些盒子到本地,但是最近试了,下载失败:

    

    甚至直接通过初始化的方式也不对:

    mkdir react   
    cd react 
    truffle init

    

     truffle踩坑也是够奔溃的,到此,以为山重水复疑无路,truffle可以放弃了。但是好像可以通过git clone 将github上的react-box下载到本地,因为无论是truffle unbox react还是truffle init得到的工程都是源代码,而且需要人为编译和迁移合约。

    

    克隆下来的代码结构如下,和truffle unbox react的结构还是一样的。

      

    至此,我们的准备工作算是做完了,其实本文helloworld示例才刚刚开始。前面一堆介绍基本都是在踩坑。因为js,甚至node的框架更新太快,而且以太坊本身也在不断迭代,出现问题也可以理解。

    到这里,我们可以在项目目录下的命令行中运行truffle develop,进入truffle交互式,来感受一下客户端,并且和ganache-cli做个对比:

    

    开启的端口是8545,同样创建了10个临时账户以及10个秘钥。所以说前面如果仅仅安装了truffle,也可以完成本次实验,没有必要再安装ganache-cli。 

    我们需要手动增加一个合约helloworld.sol, 我们可以进入contracts目录,然后通过命令创建一个helloworld.sol,而不是直接新建一个helloworld.sol文件。如下所示:

     cd contracts
     truffle create contract HelloWorld

    

    接着,我们可以手动在notepad++中编辑HelloWorld.sol文件,试着编写一个最简单的sayHello方法。但是这里必须注意使用Solidity的语法。 

    

    智能合约编写完毕,我们就需要编译了,我们回到truffle develop的交互式界面中,输入compile,或者直接在react-box目录下的命令行中输入truffle compile,也可以编译合约。

     

    智能合约一下子编译成功,是不是很开心啊,这得益于踩坑啊,这里HelloWorld.sol内容中的sayHello,有几处需要注意,首先是必须声明式public的,而且需要pure修饰,最后返回类型string后面还需要加上memory,比如returns (string memory) 。

    接着,我们需要迁移合约即migrate,我们进入migrations目录,按照创建合约的方法新建一个HelloWorld的migration,这里也是有坑的,需要创建一个字母数字即alpha-numeric名称的迁移文件。他会自动在migration文件前面加上数字,构成一个数字开头的文件。这里需要注意一下。

    

    cd migrations
    truffle create migration deploy_helloworld_3

    

    我们可以模仿1_initial_migration.js的内容来修改helloworld的迁移文件。 

    

     1572713506_deploy_helloworld_3.js的内容如下所示:

var HelloWorld = artifacts.require("./HelloWorld.sol");
module.exports = function(_deployer) {
  // Use deployer to state migration tasks.
  _deployer.deploy(HelloWorld);
};

     接下来,我们就需要执行合约迁移命令了。可以在命令行执行truffle migrate,但是会提示失败,我们需要执行truffle migrate --reset或者,直接在truffle develop的交互式命令下输入migrate即可。

    

    直接在truffle develop交互式命令行下运行migrate:

    

truffle(develop)> migrate

Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.



Starting migrations...
======================
> Network name:    'develop'
> Network id:      5777
> Block gas limit: 0x6691b7


1_initial_migration.js
======================

   Deploying 'Migrations'
   ----------------------
   > transaction hash:    0xdae3f39a310a44d685224dac084b6e2e9d17360cb7a2ac7a9f18449e780dc2da
   > Blocks: 0            Seconds: 0
   > contract address:    0x21206Eb603Bf8B7e7941bdAf9fcfb076c3Cc6ddf
   > block number:        1
   > block timestamp:     1572714191
   > account:             0xd06755Fb2ff82aB2Df6f51196AE397de76011189
   > balance:             99.99477214
   > gas used:            261393
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.00522786 ETH


   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:          0.00522786 ETH


2_deploy_contracts.js
=====================

   Deploying 'SimpleStorage'
   -------------------------
   > transaction hash:    0x2f1ee9b6b31891926e0a7aee57353f11b211715468b54fc9e8e60b27badddeb6
   > Blocks: 0            Seconds: 0
   > contract address:    0x64a21797f6d700F6143B37fC19438f7e450b5517
   > block number:        3
   > block timestamp:     1572714192
   > account:             0xd06755Fb2ff82aB2Df6f51196AE397de76011189
   > balance:             99.99183138
   > gas used:            105015
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.0021003 ETH


   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:           0.0021003 ETH


1572713506_deploy_helloworld_3.js
=================================

   Deploying 'HelloWorld'
   ----------------------
   > transaction hash:    0x76af4c18b9af0a2422e65dd86fd64c295bcc8e29cb19eb0ee103dd16c2115dc7
   > Blocks: 0            Seconds: 0
   > contract address:    0x91EeB84d6696aBA51Ac078C00Cb3eB311FA7c7FE
   > block number:        5
   > block timestamp:     1572714192
   > account:             0xd06755Fb2ff82aB2Df6f51196AE397de76011189
   > balance:             99.98874562
   > gas used:            127265
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.0025453 ETH


   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:           0.0025453 ETH


Summary
=======
> Total deployments:   3
> Final cost:          0.00987346 ETH


truffle(develop)>

   输出内容很多,大致意思是helloworld迁移成功,我们可以进行合约部署测试了。

    合约部署,需要一句代码,代码是在truffle console下进行,也可以在truffle develop的命令行下。这里还是在truffle develop交互模式下运行,当我们部署完毕,合约就可以被调用了。

    HelloWorld.deployed().then(instance => contract = instance)

    

    接下来,执行合约调用:

     

        至此,一个truffle结合以太坊项目的helloworld示例就介绍完了,基本和react没什么关系,主要是在各种踩坑。核心还是在truffle的安装以及truffle各种命令的使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

truffle构建以太坊应用并测试第一个helloworld智能合约 的相关文章

  • Solidity transfer,call和send 的区别

    address transfer throws on failure forwards 2 300 gas stipend not adjustable safe against reentrancy should be used in m
  • 区块链智能合约开发学习

    最近正在肝区块链知识学习 入手学习智能合约的开发 由于网上资料实在是太少了 好不容易东拼西凑完成了智能合约的开发 编译 部署 web3js调用 网页页面 和web3j调用 java调用 赶紧趁热把重点提炼出来 先上图 是我最近学习知识点的一
  • 智能合约(二)————智能合约进阶

    1 保留关键字 abstract after alias apply auto case catch copyof default define final immutable implements in inline let macro
  • Moonbeam路由流动性

    Moonbeam路由流动性 Moonbeam Routed Liquidity MRL 使加密资产流动性能够从其他生态系统 如以太坊 Solana Polygon或Avalanche 进入波卡生态系统 借助MRL 用户可以通过简洁的用户体验
  • Solidity学习笔记2——Webase积分合约

    代码段学习笔记 代码来源 Webase合约仓库 我只做了增加注释的工作用来记录相关知识点 pragma solidity 0 4 24 import SafeMath sol import Roles sol import Address
  • 智能合约之短地址攻击

    在了解以太坊智能合约短地址攻击之前 先要简单了解一下以太坊代币ERC 20 TOKEN 的一些基础知识 ERC EthereumRequest for Comment 即以太坊通用征求意见协议 开发者可以通过提交EIP Ethereum I
  • 以太坊智能合约开发:Solidity 语言中的数据类型

    本文我们介绍Solidity语言的数据类型 重点是值类型 包括布尔类型 整型 地址类型 字节类型 字符串类型和枚举类型 并且通过两个智能合约例子 用于演示这些数据类型的声明与使用方法 访问 Github 仓库 获取更多资料 基本概念 Sol
  • 使用 sCrypt 实现一个简单的 NFT 合约

    我们之前的token方案针对的是可替换 fungible 的 token 这里来看看另一种方案如何实现 NFT non fungible token 合约 这类 token 可以代表独一无二的和不可分割的资产 比如房地产和收藏品 概览 与可
  • MetaMask 添加BSC、Polygon网络配置

    打开浏览器 点击MetaMask插件 选择网络 点击弹窗中的 Add Network 按钮 添加各网络配置如下 1 BSC Binance Smart Chain 主网 key value 网络名称 Network Name Binance
  • Solidity API

    这是Solidity教程系列文章第8篇介绍Solidity API 它们主要表现为内置的特殊的变量及函数 存在于全局命名空间里 Solidity 系列完整的文章列表请查看分类 Solidity 写在前面 Solidity 是以太坊智能合约编
  • 基于区块链智能合约的疫苗溯源系统

    绪论 该系统基于以太坊的Solidity进行智能合约开发 并通过hardhat进行部署在了本机 通过Mocha和Chai进行了单元测试的编写 同时提供了一个基于React的前端界面与用户进行交互 区块链的介绍 不难看出 区块链技术对现有的经
  • CROSS使用说明书 发行和拍卖NFT完整攻略

    鉴于目前去中心化NFT发行和拍卖平台CROSS是英文版本 对部分中国区用户存在操作困难 为了方便投资者和NFT爱好者能及时了解CROSS的相关信息和使用流程 现在CyberVein推出了更加详细的CROSS完整版教程 若还存有疑问 可添加中
  • stop容器

    docker ps 查看所有正在运行容器 docker stop containerId containerId 是容器的ID docker ps a 查看所有容器 docker ps a q 查看所有容器ID docker stop do
  • 这篇文章,让你了解ERC-1155 多代币标准协议

    文章目录 ERC1155 介绍 多代币标准 前提条件 代币标准 ERC 20 ERC 721 构建 ERC1155 代币合约 ERC 1155 的功能和特点 批量传输 批量余额 批量审批 接收钩子 支持非同质化代币 安全转账规则 ERC11
  • 10分钟内用Ezo和Python构建以太坊Oracle

    上一篇 我写了用Web3 js构建以太坊Oracle 这个练习给了我一些新的Web3 js 1 0版本知识 许多新的好东西可供选择而且使用它实现一个简单的oracle非常容易 但是 显然必须有更好的方法 Instant Oracles 只需
  • 物联网、区块链、元宇宙和虚拟数字人离普罗大众有多远?

    首先 我们最早理解的数字人就是数字虚拟的一个假人 可能看起来很像二次元玩偶的样子 今天我觉得数字人是一种虚拟的数字身份 无所谓你的形象是仿真或是任何形象 包括你在现实中无法实现的形象 你在梦想中所渴望的概念 无论它是什么样的 它是你在另外一
  • FISCO BCOS 七、MetaMask测试Ganache搭建的私有网络

    目录 背景介绍 所需软件 1 Ganache 2 MetaMask 操作 第一步 启动Ganache 第二步 使用MetaMask连接Ganache 第三步 开始测试 背景介绍 本文主要介绍如何使用Ganache 在本地搭建以太坊私有网络
  • 区块链之java调用智能合约(二)部署智能合约

    前言 上一节 已经说过 如何的创建一个合约 如何编译合约 然后在java中调用 但是呢 这些还远远不够 那么还差哪些呢 现在就是如何将创建的智能合约部署的对应的共链 私链 测试链中了 需要部署后 才能真正的使用 现在就讲讲如何部署智能合约
  • solc安装指定版本

    1 系统linux ubuntu20 04 2 solc安装指定版本 在编译的时候报错 Error Data location must be storage or memory for constructor parameter but
  • 以太坊区块链学习之在私链上部署合约

    上一篇博客介绍了如何搭建私链并在私链上创建账户 挖矿 查看余额 本篇将介绍在私链上部署合约并与之交互 本篇开发环境为MacOS 10 12 建议读者使用macOS系统或者Ubuntu系统 第一步 进入geth客户端 启动私链 进入geth客

随机推荐

  • MapReduce编程开发之倒排索引

    倒排索引是词频统计的一个变种 xff0c 其实也是做一个词频统计 xff0c 不过这个词频统计需要加上文件的名称 倒排索引被广泛用来做全文检索 倒排索引最终的结果是一个单词在文件中出现的次数的集合 xff0c 以下面的数据为例 xff1a
  • ROS2学习笔记(五)-- ROS2命令行操作常用指令总结(一)

    简介 xff1a 在前面的章节中 xff0c 我们先简单学习了ROS2的话题发布和订阅 xff0c 两种操作都是通过python代码实现的 xff0c 而在实际应用过程中 xff0c 我们会经常用到命令行操作来辅助调试 xff0c 更进一步
  • 实例演示ElasticSearch索引查询term,match,match_phase,query_string之间的区别

    通常在面试elasticsearch中 xff0c 面试官会问一个关于查询的问题 xff0c 就是term查询和match查询有什么区别 xff1f 如果你对这两个查询不清楚 xff0c 面试官会认为你没有用过elasticsearch x
  • Elasticsearch使用update_by_query

    elasticsearch中有一个方法是批量修改 xff0c 就是先查询出需要修改的索引记录 xff0c 然后批量修改 这个本来没什么 xff0c 但是使用过的都知道 xff0c 用java来调用这个方法很别扭 一般来说 xff0c 我们使
  • C++中实现字符串分隔split方法

    C 43 43 中 xff0c 除了没有直接的求数组长度的方法外 xff0c 也没有直接对字符串分隔的方法 xff0c 需要我们自己来实现 xff0c 下面结合字符串分隔的问题 xff0c 做一个面试题 xff0c 面试题是这样的 xff0
  • c++编程实现简单mapreduce程序

    hadoop提供了java版本的mapreduce编程API xff0c 我们需要自定义编写mapper和reducer xff0c 分别继承Mapper和Reducer xff0c 然后重写map和reduce方法 同时需要在main方法
  • windows下安装MongoDB压缩版

    MongoDB在windows上一般提供msi的安装方式 xff0c 这种安装方式相对简单 xff0c 界面安装 xff0c 这里介绍解压缩版本的安装 xff0c 我们需要下载的是zip包 xff0c 然后解压 xff0c 这里下载之后 x
  • python3安装以及安装pip之后出现的问题

    python3在windows10上的安装 xff0c 为了省事 xff0c 直接下载的是python 3 7 4 embed adm64 zip免安装版本 xff0c 下载解压 xff0c 然后将python目录加入环境变量的path中
  • eclipse安装pydev插件开发python程序

    做Java开发的 xff0c 想学习python xff0c 可以不用安装别的pycharm IDE xff0c 我们直接通过在eclipse中安装一个python插件pydev即可 xff0c 前提是你的机器上已经安装了python xf
  • docker私有镜像服务搭建

    docker容器技术已经在部署服务上使用的非常普遍 xff0c 主要是它的隔离性以及快速启动的特性 xff0c 一般启动一个容器 xff0c 如果镜像不存在会先去dockerhub仓库下载 xff0c 然后存储在本地 xff0c 后续可以继
  • vs2017开发第一个desktop应用程序

    desktop应用程序也叫窗口程序 xff0c 我们平时在电脑上安装的APP xff0c 都是桌面程序 xff0c 比如QQ xff0c 各种播放器 xff0c 包括浏览器 桌面程序最主要的特点 xff0c 就是点击运行之后 xff0c 会
  • 量子编程入门第一篇环境搭建dotnet-sdk+Microsoft.Quantum.IQSharp+python3.6+qsharp

    量子编程已经提上日程 xff0c 微软提供了quantum开发工具包 Microsoft Quantum Development Kit简称QDK xff0c 在visual studio 2019环境下 xff0c 可以安装quantum
  • ROS2学习笔记(十)-- ROS2 launch启动文件

    简介 xff1a 接触过ROS1的同学对launch肯定不陌生 xff0c 在ROS1中 xff0c 我们常用launch实现node和master同时启动 多节点同时启动配置等功能 xff0c ROS2中的launch也是用于多节点启动
  • 记录一次解决TypeError: 'NoneType' object is not callable的办法

    如题所示 xff0c 这是python运行时报错 xff0c 关键信息就是 xff1a TypeError 39 NoneType 39 object is not callable xff0c 错误栈信息如下 xff1a 有的文章提示 x
  • windows下VC++6.0编写c++程序连接mysql示例

    windows下通过c 43 43 编码连接mysql数据库 xff0c 需要做一些设置 xff0c 因为我们需要连接mysql并执行相关操作 xff0c 需要使用mysql提供的api xff0c 这api在mysql h头文件中定义了
  • windows修改cmd命令行字体

    默认情况下 xff0c windows命令行字体只有两种 xff0c 点阵字体和新宋体 如果你想使用系统自带的其他字体 xff0c 需要更改注册表 这里介绍如何修改 windows系统字体在目录C Windows Fonts 下 xff0c
  • centos7安装与配置DNS服务器

    centos7上安装DNS服务器可以实现域名与IP的双向解析 xff0c 即通过域名可以找到主机IP xff0c 也可以通过IP找到域名 在postfix搭建邮件服务器中 xff0c 需要用到DNS正向解析与反向解析 xff0c 因此DNS
  • springboot项目单元测试

    springboot项目和普通的spring项目一样也可以做单元测试 xff0c 一般是测试service层的方法 xff0c 在进行项目构建的时候 xff0c 需要在springboot默认依赖的基础上 xff0c 再加上spring b
  • ipfs星际文件系统初体验

    ipfs是InterPlanetary File System的简称 xff0c 即星际文件系统 xff0c 他不同于一般的操作系统文件系统 xff0c 也不同于分布式文件系统 xff0c 因为分布式文件系统最终访问文件还是采用的http协
  • truffle构建以太坊应用并测试第一个helloworld智能合约

    最近因为国家对区块链又重视起来了 xff0c 相信今年年底到明年年初会是一个区块链的新的爆发点 xff0c 也是碰巧学习了一下以太坊构建区块链应用 xff0c 以前都是简单的了解 xff0c 并没有实际动手演练 今天趁机会也学习一下区块链