📜  以太坊-与已部署合约进行交互(1)

📅  最后修改于: 2023-12-03 15:36:22.257000             🧑  作者: Mango

以太坊-与已部署合约进行交互

在以太坊平台上,合约是用来编写智能合约的基本单位。当我们把智能合约编写好之后,如果想要与其进行交互,那么可以通过与以太坊网络上部署的合约进行交互来实现。本文将会介绍如何通过 Solidity 编写智能合约,并与其进行交互。

编写智能合约

首先,我们需要使用 Solidity 编写我们的智能合约。下面展示了一个简单的智能合约代码,用于存储和获取信息:

pragma solidity ^0.8.3;

contract InfoContract {
    string public info;

    function setInfo(string memory _info) public {
        info = _info;
    }

    function getInfo() public view returns (string memory) {
        return info;
    }
}

我们可以看到,这个智能合约包含了两个函数: setInfogetInfosetInfo 函数用于存储信息,而 getInfo 函数用于获取存储的信息。

部署智能合约

在我们与智能合约进行交互之前,我们需要将其部署到以太坊网络上。我们可以使用 Remix 在线 IDE 来部署和测试智能合约。以下是部署智能合约的步骤:

  1. 进入 Remix IDE 页面,并在左侧选择 Solidity 模块。
  2. 在右侧的编辑器中,复制并粘贴智能合约的代码。
  3. 点击顶部菜单栏上的 Compile 按钮来编译我们的智能合约。
  4. 如果编译没有任何错误,我们可以在左侧的 Deploy & Run Transactions 模块上选择我们部署的合约,并选择合约的选项参数。
  5. 在此步骤中,我们需要指定交互合约所需要的一些参数,例如我们需要选择交互合约的账户、使用的网络、交互函数等等。
  6. 最后,我们可以点击 Deploy 按钮来部署我们的智能合约,并且可以在终端上看到部署后的交易信息。
与智能合约进行交互

当我们成功部署了智能合约之后,我们可以通过调用智能合约的函数来与其交互。以下是一些常见的与智能合约进行交互的方式:

使用 Web3.js

Web3.js 是一个用于与以太坊节点进行交互的 JavaScript 库。通过使用 Web3.js,我们可以编写脚本来与智能合约进行交互。以下是一个简单的 Web3.js 脚本,用于存储和获取信息:

const Web3 = require("web3");
const web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

// 定义合约地址和合约 ABI
const contractAddress = "0xD1Ff57B284122bDaD094A61614A8CA840d2Ae738";
const contractABI = [
  {
    "constant":true,
    "inputs":[],
    "name":"getInfo",
    "outputs":[{"name":"","type":"string"}],
    "payable":false,
    "stateMutability":"view",
    "type":"function"
  },
  {
    "inputs":[{"name":"_info","type":"string"}],
    "payable":false,
    "stateMutability":"nonpayable",
    "type":"constructor"
  },
  {
    "constant":false,
    "inputs":[{"name":"_info","type":"string"}],
    "name":"setInfo",
    "outputs":[],
    "payable":false,
    "stateMutability":"nonpayable",
    "type":"function"
  }
];

// 实例化合约对象
const contract = new web3.eth.Contract(contractABI, contractAddress);

// 调用 setInfo 函数
contract.methods.setInfo("Hello World!").send({ from: "0x4882dae68f7755d5a7c021f1ee3b7d36af48e19e" }, function(error, result) {
  if (error) {
    console.log(error);
  } else {
    console.log(result);
  }
});

// 调用 getInfo 函数
contract.methods.getInfo().call({}, function(error, result) {
  if (error) {
    console.log(error);
  } else {
    console.log(result);
  }
});
使用 Truffle

Truffle 是一个用于开发智能合约和 Dapp 的框架。通过使用 Truffle,我们可以方便地编写和测试 Solidity 智能合约,并与其进行交互。以下是一个简单的 Truffle 脚本,用于存储和获取信息:

const InfoContract = artifacts.require("InfoContract");

async function test() {
  const contractInstance = await InfoContract.deployed();

  // 调用 setInfo 函数
  await contractInstance.setInfo("Hello World!");

  // 调用 getInfo 函数
  const info = await contractInstance.getInfo();
  console.log(info);
}

test();
总结

本文介绍了如何使用 Solidity 编写智能合约,如何部署智能合约到以太坊网络上,并且介绍了几种常用的与智能合约进行交互的方式。当我们需要与已部署的合约进行交互时,可以使用这些方式来实现。