四:调用部署在ganache的智能合约

Posted 小小程序猿~~~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了四:调用部署在ganache的智能合约相关的知识,希望对你有一定的参考价值。

四:调用部署在ganache的智能合约

文章目录


如果朋友有代码,工具,使用流程等不太清楚的,可用去专栏看看,专栏中有文章中所提及的具体使用方式。不太明白的朋友可以自己去看看~~ 瞬移专栏

实验目的

	用VS Code进行代码开发,良好的可视化界面有助于开发速度;通过在ganache中对智能合约进行调用,熟悉ether.js的使用。

实验原理

  • ether.js中提供了我们对智能合约进行调用的方法,使用ether.js能很方便我们和智能合约进行交互。
  • js代码的编写采用异步的方式,因为需要等待测试网中的结果返回,不然得到的会是未定义的结果。

开始条件

  • 安装好基于windows系统的子系统wsl。默认安装ubuntu20.04。
  • 安装好VS Code。
  • nodejs
  • ganache-cli
  • ether.js
  • VS code
  • ethers.js为以太坊区块链及其生态系统提供一个小而完整的 javascript API 库。方便开发者更好的与智能合约交互。
  • fs是js读取文件的一个组件,方便我们读取目录中的文件。

实验过程

  1. 安装VS Code拓展包Solidity + Hardhat,增强solidity代码可读性
  2. 编写ether.js代码,实现与智能合约交互

实验步骤

  1. ubuntu命令行中进入test目录,输入code . 进入VS Code

  2. 安装VS Code拓展包Solidity + Hardhat

  3. 打开上一章编写的deploy.js文件,在后面加入如下内容和合约交互

      console.log(`查看项目地址:$contract.address`);
      // 设置最喜欢的数字
      await contract.store(9);
      // 查看最喜欢的数字
      const storeNumber = await contract.retrieve();
      console.log(`设置的商店最幸运的数字是: $storeNumber`);
    
      //增加一个人
      await contract.addPerson("Daf", 8);
      //查看添加的第一个人的最喜欢的数字
      const  favoriteNumber, name  = await contract.people(0);
      console.log(`$name最喜欢的数字是:$favoriteNumber`);
    

  1. 打开端口,快捷键: ctrl + `

    启动ganache:ganache-cli

    提醒:每一次启动ganache时,它的私钥都不一样,所以重新启动ganache后记得修改填入deploy.js中的私钥,不然代码执行不会通过。

  2. 打开另外一个端口。快捷键: ctrl + shift+`

    输入node deploy.js运行deploy.js,

  3. 查看结果

相关官方知识库

  1. ether.js

下一章内容:

用Mocha编写solidity的测试

欢迎讨论学习⊙﹏⊙

对文章满意的话欢迎点赞收藏,哈哈

我不会对文章设置VIP等限制,有喜欢的朋友可以打赏,打赏也是博主勤更的动力,谢谢你~~

仅使用 EVM API 在区块链上部署智能合约,而不使用 geth 或 tuffle 或 ganache?

【中文标题】仅使用 EVM API 在区块链上部署智能合约,而不使用 geth 或 tuffle 或 ganache?【英文标题】:Deploy smart contract on blockchain only using EVM API without using geth or tuffle or ganache? 【发布时间】:2020-03-09 00:26:40 【问题描述】:

我已经使用 node js 为物联网用例实现了我的个人区块链,所以我现在想在不使用 geth 或 tuffle 或 ganache 或 Remix 或 web3.js 的情况下将智能合约代码部署到这个区块链中,所以我的目标是使用 EVM API只是为了编译和执行智能合约。 那么,如何?

【问题讨论】:

不清楚您在问什么...您使用的是以太坊分叉还是具有 EVM 功能的东西?您提到使用 Node.js “实现了个人区块链”。除非您构建了对某些 EVM 解释器的支持,否则它将无法运行 EVM 字节码。如果您要连接到诸如 Geth 或 Parity from 节点之类的东西,您可以直接部署字节码。你能澄清一下吗? 如果不运行节点,那么 EVM 是从哪里来的? 也许 OP 正在询问如何在 OP 部署到自己的区块链时创建 EVM 解释器 我成功编译并生成了字节码和 ABI 以及操作码,但我想看看智能合约代码的结果!除此之外,我如何将此字节码更改为地址,并在我询问地址时执行字节码。 【参考方案1】:

您可以查看合同 ABI 规范

关注here

合约应用程序二进制接口 (ABI) 是 从外部与以太坊生态系统中的合约交互 区块链和合约间交互。数据是 根据其类型进行编码,如本规范中所述。这 编码不是自我描述的,因此需要一个模式才能 解码。

还有,

要与以太坊集成,需要启用 RPC / IPC 的以太坊客户端节点,如 Geth, parityquorum 等。

如果您只是对从合约中检索现有数据或从以太坊公共链发送离线签名交易感兴趣,您可以使用像 Infura 这样的公共节点,而无需安装像 Parity 或 Geth 这样的本地客户端。

对于智能合约开发,您还可以安装Test RPC,它将在内存中创建一个没有松露或甘纳许的网络。

testrpc 是一个基于 Node.js 的以太坊客户端,用于测试和 发展。它使用 ethereumjs 来模拟完整的客户端行为和 使开发以太坊应用程序的速度更快。它还包括 所有流行的 RPC 功能和特性(如事件)并且可以运行 确定性地使开发变得轻而易举。

有关 testrpc 的更多详细信息,请关注here

安装 testrpc

npm install -g ethereumjs-testrpc

注意

Ganache CLI 是最新版本的 TestRPC:一个快速且可定制的 区块链模拟器。它允许您调用区块链 无需运行实际以太坊节点的开销。

安装 ganache-cli

npm install -g ganache-cli

步骤:-

    为物联网应用创建智能合约。 使用 nodejs 的 solc solidity 编译器编译合约

    从编译好的JS合约对象中获取接口对象

    字节码字符串,它是 合同基本上是一组(某种)汇编指令 让以太坊虚拟机执行

    将合约部署到 testrpc 网络

here 是不使用松露或甘纳许的详细解决方案

仅使用字节码进行部署

另请参阅以仅使用字节码进行部署:here 和 here 和 Yellow paper

【讨论】:

感谢您的帮助,但目标是仅使用 EVM js,因为我实现了不同的区块链(我的区块链用于物联网而不是加密。 您需要编译合约并部署到网络..不需要任何工具或框架....工具让一切变得简单......您可以为物联网创建智能合约......编译它并部署到网络......为此,但网络应该启动并运行 谢谢你我明白了,但我想在我自己的区块链上而不是在网络上部署合约 你自己的网络是什么意思。以太坊支持私有区块链网络。所以你需要创建你自己的网络。然后在上面部署你的智能合约。 我正在深入研究 etheurum 不使用 etheurum(所以请尝试由我存储智能合约而不使用 etheurum【参考方案2】:

编译你的合约(结果文件是/build/contracts/YourContract.json),然后在没有松露的情况下部署:

// Dependencies
const Web3 = require('web3');
const fs = require("fs");

// Load Parameter
let PROVIDER = ...
let FROM_ACCOUNT = ...
let FROM_PRIVATE_KEY = ...

// Create web3 instance
const web3 = new Web3(new Web3.providers.HttpProvider(PROVIDER), null, transactionConfirmationBlocks: 1);

// Deploy
web3.eth.getTransactionCount(FROM_ACCOUNT)
    .catch(e => 
        console.log(e);
    )
    .then(txCount => 

        // construct the transaction data
        const txData = 
            nonce: web3.utils.toHex(txCount),
            from: FROM_ACCOUNT,
            data: JSON.parse(fs.readFileSync('./build/contracts/YourContract.json', 'utf8')).bytecode,
            gasLimit: web3.utils.toHex(7900000),
            gasPrice: web3.utils.toHex(web3.utils.toWei('12', 'gwei')),
        ;
        console.log('nonce             : ' + txData.nonce);
        console.log('gasPrice          : ' + txData.gasPrice);

        // contract creation
        web3.eth.accounts.signTransaction(txData, FROM_PRIVATE_KEY).then(signed => 
            console.log('sign transaction  : OK');

            web3.eth.sendSignedTransaction(signed.rawTransaction)
                .on("error", error => 
                    console.log('send transaction  : ' + error);
                    throw "DEPLOY FAILED";
                )
                .on("receipt", (receipt) => 
                    console.log('send transaction  : OK');
                    let contractAddress = (receipt.contractAddress === null) ? 'n.a.' : receipt.contractAddress;
                    console.log("CONTRACT_ADDRESS  : " + contractAddress);
                );
            );
        );
    );

依赖 web3 v1.2.1 和 fs v0.0.2

【讨论】:

以上是关于四:调用部署在ganache的智能合约的主要内容,如果未能解决你的问题,请参考以下文章

java调用智能合约

仅使用 EVM API 在区块链上部署智能合约,而不使用 geth 或 tuffle 或 ganache?

以太坊私链账户下智能合约的部署与调用——使用RemixGolangGeth

合约代码无法存储,请检查您的gas限制:以太坊智能合约部署失败:

Solidity 智能合约迁移错误的 Truffle 和 Ganache 教程

我如何存储合约地址