首页 > 其他分享 >基于truffle进行合约部署

基于truffle进行合约部署

时间:2023-12-06 11:55:30浏览次数:37  
标签:network 部署 deployer Truffle truffle 合约

1.Truffle 简介

1.1.什么是 Truffle

Truffle 是一个世界级的开发环境,测试框架,以太坊的资源管理通道,致力于让以太坊上的开发变得简单。

Truffle 有以下特性:

内置的智能合约编译,链接,部署和二进制文件的管理;

快速开发下的自动合约测试;

脚本化的,可扩展的部署与发布框架;

部署到不管多少的公网或私网的网络环境管理功能;

使用 EthPM&NPM 提供的包管理,使用 ERC190 标准;

与合约直接通信的直接交互控制台;

可配的构建流程,支持紧密集成;

在 Truffle 环境里支持执行外部的脚本。

1.2.环境要求和安装

环境要求:

NodeJS 5.0+;

Windows,Linux,或 Mac OS X。

安装方式:

$ npm install -g truffle

Truffle 需要以太坊客户端,需要支持标准的 JSON RPC API。

如果你是 Windows 用户,推荐使用 Powershell 或 Git BASH 来安装和使用 Truffle 框架。

1.3.Truffle 开发工具

当开发基于 Truffle 的应用时,推荐使用 EthereumJS TestRPC,它是一个完整的在内存中的区块链仅仅存在于开发的设备上。它在执行交易时是实时返回,而不等待默认的出块时间,这样可以快速验证新写的代码,当出现错误时,也能即时反馈给你。它同时还是一个支持自动化测试的功能强大的客户端,Truffle 充分利用它的特性,能将测试运行时间提速近 90%。

使用 TestRPC 客户端充分测试后,可是尝试使用正式发布的客户端:Geth (go-ethereum)、WebThree(cpp-ethereum)、More,这些是完整的客户端实现,包括挖矿,网络,块及交易的处理,Truffle 可以在不需要额外配置的情况下发布到这些客户端。

2.Truffle 工程创建

创建工程目录,可以使用文件浏览器或使用下面的命令在命令行创建一个目录:

$ mkdir myproject

接下来,通过下面的命令初始化一个 Truffle 工程:

$ truffle

Truffle v3.4.11 - a development framework for Ethereum

$ cd myproject

$ truffle init

完成后,将拥有如下目录:

  • app/ - 应用文件运行的默认目录,这里面包括推荐的 javascript 文件和 css 样式文件目录,但可以完全决定如何使用这些目录;
  • contract/ - Truffle 默认的合约文件存放地址;
  • migrations/ - 存放发布脚本文件 ;
  • test/ - 用来测试应用和合约的测试文件;
  • truffle.js - Truffle 的配置文件。
  • truffle init 会默认创建一个构建在以太坊内的代币 demo 应用:METACOIN,可以使用这个工程来进行快速的学习,或者也可以删除这些文件来创建一个自己的工程。

3.编译合约

3.1.合约位置

所有合约应该位于 ./contracts 目录,默认提供一个合约文件,一个库文件,均以 .sol 结尾作为示例。

尽管库文件有一定的特殊性,但为简单起见,当前均称之为合约。

3.2.命令

要编译合约,使用:

truffle compile

Truffle 仅默认编译自上次编译后被修改过的文件,来减少不必要的编译。如果想编译全部文件,可以使用 --compile-all 选项:

truffle compile —compile-all

3.3. 约定

Truffle 需要定义的合约名称和文件名准确匹配。

举例来说,如果文件名为 MyContract.sol,那么合约文件须为如下两者之一:

contract MyContract {

  ...

}

// or

library MyContract {

  ...

}

这种匹配是区分大小写的,也就是说大小写也要一致,推荐大写每一个开头字母。

3.4.依赖

可以通过使用 import 来声明依赖,Truffle 将会按正确顺序依次编译合约,并在需要的时候自动关联库。

3.5.编译目录

编译的输出位于 ./build/contracts 目录,如果目录不存在会自动创建。

编译文件对于 Truffle 框架能否正常工作至关重要,不应该在正常的编译或发布以外手动修改这些文件。

4..移植

4.1.移植目的

 

移植是由一些 Javascript 文件组成来协助发布到以太坊网络,主要目的是用来缓存你的发布任务,它的存在基于你的发布需求会改变的前提。

当你的工程发生了重要的改变,你将创建新的移植脚本来将这些变化带到区块链上,之前运行移植的历史记录通过一个特殊的 Migrations 合约来记录到链上。

4.2.命令

执行移植,使用下述命令:

truffle migrate

如果你之前的移植是成功执行的,这个命令会执行所有的位于 migrations 目录内的移植脚本,truffle migrate 仅会执行新创建的移植。

如果没有新的移植脚本,这个命令不同执行任何操作,可以使用选项 --reset 来从头执行移植脚本。

4.3.移植脚本文件

一个样例文件如下:文件名:4_example_migration.js

module.exports = function(deployer) {

  // deployment steps

  deployer.deploy(MyContract);

};

 

需要注意的是文件名以数字开头,一个描述性的后缀结尾,数字前缀是必须的,用于记录移植是否成功,后缀仅是为了提高可读性,以方便理解。

移植 js 里的 exports 的函数接受一个 deployer 对象作为第一个参数,这个对象用于发布过程,提供了一个清晰的语法支持,同时提供一些通过的合约部署职责,比如保存发布的文件以备稍后使用。deployer 对象是用来缓存(stage)发布任务的主要操作接口。

像所有其它在 Truffle 中的代码一样,Truffle 提供了自己代码的合约抽象层(contract abstractions),并且进行了初始化,以方便可以便利的与以太坊的网络交互,这些抽象接口是发布流程的一部分。

4.4.部署器(deployer

移植文件会使用部署器来缓存部署任务,因此可以按一定顺序排列发布任务,它们会按正确顺序执行:

// Stage deploying A before B

deployer.deploy(A);

deployer.deploy(B);

 

另一选中可选的部署方式是使用 Promise,将部署任务做成一个队列,是否部署依赖于前一个合约的执行情况:

// Deploy A, then deploy B, passing in A's newly deployed address

deployer.deploy(A).then(function() {

  return deployer.deploy(B, A.address);

});

 

如果想更清晰,也可以选择实现一个 Promise 链。

可以根据发布到的网络的具体情况进行不同的部署流程,要实现不同条件的不同部署步骤,移植代码中需要第二个参数 network。示例如下:

module.exports = function(deployer, network) {

  // Add demo data if we're not deploying to the live network.

  if (network != "live") {

    deployer.exec("add_demo_data.js");

  }

}

 

指定一个网络:大多数 Truffle 提供的命令根据指定的网络不同而表现不同,会使用对应网络下的合约和配置信息,可以通过 --network 选项在参数上进行控制:

$ truffle migrate --network live

networks: {

  development: {

    host: "localhost",

    port: 8545,

    network_id: "*" // match any network

  },

  live: {

    host: "178.25.19.88", // Random IP for example purposes (do not use)

    port: 80,

    network_id: 1,        // Ethereum public network

    // optional config values

    // gas

    // gasPrice

    // from - default address to use for any transaction Truffle makes during migrations

  }

}

 

在上面这个例子中,Truffle 会在 live 网络中进行移植,如果配置如上述配置示例的 Example 所指定的内容的话,是最终在以太坊网络上进行部署。

4.5.部署 API

4.5.1.DEPLOYER.DEPLOY

发布一个指定的合约,第一参数是合约对象,后面是一些可选的构造器参数。这个函数适用于单例合约,它只会在 dapp 中只创建一个这个合约的实例(单例),函数会在部署后设置合约的地址(如:C ontract.address 将等于新的部署地址),它将会覆盖之前存储的地址。也可以传入一个合约数组,或数组的数组来加速多合约的部署。

需要注意的是如果库的地址可用,deploy 会自动为这个部署的合约联接任何需要的库,因此如果合约依赖某个库,应该先部署这个库:

// Deploy a single contract without constructor arguments

deployer.deploy(A);



// Deploy a single contract with constructor arguments

deployer.deploy(A, arg1, arg2, ...);



// Deploy multiple contracts, some with arguments and some without.

// This is quicker than writing three `deployer.deploy()` statements as the deployer

// can perform the deployment as a batched request.

deployer.deploy([

  [A, arg1, arg2, ...],

  B,

  [C, arg1]

]);

4.5.2.DEPLOYER.LINK

联接一个已经发布的库到一个或多个合约,destinations 可以是一个合约或多个合约组成的一个数组,如果目标合约并不依赖这个库,部署器会忽略掉这个合约。

这对于在 dapp 中不打算部署的合约(如:非单例)但却需要在使用前先联接的情况下非常有用。

// Deploy library LibA, then link LibA to contract B

deployer.deploy(LibA);

deployer.link(LibA, B);



// Link LibA to many contracts

deployer.link(LibA, [B, C, D]);

4.5.3.DEPLOYER.AUTOLINK(CONTRACT)

关联合约依赖的所有库,这需要所依赖的库已经部署,或在其前一步部署:

// Assume A depends on a LibB and LibC

deployer.deploy([LibB, LibC]);

deployer.autolink(A);

 

另外可以省略参数来调用函数 autolink(),这会自动关联合约依赖的所有库,需要保证在调用这个函数前,所有被需要的库已经部署:

// Link *all* libraries to all available contracts

deployer.autolink();

4.5.4.DEPLOYER.THEN

Promise 语法糖,执行做生意的部署流程:

deployer.then(function() {

  // Create a new version of A

  return A.new();

}).then(function(instance) {

  // Set the new instance of A's address on B.

  var b = B.deployed();

  return b.setA(instance.address);

});

4.5.5.DEPLOYER.EXEC

执行 truffle exec 做为部署的一部分:

// Run the script, relative to the migrations file.

deployer.exec("../path/to/file/demo_data.js");

5.实例

5.1.环境安装

npm install nodejs

npm install -g solc

npm install -g truffle

npm intall -g truffle-flattener

5.2.配置truffle

require('dotenv').config();

//const { MNEMONIC, PROJECT_ID } = process.env;



const private_keys = [

  process.env.PK1

]



const HDWalletProvider = require('@truffle/hdwallet-provider');



module.exports = {



  networks: {

    dev: {

     host: "127.0.0.1",     // Localhost (default: none)

     port: 7545,            // Standard Ethereum port (default: none)

     network_id: "5777",       // Any network (default: none)

    },



    bsctest: {

      provider: () => new HDWalletProvider({

        privateKeys:['0x8b9d4e96fb91e23axxxxxxxxxxx65e0843d'],

        providerOrUrl:`https://bsc-testnet.nodereal.io/v1/77055bfxxxxxxxd5d5b9`,

        numberOfAddress:1  

      }),

      network_id: 97,       

      confirmations: 2,    

      timeoutBlocks: 50, 

      gas: 5000000,         

      gasPrice: 50000000000, 

      skipDryRun: false     // Skip dry run before migrations? (default: false for public nets )

    },



  // Set default mocha options here, use special reporters, etc.

  mocha: {

    // timeout: 100000

  },



  // Configure your compilers

  compilers: {

    solc: {

      version: "0.8.1",      // Fetch exact version from solc-bin

    }

  },



};

配置部署的信息,以bsctest为例。

5.3.编译合约

test@MacBook-Pro TripleC % sudo truffle compile --network bsctest



Compiling your contracts...

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

> Everything is up to date, there is nothing to compile.

5.4.部署合约

test@MacBook-Pro TripleC % sudo truffle migrate --network bsctest



Compiling your contracts...

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

> Everything is up to date, there is nothing to compile.





Starting migrations...

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

> Network name:    'bsc'

> Network id:      56

> Block gas limit: 140000000 (0x8583b00)





1685499904_deploy__triplec_medal.js

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

[ '0xe245fa636F67E491b8052D7C77256Fc192edAd86' ]



   Deploying 'TriplecMedal'

   ------------------------

   > transaction hash:    0x5aeb0933e5eaf680a2df06b41dc59ab1131481e5e5730400cf8e37b9559a6ee4

   > Blocks: 3            Seconds: 9

   > contract address:    0xB8e8037410D23db82E111111b44920f1E92113A1

   > block number:        34105401

   > block timestamp:     1701830356

   > account:             0xe245fa636F671111111d86

   > balance:             0.401088294

   > gas used:            4581180 (0x45e73c)

   > gas price:           50 gwei

   > value sent:          0 ETH

   > total cost:          0.229059 ETH



   Pausing for 2 confirmations...



   -------------------------------

   > confirmation number: 2 (block: 34105405)

   > Saving artifacts

   -------------------------------------

   > Total cost:            0.229059 ETH



Summary

=======

> Total deployments:   1

> Final cost:          0.229059 ETH

这样就可以得到contract address了

标签:network,部署,deployer,Truffle,truffle,合约
From: https://www.cnblogs.com/zhanchenjin/p/17879173.html

相关文章

  • 最新版本——Hadoop3.3.6单机版完全部署指南
    大家好,我是独孤风,大数据流动的作者。本文基于最新的Hadoop3.3.6的版本编写,带大家通过单机版充分了解ApacheHadoop的使用。本文更强调实践,实践是大数据学习的重要环节,也能在实践中对该技术有更深的理解,所以一些理论知识建议大家多阅读相关的书籍(都在资料包中)。本文档版权......
  • kafka 集群企业部署最佳实践
    ......
  • BeeGFS部署高可用集群
    BeeGFS高可用集群搭建参考文档:https://aws.amazon.com/cn/blogs/china/how-to-build-beegfs-on-aws-system/目标状态查询元数据targets>beegfs-ctl--listtargets--nodetype=meta--state存储targets>beegfs-ctl--listtargets--nodetype=storage--state可达性状......
  • 使用阿里云服务器部署.net 6 mvc 程序(使用域名)
    1.创建Web程序打开vs2022,选择ASP.NETCoreWeb应用(模型-视图-控制器)创建项目。修改Program.cspublicstaticvoidMain(string[]args){varbuilder=WebApplication.CreateBuilder(args);//Addservicestothecontainer.builder.Services.AddControllers......
  • Docker部署MySQL
    一、简介MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件之一。二、搭建MySQL绿联DX4600......
  • HydroOJ 踩坑指南(2)服务器选择和部署
    Hydro官方的高级域其实不错,还支持自定义logo和域名,功能也全,但是用了自定义域名,很多的题包括洛谷的就没法用了,而且很多项没法自定义,偶尔会响应时间过长,题目数据不在本地等等,最后发现,还不如自己配置个服务器,这样更有折腾的成就感.服务器的选择可以用阿......
  • java智慧校园源码,SaaS云平台,私有云部署
    什么是电子班牌?电子班牌用来显示班级信息,班级活动信息以及学校的通知信息。信息内容为文字、图片、视频、FLASH等,为学生和老师提供新颖的师生交流及校园服务平台。融合了多媒体信息发布、家校互通、物联控制、教务管理、日常办公等一系列应用,是校园管理的现代手段。学生刷卡考勤数......
  • Isito 部署
    方法一:使用istioctl部署tar-zxvfistio-1.20.0-linux-amd64.tar.gzcdistio-1.20.0/bin/cp-rpistioctl/usr/bin/istioctlversionistioctlprofilelististioctlinstall--manifests=manifests/kubectlgetpods-Akubectllabelnamespacedefaultistio-injec......
  • 1、KVM安装部署及virt-manager图形化工具创建安装虚拟机、命令行工具virt-install创建
    摘自:https://blog.51cto.com/mfc001/6408159KVM安装部署KVM做单机管理虚拟机,Openstack集群管理虚拟机docker单机管理容器,k8s集群管理容器宿主机环境准备在vmware安装linux系统,并在设置中开启虚拟化CPU开启虚拟化一:开启虚拟化引擎两项内容二:提高内存和处理......
  • 基于Java的毕业设计选题管理系统设计与实现(源码+lw+部署文档+讲解等)
    文章目录前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利代码参考源码获取前言......