创建智能合约并使用ABI功能

时间:2018-08-12 13:41:42

标签: ethereum solidity smartcontracts

对于最近的测试,有人要求我用Ethernum生成智能合约,并使用ABI json提供的一些功能来提取一些信息。 我按照建议使用https://ropsten.etherscan.io

最近2天,我学习了以太坊,并尝试使用Solidity Remix提取这些信息,但是我不知道如何在Solidity Remix中使用ABI函数。

我所拥有的只是一个地址合同和一个ABI合同。 有没有人可以提供我一些信息? 谢谢

1 个答案:

答案 0 :(得分:0)

我建议您使用 web3js 之类的库以编程方式进行操作,web3js允许您通过RPC Web服务与以太坊网络(帐户,智能合约)进行交互。

在以下示例中,我使用TruffleGanache(以太坊的工具和框架)在本地区块链上部署了名为 SimpleStorage 的合同。

pragma solidity ^0.4.2;

contract SimpleStorage {
    uint public value;

    function SimpleStorage() {
        value = 1;
    }

    function setValue(uint val) {
        value = val;
    }

    function getValue() returns(uint) {
        return value;
    }
}

部署在以太坊区块链上的每个合约都为您的智能合约配备了ABI( Application Binary Interface )Swagger。程序使用ABI通过RPC与智能合约进行交互。

每个合同都部署在一个唯一的地址上,例如0x3450226a2fccb0d3668e7c3a730c43ef50ec8a06

1。启动一个nodeJS项目并添加web3js库

$ npm init
$ npm install web3@0.20.6 -s

2。创建一个JavaScrit文件index.js

注入依赖项

const Web3 = require('web3');

声明节点的rpc端点。我使用的是本地区块链,但是您可以轻松地使用Infura连接到Ropsten公共节点(取决于您所签约的网络)

const RPC_ENDPOINT = "http://localhost:8545" //https://ropsten.infura.io

连接到以太坊节点

var web3 = new Web3(new Web3.providers.HttpProvider(RPC_ENDPOINT));

设置默认帐户

web3.eth.defaultAccount = web3.eth.accounts[0]

在此处输入您的ABI以及部署智能合约的地址

var abi = [...];
var address = "0x3450226a2fccb0d3668e7c3a730c43ef50ec8a06";

从abi加载合约模式

var SimpleStorageContract = web3.eth.contract(abi);

通过地址实例化合同

var simpleStorageContractInstance = SimpleStorageContract.at(address);

调用ABI函数之一

var value = simpleStorageContractInstance.getValue.call();
console.log("value="+value);

结果:

当我调用SimpleStorage合同实例的函数getValue时,该函数返回1。

value=1

完整代码:

const Web3 = require('web3');
const RPC_ENDPOINT = "http://localhost:8545"

// Connection to a Ethereum node
var web3 = new Web3(new Web3.providers.HttpProvider(RPC_ENDPOINT));

// Set default account
web3.eth.defaultAccount = web3.eth.accounts[0]

// ABI describes a smart contract interface developped in Solidity
var abi = [
    {
      "constant": true,
      "inputs": [],
      "name": "value",
      "outputs": [
        {
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "val",
          "type": "uint256"
        }
      ],
      "name": "setValue",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [],
      "name": "getValue",
      "outputs": [
        {
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ];

// Address where the smart contract is deployed
var address = "0x3450226a2fccb0d3668e7c3a730c43ef50ec8a06";

// Load the contract schema from the abi
var SimpleStorageContract = web3.eth.contract(abi);

// Instanciate by address
var simpleStorageContractInstance = SimpleStorageContract.at(address);

// Call one of the ABI function
var value = simpleStorageContractInstance.getValue.call();
console.log("value="+value);

项目的GitHub:

https://github.com/gjeanmart/stackexchange/tree/master/51809356-create-smart-contract-and-use-abi-functions

以太坊StackExchange

有一个专门的以太坊问题here

的StackExchange社区