Wie sende ich Daten an einen Smart Contract?

Ich habe die Variable w1_temp, die ich an den Vertrag senden muss. Ich habe den folgenden Code:

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

Aber ich bin mir fast sicher, dass es nicht richtig ist. Bitte helfen Sie, damit es funktioniert

Geben Sie hier die Bildbeschreibung ein

Antworten (1)

Da Sie die Vertrags-ABI haben, können Sie eine Instanz erstellen, die auf die Adresse des Vertrags zeigt, und Methoden direkt aufrufen.

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.." 
  });
});

Aber Sie sollten die Person fragen, die den ABI erstellt hat, welche Methoden verfügbar sind, deren Parameter und Voraussetzungen.

Es funktioniert immer noch nicht, immer wenn ich den Vertrag aufrufe, gibt er die gleichen Daten zurück, die ich gesendet habe, um ihn auszuführen. Wie ich verstanden habe, kann der in den Vertrag eingegebene Wert alles sein. Hier ist mein Smart Contract. Pragma Solidität ^0.4.10; Vertrag StoreIntegerValue { Adressbesitzer; int Sensordaten; Funktion StoreIntegerValue() { Eigentümer = msg.sender; } function setSensorData(int _sensorData) {require(msg.sender == owner); sensorData = _sensorData; } Funktion getSensorData() Konstante gibt zurück (int) {require(msg.sender == owner); Sensordaten zurückgeben; } }
Ich verstehe Ihr Problem nicht. Wenn Sie setSensorData mit einem neuen Wert aufrufen, sollte die Transaktion nach dem Mining den neuen Wert zurückgeben, wenn Sie getSensorData aufrufen. Möglicherweise schlägt die Anforderung fehl und bewirkt, dass die Transaktion zurückgesetzt wird. Kommentieren Sie zum Testen einfach die Anforderungssätze aus. Versuchen Sie auch, das Gas anzugeben { from: "0x..", gas: 1000000 }.
Ich rufe keine Sensordaten auf, sie werden in das aus dem Vertragsfeld gelesene geschrieben. Auch wenn ich eine Transaktion sende, heißt es: „Es scheint, dass die Transaktion fehlschlagen wird. Wenn Sie es einreichen, kann es das gesamte Gas verbrauchen, das Sie bereitstellen“, und lässt mich dann die Transaktion senden.
Und was ist die Anforderung? Wie finde ich es? Sind es Artefakte?
In Ihrem Vertragscode befindet sich ein require(msg.sender == owner);Dies bewirkt, dass nur der Vertragsinhaber Daten an den Vertrag senden kann.
Ist der Vertragsinhaber derjenige, der bei Mist angemeldet ist? Ich habe dem Vertrag keine Eigentümer zugewiesen
Der Eigentümer ist die Adresse, die den Vertrag bereitgestellt hat.
Im Nebel habe ich zwei Konten von Miner 1, Coinbase und dem anderen. Wer von ihnen ist der Besitzer?
Nur zur Verdeutlichung habe ich ein Bild von dem hochgeladen, was ich im Nebel sehe, damit Sie es sehen können. Also, dann rufe ich setIntegerValue auf, ich sende eine Transaktion mit einer beliebigen Nummer, und dann gibt es genau dieselbe Nummer zurück (im Bild wird mein nächster Versuch, eine Transaktion durchzuführen, gezeigt), also sollte ich sie von einem anderen Konto senden? oder den Vertrag identifizieren Besitzer irgendwo?
Von Ihrem Vertragscode aus müssen Sie dasselbe Konto verwenden, um den Vertrag bereitzustellen und Daten an den Vertrag zu senden. Wenn Sie Ihren Vertrag bearbeiten und entfernen können, require(msg.sender == owner)sollte jede Adresse Daten an Ihren Vertrag senden können.