En essayant de contourner la blockchain avec Ethereum, je rencontre des problèmes lorsque je tente une interface avec un contrat déployé. Ce que je voudrais essayer de faire est d'appeler une méthode pour afficher les informations ajoutées à une blockchain privée déployée localement à l'aide de Geth.
Je ne peux appeler aucune fonction de mon contrat intelligent et je me demandais si je fais quelque chose de mal ... Quelqu'un pourrait-il me dire comment passer un simple appel à l'une des méthodes de ce contrat? disons afficher les agences existantes, ou le nom de l'agence dont l'utilisateur fait partie.
Mon contrat: 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);
}
}
l'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' } ]
Déployé avec succès:
INFO [01-09|19:09:14] Submitted contract creation fullhash=0x7c43e896329138a6778938ca30d2f5f17f9a63062b359a4fccbd1a1be439f385 contract=0x65175d22C56E1Bad976A331A8B6B448cd4B3995d
et finalement 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 ] } }
J'ai essayé:
contractInstance.agencies()
contractInstance.agencies.call()
contractInstance.agencies.call({from:ak})
résultats dans Error: Invalid number of arguments to Solidity function
contractInstance.agencies.call("name" {from:ak})
résultats dans Error: invalid address
J'ai également essayé d'appeler agencyToOwner
et createRandomAgency
mais rien ne fonctionne.
Toute aide serait reçue avec plaisir! Merci,
Vous pouvez appeler des fonctions de contrat en utilisant les méthodes contract.methodName.call()
, contract.methodName.sendTransaction()
ou contract.methodName()
. La dernière version délègue simplement l'un des deux premiers en fonction du type de méthode (c'est-à-dire s'il s'agit d'une constant
). Voir la section Méthodes de contrat dans la documentation.
La liste de paramètres commence par les paramètres de la fonction elle-même (le cas échéant), suivis d'un objet de transaction facultatif, suivi du rappel. Pour appeler votre méthode createRandomAgency()
, procédez comme suit:
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 });
La liste des options disponibles pour l’objet transaction peut être trouvée ici .
Pour appeler votre tableau public agencies
, cela ressemble à
contractInstance.agencies.call(0, (error, result) => {
if (!error) {
console.log(result.name);
console.log(result.dna);
}
}); // transaction object not needed
Je pense que vous devriez essayer quelque chose comme ceci-:
`var contractAbi= "" //here put your contract abi in json string
var deployedContract = web3.eth.contract(abi).at("contract address");
//now you should be able to access contract methods
deployedContract.agencies.call({from:address}, function(err,data){
console.log(data);
});`
Testez ceci une fois.
Essayez d’utiliser des rappels ou des promesses. Le code suivant a fonctionné pour moi lorsque je voulais obtenir la valeur de retour d'une des méthodes de mon contrat:
const contract = web3.eth.contract(contractABI);
const contractInstance = contract.at(this.contractAddress);
return new Promise((resolve, reject) => {
contractInstance.**yourMethod**.call(function (error, result) {
if (error) {
console.log(error);
} else {
resolve(result);
}
});
}) as Promise<number>;
Consultez également: https://github.com/ethereum/wiki/wiki/JavaScript-API#using-callbacks