gpt4 book ai didi

javascript - 使用 web3 ethereum 调用智能合约方法

转载 作者:数据小太阳 更新时间:2023-10-29 03:49:02 28 4
gpt4 key购买 nike

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

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

我的契约(Contract):agency.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);
}
}

abiDefinition

> 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})

导致 错误:Solidity 函数的参数数量无效

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

导致错误:地址无效我还尝试调用 agencyToOwnercreateRandomAgency 但没有任何效果。

我们很乐意接受任何帮助!谢谢,

最佳答案

您可以使用 contract.methodName.call()contract.methodName.sendTransaction()contract.methodName() 调用合约函数 方法。最后一个版本根据方法类型简单地委托(delegate)给前两个版本之一(即,如果它是一个常量)。查看Contract Methods文档中的部分。

参数列表以函数本身的参数(如果有的话)开始,然后是一个可选的交易对象,然后是回调。要调用您的 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 .

要调用您的公共(public) agencies 数组,它看起来像

contractInstance.agencies.call(0, (error, result) => {
if (!error) {
console.log(result.name);
console.log(result.dna);
}
}); // transaction object not needed

关于javascript - 使用 web3 ethereum 调用智能合约方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48184969/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com