Как отправить данные в смарт-контракт?

У меня есть переменная w1_temp, которую мне нужно отправить в контракт. У меня есть следующий код:

var W1Temp = require('w1temp')
var Web3 = require('web3')
var web3 = new Web3()

web3.setProvider(new web3.providers.HttpProvider('http://localhost:8042'))
var contractAddress = '0x414c49c9552c4bd41401ff0a67ff84431a900c66'
var ABI = JSON.parse(
'[ { "inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }, { "constant": false, "inputs": [ 
{ "name": "_sensorData", "type": "int256" } ], "name": "setSensorData", "outputs": [], "payable": false, "stateMutability": 
"nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "getSensorData", "outputs": [ { "name": "", 
"type": "int256", "value": "0" } ], "payable": false, "stateMutability": "view", "type": "function" } ] ')

var StoreIntegerValue = web3.eth.contract(ABI).at(contractAddress)

W1Temp.setGpioData(7)
W1Temp.getSensor('28-0316612396ff').then(function (sensor) {
    var _sensorData = sensor.getTemperature();
});

eth.sendTransaction({
    from: 'a57f7e5347bd04076dd02c02212c0221522289ff38940e', 
    to: '0x414c49c9552c4bd41401ff0a67ff84431a900c66',
    value: web3.toWei(100,'finney'),
    data: web3.toHex('_sensorData')
})

Но я почти уверен, что это не правильно Пожалуйста, помогите заставить его работать

введите описание изображения здесь

Ответы (1)

Поскольку у вас есть ABI контракта, вы можете создать экземпляр, указывающий на адрес контракта и методы вызова напрямую.

var StoreIntegerValue=web3.eth.contract(ABI).at(contractAddress);

W1Temp.setGpioData(7)
W1Temp.getSensor('28-0316612396ff').then(function (sensor){
  var _sensorData = sensor.getTemperature();

  StoreIntegerValue.setSensorData(_sensorData, { 
    from: "0x123412341234.." 
  });
});

Но вы должны спросить человека, который предоставил ABI, какие методы доступны, их параметры и реквизиты.

Он по-прежнему не работает, всякий раз, когда я вызываю контракт, он возвращает те же данные, которые я отправил для его выполнения. Как я понял, значение, отправленное в контракт, может быть любым. Вот мой смарт-контракт. прочность прагмы ^0,4,10; контракт StoreIntegerValue { владелец адреса; данные датчика; функция StoreIntegerValue () { владелец = msg.sender; } function setSensorData(int _sensorData) { require(msg.sender == owner); данные датчика = _данные датчика; } функция getSensorData() возвращает константу (int) { require(msg.sender == owner); данные датчика возврата; } }
Я не понимаю вашу проблему. Если вы вызываете setSensorData с новым значением, после того, как транзакция будет добыта, она должна вернуть новое значение при вызове getSensorData. Возможно, запрос не работает и вызывает отмену транзакции, для проверки просто закомментируйте предложения запроса. Также попробуйте указать газ { from: "0x..", gas: 1000000 }.
Данные датчика я не называю, они прописаны в поле чтения из контракта. Также, когда я отправляю транзакцию, он говорит: «Кажется, транзакция завершится неудачно. Если вы отправите его, он может поглотить весь предоставленный вами газ», а затем позволит мне отправить транзакцию.
А что требуется? Как его найти? Это артефакты?
В вашем коде контракта это require(msg.sender == owner);приводит к тому, что только владелец контракта может отправлять данные в контракт.
Является ли владелец контракта тем, кто вошел в систему Mist? Я не назначал владельцев для заключения контракта
Владелец — это адрес, по которому был развернут контракт.
В тумане у меня два аккаунта от майнера 1, coinbase и другого. Кто из них хозяин?
Просто чтобы уточнить, я загрузил фотографию того, что я вижу в тумане, чтобы вы могли видеть. Итак, затем я вызываю setIntegerValue, отправляю транзакцию с произвольным номером, а затем она возвращает точно такой же номер (на рисунке показана моя следующая попытка совершить транзакцию), поэтому я должен отправить ее с другой учетной записи? или идентифицировать контракт хозяин где-то?
Из вашего кода контракта вы должны использовать одну и ту же учетную запись для развертывания контракта и отправки данных в контракт. Если вы можете отредактировать свой контракт и удалить, require(msg.sender == owner)то любой адрес должен иметь возможность отправлять данные в ваш контракт.