Есть ли способ доступа к переменным Ethereum Smart Contract по имени в JavaScript?

Скажем, у меня есть простой смарт-контракт:

contract Simple {
    string32 message;

    function Simple() {
        message = "Hello world!";
    }
}

Как я могу легко получить доступ к переменной message по имени в JavaScript? Похоже, есть способ сопоставить функции в JS , но появляются переменные доступный только через сложный путь :

var storageObject = web3.eth.storageAt(contractAddress);
document.getElementById('fullName').innerText = web3.toAscii(storageObject['0x']) + ' ' + web3.toAscii(storageObject['0x01']);
5 голосов | спросил ThePiachu 18 J0000006Europe/Moscow 2015, 05:40:30

3 ответа


6

Обратите внимание, что этот вопрос автоматически сопоставляется с reddit и ответил там.

Если вы объявляете переменные состояния как public, функция для чтения их значений будет автоматически создана компилятором (" функция доступа "). Если вы используете богатый интерфейс, предоставляемый web3.js , вы можете создать объект контракта javascript и просто вызовите message(), чтобы получить соответствующее значение.

Для массивов и отображений компилятор будет генерировать функцию с дополнительными аргументами, которые соответствуют индексам. Например, для переменной mapping(uint => uint[]) public data; функция будет эквивалентна function data(uint x, uint y) constant returns (uint) { return data[x][y]; }

ответил chriseth 18 J0000006Europe/Moscow 2015, 18:53:52
1

Вы должны проверить web3.eth.contract - он должен иметь именно то, что вам нужно. https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethcontract

ответил Tim Coulter 18 J0000006Europe/Moscow 2015, 19:31:40
1

Вот код JavaScript для Node.JS для чтения

  • Вам нужен контракт. Исходный код Solidity для получения ABI

  • С помощью этих методов ABI и web3 вы можете прочитать данные контракта

Пример:

var Web3 = require('web3');
var solc = require("solc");
var fs = require('fs');

// Connect to a geth server over JSON-RPC
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

console.log("Talking with a geth server", web3.version.api);

// Read standard token contract from https://www.ethereum.org/token
var sourceCode = fs.readFileSync('sol/token.sol','utf8')
var compiled = solc.compile(sourceCode);
var abiArray = compiled.contracts["MyToken"].interface;
abiArray = JSON.parse(abiArray);

// Create a proxy object to access the smart contract
var MyContract = web3.eth.contract(abiArray);

// instantiate by address
var address = "0x091cc7F4ACA751a6b8A4101715d6B07CD4232341";
var contractInstance = MyContract.at(address);

// All public variables have automatically generated getters
// http://bitcoin.stackexchange.com/a/38079/5464
var result = {
  "totalSupply": contractInstance.totalSupply(),
  "symbol": contractInstance.symbol(),
  "name": contractInstance.name(),
};
console.log(JSON.stringify(result));
ответил Mikko Ohtamaa 9 Maypm16 2016, 16:43:39

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132