【web3实践 | 以太坊开发框架Truffle使用】

简介: 【web3实践 | 以太坊开发框架Truffle使用】

Truffle简介

Truffle是一个面向以太坊的开发框架,提供一整套构建、测试、部署以及管理智能合约的开发工具。Truffle可以与以太坊节点交互,使开发人员能够在本地开发、测试和部署智能合约。

Truffle提供了一个基于命令行的、易于使用的开发环境,可以通过Truffle来编写智能合约,进行本地测试和调试,进行远程部署,以及与以太坊网络进行交互。Truffle还提供了自己的智能合约编译器和构建管道,可以方便地构建、优化和管理智能合约的构建过程,减少了手动干预的需要。

Truffle还提供了强大的测试框架和开发助手,如:必要的开发环境、模拟器和快速开发模板等。此外,Truffle还提供了与夏加尔、Remix等其他开发工具的兼容性,使开发人员可以自由选择所需的工具进行整个开发过程。

Truffle有以下功能:

  • 内置的智能合约编译,链接,部署和二进制文件的管理。
  • 合约自动测试,方便快速开发。
  • 脚本化的、可扩展的部署与发布框架。
  • 可部署到任意数量公网或私网的网络环境管理功能
  • 使用EthPM和NPM提供的包管理,使用ERC190标准。
  • 与合约直接通信的直接交互控制台(写完合约就可以命令行里验证了)。
  • 可配的构建流程,支持紧密集成。
  • 在Truffle环境里支持执行外部的脚本。

一、安装Truffle

启动geth,然后我们来安装truffle。truffle是一个dapp的开发框架,它可以使得dapp的构建和管理非常容易。

你可以像这样使用npm安装truffle:>npm install -g truffle然后我们创建一个空目录,在下面创建truffle项目:

mkdir simple_voting_by_truffle_dapp
cd simple_voting_by_truffle_dapp
npm install -g webpack
truffle unbox webpack
truffle init: 在当前目录初始化一个新的truffle空项目(项目文件只有truffle-config.js 和truffle.js;contracts目录中只有Migrations.sol;migrations目录中只有1_initial_migration.js)。

truffle unbox: 直接下载一个truffle box,即一个预先构建好的truffle项目;unbox的过程相对会长一点,完成之后应该看到这样的提示:

二、创建项目

  • 安装truffle: npm install -g truffle
  • 检查安装成功:truffle version

truffle框架中本身存在几个项目,可以直接使用自带的pet-shop项目进行开发,用truffle unbox命令解压缩这个框架到我们的文件夹下

truffle unbox pet-shop

创建后的项目文件夹

  • contracts/:智能合约Solidity的源文件,包含一个迁移合约Migrations.sol。
  • migrations/:Truffle使用迁移系统来处理智能合约部署。迁移是一种额外的特殊智能合约,可以跟踪变化。
  • test/:包含智能合约的JavaScript和Solidity测试。
  • truffle-config.js:包含truffle配置文件。

三、 Ganache

Ganache是一个运行在本地的个人区块链,通过Ganache官网可以下载,其前身是TestRPC可以用来开发以太坊的个人区块链。

Gnanche下载链接:https://trufflesuite.com/ganache/

四 、编写智能合约

主要是在contracts中去新建Adoption.sol文件

pragma solidity ^0.5.0; //控制智能合约编译器的版本
contract Adoption {
  address[16] public adopters;  // 保存领养者的地址,是包括以太坊地址的数组
    // 领养宠物
  function adopt(uint petId) public returns (uint) {
    require(petId >= 0 && petId <= 15);  // 确保id在数组长度内
    adopters[petId] = msg.sender;        // 保存调用这地址
    return petId;
  }
  // 返回领养者
  function getAdopters() public view returns (address[16] memory) {
    return adopters;
  }
}

五、编译和迁移智能合约

Solidity是一种编译语言,需要编译成字节码,才可以执行在以太坊虚拟机(EVM);

truffle compile

编译成功合约之后需要迁移到区块链中,在migrations目录中创建新文件。

//创建自己的迁移文件-2_deploy_contracts.js var 
var Adoption = artifacts.require("Adoption");
module.exports = function(deployer) {
  deployer.deploy(Adoption);
};
 //在端口7454上运行本地区块链 
 truffle migrate

六、测试智能合约

pragma solidity ^0.5.0;
import "truffle/Assert.sol";   // 引入的断言
import "truffle/DeployedAddresses.sol";  // 用来获取被测试合约的地址
import "../contracts/Adoption.sol";      // 被用来测试的合约
contract TestAdoption {
  Adoption adoption = Adoption(DeployedAddresses.Adoption());
  // 领养测试用例
  function testUserCanAdoptPet() public {
    uint returnedId = adoption.adopt(8);
    uint expected = 8;
    Assert.equal(returnedId, expected, "Adoption of pet ID 8 should be recorded.");
  }
  // 宠物所有者测试用例
  function testGetAdopterAddressByPetId() public {
    // 期望领养者的地址就是本合约地址,因为交易是由测试合约发起交易,
    address expected = address(this);
    address adopter = adoption.adopters(8);
    Assert.equal(adopter, expected, "Owner of pet ID 8 should be recorded.");
  }
    // 测试所有领养者
  function testGetAdopterAddressByPetIdInArray() public {
  // 领养者的地址就是本合约地址
    //address expected = this;因为编译器版本是0.5.0,代码之前编写是按照0.4.17的规范来写的
    address expected=address(this);
    address[16] memory adopters = adoption.getAdopters();
    Assert.equal(adopters[8], expected, "Owner of pet ID 8 should be recorded.");
  }
}
//使用truffle test进行测试可以判断用例是否通过;

七、创建用户界面并和智能合约进行交互

src文件夹中进行界面的开发,主要是补充以太坊的功能,web3是一个实现了与以太坊节点通信的库,我们利用web3来和合约进行交互。优先使用MetaMask提供的Web3实例,truffle-contract会帮我们保存合约部署的信息。

八 、浏览器启动项目并进行交互

九 、安装MetaMask和配置区块链网络

MetaMask是一款插件形式的以太坊轻客户端,可以在官网直接下载https://metamask.io/

为了连接本地的网络,需要添加新网络

  • 创建新用户,并使用Ganache中其中一个地址的私钥导入账户,导入成功就会发现有免费的100ETH可以进行交易。

注意这里在和钱包进行连接的时候,需要先将对应的账户连接到目标网络后才能进行通讯,并使用钱包。

  • 启动项目
  • 点击Adopt,进行领养,成功将为Success。

最后:可能出现的问题和解决方案

  • 如果由于gas不足而部署失败,尝试将
  • migrations/2_deploy_contracts.js里面的gas account增加至500000。比如:
  • deployer.deploy(Voting, [‘Rama’, ‘Nick’, ‘Jose’],{gas: 500000});
  • 如果你有多个账户,并且更喜欢自选一个账户,而不是accounts[0],你可以在truffle.js中指定想要使用的账户地址。在network_id后面添加 ‘from: your address’,truffle将会使用你指定的地址来部署和交互。
  • 如果部署顺利,你可以通过控制台和网页与合约进行交互
目录
相关文章
|
3天前
|
数据安全/隐私保护
那些酷炫的网页你也可以做到——第六篇,小型公司web开发
那些酷炫的网页你也可以做到——第六篇,小型公司web开发
|
4天前
|
Android开发
Android WindowFeature小探究,Android客户端Web页面通用性能优化实践
Android WindowFeature小探究,Android客户端Web页面通用性能优化实践
|
4天前
|
存储 安全 前端开发
第五章 跨域资源共享(CORS):现代Web开发中的关键机制
第五章 跨域资源共享(CORS):现代Web开发中的关键机制
|
2天前
|
缓存 监控 安全
Django框架在大型Web应用中的架构设计与实战
【5月更文挑战第18天】Django框架在构建大型Web应用中扮演重要角色,采用分层架构(数据、业务逻辑、表示层)和多应用组织模式,结合缓存策略(如Memcached、Redis)提升性能。通过异步处理、分布式部署提高响应速度和扩展性。关注数据分区、安全设计及监控日志,确保系统高效、稳定。Django为复杂业务提供坚实基础,助力打造卓越Web系统。
18 7
|
2天前
|
开发框架 中间件 数据库
Django 框架入门全攻略:轻松构建 Web 应用
【5月更文挑战第18天】本文是 Django 入门教程,介绍了如何使用 Django 构建 Web 应用。内容包括安装、项目与应用创建、模型定义、数据库迁移、视图编写、路由配置、模板系统、表单处理和中间件的使用。通过实例展示了 Django 基本流程,帮助初学者快速上手。Django 提供高效工具,便于开发者聚焦业务逻辑,轻松构建功能丰富的 Web 应用。
18 5
|
2天前
|
存储 缓存 API
Flask 框架在大型 Web 应用中的使用与挑战
【5月更文挑战第18天】Flask框架适用于快速开发轻量级Web应用,但用于大型应用时需应对性能、代码管理和团队协作的挑战。通过集成扩展处理复杂需求,使用蓝图组织代码,以及引入缓存优化性能,结合明确的代码规范和开发流程,可有效应对挑战,构建高效稳定的应用。
18 5
|
2天前
|
数据库连接 Python
Flask 框架入门与实践:构建你的第一个 Web 应用
【5月更文挑战第18天】本文介绍了使用 Flask 框架构建第一个 Web 应用的步骤。首先通过 `pip install Flask` 安装框架,然后编写基本的 Python 代码创建应用,包括定义路由和响应。示例展示如何显示 &quot;Hello, World!&quot;,并扩展到显示用户信息的功能。利用模板(如 `index.html`)可使页面更丰富。随着学习深入,可以利用 Flask 的更多特性,如表单处理和数据库连接,来构建更复杂的 Web 应用。本文旨在激发读者对 Flask 和 Web 开发的兴趣,鼓励不断探索和实践。
15 7
|
3天前
|
JavaScript 前端开发 架构师
Web Components:自定义元素与Shadow DOM的实践
Web Components是用于创建可重用自定义HTML元素的技术集合,包括Custom Elements、Shadow DOM、HTML Templates和Slots。通过Custom Elements定义新元素,利用Shadow DOM封装私有样式,&lt;slot&gt;元素允许插入内容。自定义元素支持事件处理和属性观察,可复用且样式隔离。它们遵循Web标准,兼容各前端框架,注重性能优化,如懒加载和Shadow DOM优化。
3 0
|
3天前
|
JavaScript
js中如何使用工厂方式和构造函数创建对象,web开发项目实例
js中如何使用工厂方式和构造函数创建对象,web开发项目实例
|
3天前
|
JavaScript 前端开发 开发者
在Web开发中,事件处理是一个至关重要的概念
【5月更文挑战第17天】Vue.js的事件处理是其核心特性之一,允许开发者响应用户操作。通过v-on(或@)指令绑定DOM事件到方法,实现交互。事件修饰符如.stop、.prevent等简化处理逻辑。此外,Vue支持自定义事件,便于组件间通信,如子组件通过$emit触发事件,父组件使用v-on监听并响应。理解这些机制能帮助开发者更有效地管理Vue应用的事件流程。
10 0