草庐IT

以太坊开发(一)

韭菜快快长大 2023-04-10 原文

以太坊开发

声明:本文只用于个人学习。在参考别人文章后结合自己试验所总结的内容,仅供参考。

使用Ganache CLI在私有链上搭建智能合约

本文环境

Windows

Truffle v5.5.28 (core: 5.5.28)

Node v16.15.0

Ganache CLI v6.12.2 (ganache-core: 2.13.2)

编译环境:vscode

Ganache下载安装

打开终端,输入

npm install -g ganache-cli

安装完成后命令行输入$ ganache-cli,查看是否安装成功。

注意:启动ganache-cli也是此指令。

PS E:\VSCODE\helloworld> ganache-cli
Ganache CLI v6.12.2 (ganache-core: 2.13.2)

Available Accounts
==================
(0) 0x4Ef77E82D5eC8660Dc92e91C771af74e3476028a (100 ETH)
(1) 0x79733c1C637486f1E37dF51979C9bAD767d5d6A1 (100 ETH)
(2) 0xB013643232F3dC05DE3D1a6dB281aB2A3AAb379F (100 ETH)
(3) 0x0Adf75FF3017CB05267F55C0d28C947d71f353C8 (100 ETH)
(4) 0x154A33e652B41ff773398F8E71eb095F95556fe3 (100 ETH)
(5) 0xb81Ccab240F70Cd1Ead20F03eD7676415E7cE3ac (100 ETH)
(6) 0x29116B55aFDb2278a2C4A4E9abf48c052c3F1810 (100 ETH)
(7) 0x03962DB7A11c862715815E029c8e703917c668aa (100 ETH)
(8) 0x48E2021a19eC67e802bC3BB26e59537e7981716C (100 ETH)
(9) 0x9dDBCa6bbbb095607CC7D52cEb0b6e15ee218e32 (100 ETH)

Private Keys
==================
(0) 0x01ba9c1fef0e6143af73547406d6197f25517acc1e116d6be5a2e9c34b65c29f
(1) 0x7e36c1b0c4f6ecc793cb2230296e4ecf8e766380ed31da3b7840a55e2feb332d
(2) 0x820648d31f094b67c88efa5368a17700b91cd08d56525dafb0297946113861e2
(3) 0x384f62cb50e92dd40a61b64569e4826f06e4b58bb641ac146e3c711bc6cb951c
(4) 0xa0ab18b41192e27616b8928a6bd8180f12ed07024d5d93deb8809d8c60fccc81
(5) 0x29dd757fa884ecdb236f8f71b55004c34c6c93f7a04e39402302302aa0f7992c
(6) 0x32ea3c8662f24780f6129d362550f6d17dfda96340554d66c7e0027998d64741
(7) 0x89a25c4983e17c10d3c5f8266b9423cf04db645a1296c02ec165e8a6e96fa573
(8) 0x400fc50e4200c10098ef2bbf54456fbf909da3aa04afcc49fe92354ee0df30f1
(9) 0x097a624e0a6d2e0d6cb963befdbf33b427e9bbf5bddee6446473a45a7fd8c823

HD Wallet
==================
Mnemonic:      fiber obvious coffee census mail pet appear amazing lunar turtle filter wish
Base HD Path:  m/44'/60'/0'/0/{account_index}

Gas Price
==================
20000000000

Gas Limit
==================
6721975

Call Gas Limit
==================
9007199254740991

Listening on 127.0.0.1:8545

使用Truffle编写测试自己的智能合约HelloWorld

创建文件夹并初始化项目

PS E:\VSCODE>mkdir HelloWorld
PS E:\VSCODE>cd HelloWorld
PS E:\VSCODE\helloworld> truffle init

Starting init...
================

> Copying project files to E:\VSCODE\helloworld
Try our scaffold commands to get started:
  $ truffle create contract YourContractName # scaffold a contract
  $ truffle create test YourTestName         # scaffold a test

http://trufflesuite.com/docs

完成后的文件目录如下:

  • contracts 智能合约目录
  • migrations 发布脚本目录
  • test 存放测试文件
  • truffle.js Truffle的配置文件
  • truffle-config.js Truffle的配置文件

当使用Windows的命令行时,默认的配置文件名与truffle冲突。这种情况下,我们推荐使用Windows的power Shell或Git BASH。你也可

以将配置文件重命名为truffle-config.js来避免冲突。

创建一个 HelloWorld合约并编译

  1. 在contracts目录中新建一个HelloWorld.sol文件,代码如下
pragma solidity ^0.4.17;

contract HelloWorld {

  //say hello world
  function say() public pure returns (string) {
    return "Hello World";
  }

  //print name
  function print(string name) public pure returns (string) {
    return name;
  }
}
  1. 创建migrations/1_initial_migration.js文件,部署脚本,将我们刚才创建的HelloWorld.sol文件设置到发布配置文件中,内容如下:
var HelloWorld = artifacts.require("./HelloWorld.sol");
module.exports = function(deployer) {
	deployer.deploy(HelloWorld);
};
  1. 编辑truffle.js(truffle-config.js)配置文件,设置我们稍后要部署智能合约的位置,内容如下:
module.exports = {
    networks: {
        development: {
          host: "localhost",
          port: 8545,
          network_id: "*"
        }
    }
};

Ganache CLI默认运行在8545端口。

如果要部署到指定的网络,可以使用–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  Gas limit used for deploys. Default is 4712388
    // gasPrice Gas price used for deploys. Default is 100000000000 (100 Shannon).
    // from - default address to use for any transaction Truffle makes during migrations
    // provider - web3 provider instance Truffle should use to talk to the Ethereum network.
    //          - if specified, host and port are ignored.
  }
}

稳妥起见,也可以加入指定编译器,内容如下:

module.exports = {
  compilers: {
    solc: {
      version: "0.4.17",      // Fetch exact version from solc-bin (default: truffle's version)
      // docker: true,        // Use "0.5.1" you've installed locally with docker (default: false)
      // settings: {          // See the solidity docs for advice about optimization and evmVersion
      //  optimizer: {
      //    enabled: false,
      //    runs: 200
      //  },
      //  evmVersion: "byzantium"
      // }
    }
  },

  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  Gas limit used for deploys. Default is 4712388
      // gasPrice Gas price used for deploys. Default is 100000000000 (100 Shannon).
      // from - default address to use for any transaction Truffle makes during migrations
      // provider - web3 provider instance Truffle should use to talk to the Ethereum network.
      //          - if specified, host and port are ignored.
    }
    
  }

};
  1. 代码准备就绪,输入truffle compile开始编译:
PS E:\VSCODE\helloworld> truffle compile

Compiling your contracts...
===========================
> Compiling .\contracts\HelloWorld.sol-bin. Attempt #1
> Artifacts written to E:\VSCODE\helloworld\build\contracts
> Compiled successfully using:
   - solc: 0.4.17+commit.bdeb9e52.Emscripten.clang

部署智能合约并测试

  1. 首先启动Ganache CLI,新开一个命令窗口,输入命令ganache-cli,如果刚才已经启动过,就不需要再次启动了。

  2. 然后回到Truffle,输入truffle migrate开始部署

yuyangdeMacBook-Pro:TestTruffle yuyang$ truffle migrate
Using network 'development'.

Network up to date.

  1. 如果出现上面的结果,说明没有部署成功,输入truffle migrate --reset重新执行所有脚本进行部署,暂时不清楚原因。

如果部署成功,会显示以下结果

PS E:\VSCODE\helloworld> truffle migrate --reset

Compiling your contracts...
===========================
> Compiling .\contracts\HelloWorld.sol
> Artifacts written to E:\VSCODE\helloworld\build\contracts
> Compiled successfully using:
   - solc: 0.4.17+commit.bdeb9e52.Emscripten.clang


Starting migrations...
======================
> Network name:    'development'
> Network id:      1662306457614
> Block gas limit: 6721975 (0x6691b7)


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

   Deploying 'HelloWorld'
   ----------------------
   > transaction hash:    0xa90362bffda2beb9020351f9b88a95a7384c9e21cb1c14adc008f8b9e04a602d
   > Blocks: 0            Seconds: 0
   > contract address:    0xce8C19769f9eC8EE5935108524e5377f990a1cC1
   > block number:        1
   > block timestamp:     1662306500
   > account:             0x4Ef77E82D5eC8660Dc92e91C771af74e3476028a
   > gas used:            176982 (0x2b356)
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.00353964 ETH

   > Saving artifacts
   -------------------------------------
   > Total cost:          0.00353964 ETH

Summary
=======
> Total deployments:   1
> Final cost:          0.00353964 ETH
  1. 开始测试,输入truffle console打开truffle控制台,测试刚才我们部署的HelloWorld合约:
PS E:\VSCODE\helloworld> truffle console
truffle(development)> var contract
undefined
truffle(development)> HelloWorld.deployed().then(function(instance){contract = instance;});
undefined
truffle(development)> contract.say()
'Hello World'
truffle(development)> contract.print("hello world")
'hello world'

var contract和javascript语法一样,表示声明一个contract变量。

HelloWorld.deployed().then(function(instance){contract= instance;});

表示将HelloWorld合约主体,传递给contract变量。

后面我们就可以直接使用变量contract分别调用say()方法和print(‘’),得到我们想要的结果。

测试成功!

参考文件:https://www.jianshu.com/p/9233c214e205

有关以太坊开发(一)的更多相关文章

  1. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  2. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  3. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  4. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  5. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  6. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  7. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  8. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  9. ruby-on-rails - environment.rb 中设置的常量在开发模式中消失 - 2

    了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl

  10. ruby - Rails 开发服务器、PDFKit 和多线程 - 2

    我有一个使用PDFKit呈现网页的pdf版本的Rails应用程序。我使用Thin作为开发服务器。问题是当我处于开发模式时。当我使用“bundleexecrailss”启动我的服务器并尝试呈现任何PDF时,整个过程会陷入僵局,因为当您呈现PDF时,会向服务器请求一些额外的资源,如图像和css,看起来只有一个线程.如何配置Rails开发服务器以运行多个工作线程?非常感谢。 最佳答案 我找到的最简单的解决方案是unicorn.geminstallunicorn创建一个unicorn.conf:worker_processes3然后使用它:

随机推荐