使用 web3 以太坊调用智能合约方法

2023-11-24

尝试使用以太坊解决区块链问题时,我在尝试与已部署的合约交互时遇到了问题。我想要实现的是调用一个方法来显示添加到使用 Geth 本地部署的私有区块链中的信息。

我无法从我的智能合约中调用任何函数,我一直想知道我是否做错了什么......有人可以告诉我如何实现对此合约中方法之一的简单调用吗?假设显示现有机构或用户所属的机构名称。

我的合同:代理.sol

pragma solidity ^0.4.18;
// We have to specify what version of compiler this code will compile with

contract Agency {

  event NewAgency(uint agencyId, string name, uint dna);

  uint dnaDigits = 16;
  uint dnaModulus = 10 ** dnaDigits;

  //agency structure
  struct Agency {
    string name;
    uint dna;
  }

  Agency[] public agencies;

  mapping (uint => address) public agencyToOwner;
  mapping (address => uint) ownerAgencyCount;

  function _createAgency(string _name, uint _dna) private {
    uint id = agencies.push(Agency(_name, _dna)) - 1;
    agencyToOwner[id] = msg.sender;
    ownerAgencyCount[msg.sender]++;
    NewAgency(id, _name, _dna);
  } 

  function _generateRandomDna(string _str) private view returns (uint) {
    uint rand = uint(keccak256(_str));
    return rand % dnaModulus;
  }

  function createRandomAgency(string _name) public {
    //make sure contract can only execute if user is not part of an agency
    require(ownerAgencyCount[msg.sender] == 0);
    uint randDna = _generateRandomDna(_name);
    _createAgency(_name, randDna);
  }
}

abi定义

> abiDefinition
[ { constant: true,
    inputs: [ [Object] ],
    name: 'agencies',
    outputs: [ [Object], [Object] ],
    payable: false,
    stateMutability: 'view',
    type: 'function' },
  { constant: true,
    inputs: [ [Object] ],
    name: 'agencyToOwner',
    outputs: [ [Object] ],
    payable: false,
    stateMutability: 'view',
    type: 'function' },
  { constant: false,
    inputs: [ [Object] ],
    name: 'createRandomAgency',
    outputs: [],
    payable: false,
    stateMutability: 'nonpayable',
    type: 'function' },
  { anonymous: false,
    inputs: [ [Object], [Object], [Object] ],
    name: 'NewAgency',
    type: 'event' } ]

部署成功:

INFO [01-09|19:09:14] Submitted contract creation              fullhash=0x7c43e896329138a6778938ca30d2f5f17f9a63062b359a4fccbd1a1be439f385 contract=0x65175d22C56E1Bad976A331A8B6B448cd4B3995d

最后contractInstance:

> contractInstance = AgencyContract.at(0x65175d22C56E1Bad976A331A8B6B448cd4B3995d)
Contract {
  _eth: 
   Eth {
     _requestManager: RequestManager { provider: [Object], polls: {}, timeout: null },
     getBalance: { [Function: send] request: [Function: bound ], call: 'eth_getBalance' },
     getStorageAt: { [Function: send] request: [Function: bound ], call: 'eth_getStorageAt' },
     getCode: { [Function: send] request: [Function: bound ], call: 'eth_getCode' },
     getBlock: { [Function: send] request: [Function: bound ], call: [Function: blockCall] },
     getUncle: { [Function: send] request: [Function: bound ], call: [Function: uncleCall] },
     getCompilers: { [Function: send] request: [Function: bound ], call: 'eth_getCompilers' },
     getBlockTransactionCount: 
      { [Function: send]
        request: [Function: bound ],
        call: [Function: getBlockTransactionCountCall] },
     getBlockUncleCount: 
      { [Function: send]
        request: [Function: bound ],
        call: [Function: uncleCountCall] },
     getTransaction: 
      { [Function: send]
        request: [Function: bound ],
        call: 'eth_getTransactionByHash' },
     getTransactionFromBlock: 
      { [Function: send]
        request: [Function: bound ],
        call: [Function: transactionFromBlockCall] },
     getTransactionReceipt: 
      { [Function: send]
        request: [Function: bound ],
        call: 'eth_getTransactionReceipt' },
     getTransactionCount: { [Function: send] request: [Function: bound ], call: 'eth_getTransactionCount' },
     call: { [Function: send] request: [Function: bound ], call: 'eth_call' },
     estimateGas: { [Function: send] request: [Function: bound ], call: 'eth_estimateGas' },
     sendRawTransaction: { [Function: send] request: [Function: bound ], call: 'eth_sendRawTransaction' },
     signTransaction: { [Function: send] request: [Function: bound ], call: 'eth_signTransaction' },
     sendTransaction: { [Function: send] request: [Function: bound ], call: 'eth_sendTransaction' },
     sign: { [Function: send] request: [Function: bound ], call: 'eth_sign' },
     compile: { solidity: [Object], lll: [Object], serpent: [Object] },
     submitWork: { [Function: send] request: [Function: bound ], call: 'eth_submitWork' },
     getWork: { [Function: send] request: [Function: bound ], call: 'eth_getWork' },
     coinbase: [Getter],
     getCoinbase: { [Function: get] request: [Function: bound ] },
     mining: [Getter],
     getMining: { [Function: get] request: [Function: bound ] },
     hashrate: [Getter],
     getHashrate: { [Function: get] request: [Function: bound ] },
     syncing: [Getter],
     getSyncing: { [Function: get] request: [Function: bound ] },
     gasPrice: [Getter],
     getGasPrice: { [Function: get] request: [Function: bound ] },
     accounts: [Getter],
     getAccounts: { [Function: get] request: [Function: bound ] },
     blockNumber: [Getter],
     getBlockNumber: { [Function: get] request: [Function: bound ] },
     protocolVersion: [Getter],
     getProtocolVersion: { [Function: get] request: [Function: bound ] },
     iban: 
      { [Function: Iban]
        fromAddress: [Function],
        fromBban: [Function],
        createIndirect: [Function],
        isValid: [Function] },
     sendIBANTransaction: [Function: bound transfer] },
  transactionHash: null,
  address: 5.771290982673958e+47,
  abi: 
   [ { constant: true,
       inputs: [Array],
       name: 'agencies',
       outputs: [Array],
       payable: false,
       stateMutability: 'view',
       type: 'function' },
     { constant: true,
       inputs: [Array],
       name: 'agencyToOwner',
       outputs: [Array],
       payable: false,
       stateMutability: 'view',
       type: 'function' },
     { constant: false,
       inputs: [Array],
       name: 'createRandomAgency',
       outputs: [],
       payable: false,
       stateMutability: 'nonpayable',
       type: 'function' },
     { anonymous: false,
       inputs: [Array],
       name: 'NewAgency',
       type: 'event' } ],
  agencies: 
   { [Function: bound ]
     request: [Function: bound ],
     call: [Function: bound ],
     sendTransaction: [Function: bound ],
     estimateGas: [Function: bound ],
     getData: [Function: bound ],
     uint256: [Circular] },
  agencyToOwner: 
   { [Function: bound ]
     request: [Function: bound ],
     call: [Function: bound ],
     sendTransaction: [Function: bound ],
     estimateGas: [Function: bound ],
     getData: [Function: bound ],
     uint256: [Circular] },
  createRandomAgency: 
   { [Function: bound ]
     request: [Function: bound ],
     call: [Function: bound ],
     sendTransaction: [Function: bound ],
     estimateGas: [Function: bound ],
     getData: [Function: bound ],
     string: [Circular] },
  allEvents: [Function: bound ],
  NewAgency: { [Function: bound ] 'uint256,string,uint256': [Function: bound ] } }

我试过了:

contractInstance.agencies()
contractInstance.agencies.call()
contractInstance.agencies.call({from:ak})

结果是Error: Invalid number of arguments to Solidity function

contractInstance.agencies.call("name" {from:ak})

结果是Error: invalid address我也尝试过打电话agencyToOwner and createRandomAgency但没有任何作用。

我们将很高兴收到任何帮助! 谢谢,


您可以使用以下任一方式调用合约函数contract.methodName.call(), contract.methodName.sendTransaction(), or contract.methodName()方法。最后一个版本只是根据方法类型委托给前两个版本之一(即,如果它是constant)。请参阅合同方式文档中的部分。

参数列表以函数本身的参数(如果有)开始,后面是可选的事务对象,最后是回调。致电您的createRandomAgency()方法,你会这样做:

const contract = web3.eth.contract(contractAbi);
const contractInstance = contract.at(contractAddress);

const transactionObject = {
  from: fromAccount,
  gas: gasLimit
  gasPrice: gasPriceInWei
};

contractInstance.createRandomAgency.sendTransaction('name', transactionObject, (error, result) => { // do something with error checking/result here });

可以找到交易对象的可用选项列表here.

致电您的公众agencies数组,它看起来像

contractInstance.agencies.call(0, (error, result) => {
  if (!error) {
    console.log(result.name);
    console.log(result.dna);
  }
}); // transaction object not needed
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 web3 以太坊调用智能合约方法 的相关文章

随机推荐

  • DoCmd.DeleteObject acTable 与 DoCmd.DeleteObject acTable 之间有什么区别?掉落表

    Details 我有一个 MS Access 数据库过程 可以在数据库中本地创建表 但是 我想确保我创建的表经过测试 如果测试失败 我需要删除 删除已创建的其他表 我猜基本上是一个回滚过程 问题 我遇到了两种删除表的方法 但无法弄清楚其中一
  • android中从包名获取应用程序名称

    我正在尝试开发一个android应用程序 它可以列出所有具有缓存的应用程序 我成功地获取了有关缓存的信息 但现在我想在屏幕上显示那些具有缓存的应用程序 我有包名称 但是问题是如何从包名称中获取应用程序名称 假设包名称是com android
  • 如何将字典中的值添加到电子表格?

    我有一个模板电子表格文档 其中有两列 服务器名称和 IP 地址 如何填充电子表格 以便每个字典键位于 服务器 列中自己的单元格中 而相应的值位于 IP 列中它旁边的单元格中 我正在使用 EPPlus 库 但找不到有关该主题的任何内容 以下是
  • Django:如何使用子查询注释 M2M 或 OneToMany 字段?

    I have Order物体和OrderOperation代表订单操作 创建 修改 取消 的对象 从概念上讲 一个订单有一对多的订单操作 每次对订单进行操作时 都会在该操作中计算总计 这意味着当我需要查找订单的属性时 我只需使用子查询获取最
  • 如何查明“调试模式”是否已启用

    Java 程序如何知道它是否在调试模式下运行 应用程序在常规 全速 模式下的行为应与 调试模式 下 当连接调试器时 在调试模式下运行时 略有不同 应用程序通过 TCP 与另一台计算机 另一个进程或自身内部进行通信 我的同事希望我们使用Soc
  • 如何使用 Composer 安装 Zend Framework 2 Tool

    我不知道如何在使用 Composer 引导时运行 zf php Zend Framework 2 Tool 首先 我根据文档引导 Composer 和 zftool mkdir tmp cd tmp curl s https getcomp
  • docker-compose 在启动使用 create-react-app 创建的 React 应用程序后立即停止

    我正在尝试使用以下命令创建一个反应应用程序create react app所描述的工具here 我想用docker compose在 docker 容器内运行 React 应用程序 我已采取以下步骤 在我的机器上我创建了一个目录调用app并
  • 全局引用命名空间?

    有没有办法在整个解决方案中全局引用命名空间 因此 不要在每个代码文件中都包含这些行 using System using MyNamespace 只需声明一次 每个代码文件都会使用它们 顺便说一句 我正在使用 Visual Studio 不
  • 如何编译 Hive UDF

    我正在尝试编译这个 UDF package com dataminelab hive udf import org apache hadoop hive ql exec UDF import org apache hadoop io Tex
  • 在Python中接收16位整数

    我正在通过串行端口从硬件读取 16 位整数 使用Python 我怎样才能得到正确的LSB和MSB 并使Python明白它是我正在摆弄的16位有符号整数 而不仅仅是两个字节的数据 尝试使用struct module import struct
  • 如何将角度材料步进器步数更改为任何图标或文本?

    角度材料步进器对我来说有以下问题 我无法从文档中找到这些问题 如何显示任何字符串或 html 而不是步进索引 数字 怎么才能显示mat工具提示当鼠标悬停在任何垫子步骤上时 我正在使用最新版本材质 角 IO 不幸的是 现在不可能使用材料中的本
  • 云上的 Node.js TCP 套接字服务器 [Heroku/AppFog]

    可以在 Node js 上运行面向 TCP 套接字的应用程序Cloud 更具体地说Heroku or AppFog 它不会是一个 Web 应用程序 而是一个用于客户端程序访问的服务器 基本思想是利用Cloud 扩展和易于使用的平台 我知道这
  • jQuery 中文档就绪的不同方式?

    这些是同一件事吗 即表示文档准备就绪的方式 function and function jQuery 或者两者之间是否有区别 如果有那么我什么时候应该使用哪个 第一个是快捷方式 ready 第二个是无效的 因为您试图调用一个不可调用的对象
  • 使用 JavaScript 清除 HTML 页面

    有没有办法使用 JavaScript 函数删除页面上现有内容的部分内容 像这样 i i
  • Chrome 和 Firefox 中的 Javascript 提升

    在 Chrome 和 Firefox 中运行它会给出不同的答案 function if true function f alert yes else function f alert no f 在 Chrome 中 结果是 否 在 Fire
  • 形成和排序正整数数组的最快策略

    在 Java 中 什么更快 创建 填充然后排序一个整数数组 如下所示 int a int 1000 for int i 0 i lt a length i not sure about the syntax a i Maths rand 1
  • 如何使用 CAKeyframeAnimation 对 CoreGraphics 形状绘制进行动画处理

    我正在尝试在 UIView 子类中对 UIBezierPath 在我的示例中是三角形 的绘制进行动画处理 然而 整个子视图是动画的 而不是形状 我在动画中缺少什么吗 void drawRect CGRect rect CAShapeLaye
  • ASP.NET MVC 3:将应用程序移至虚拟目录中。我必须改变什么?

    我一直在开发 MVC 3 应用程序 我使用的是 VS 2010 的内置 Web 服务器 今天 由于各种原因 我被要求将其移动到虚拟目录中并在 IIS 7 下运行 仍然在我的开发 PC 上 现在它的 URL 是localhost MyVirt
  • 使用 MediaCodec 和 MTK Codec 编码时选择 H264 Profile

    我们有一个 Android 应用程序 可以将视频编码为 H264 在所有以前尝试过的 Android 设备上 这都会编码为 Baseline 配置文件 这正是我所需要的 在 Lenovo Yoga 10 上 编解码器为 OMX MTK VI
  • 使用 web3 以太坊调用智能合约方法

    尝试使用以太坊解决区块链问题时 我在尝试与已部署的合约交互时遇到了问题 我想要实现的是调用一个方法来显示添加到使用 Geth 本地部署的私有区块链中的信息 我无法从我的智能合约中调用任何函数 我一直想知道我是否做错了什么 有人可以告诉我如何