отправка данных в смарт-контракт ethereum, транзакция не проверяется (блок не сформирован) - PullRequest
0 голосов
/ 12 марта 2019

Я написал надежный контракт для получения данных от Raspberry Pi в соответствии с инструкциями в смарт-контракт и развернул его в testrpc. Я использовал ту же учетную запись для развертывания смарт-контракта, как и малиновый адрес.

`pragma solidity ^0.5.4;

contract StoreIntegerValue{
    address owner;
    int sensorData;

    constructor (int _sensorData) public  {
        sensorData = _sensorData;
        owner = msg.sender;
    }

    function setSensorData(int _sensorData) public {
        require(msg.sender == owner);
        sensorData = _sensorData;
    }

    function getSensorData() public returns (int) {
        require(msg.sender == owner);
        return sensorData;
    }
}` 

Я хочу использовать web3.py для отправки данных датчика от Raspberry к смарт-контракту. Я попытался установить пороговое ограничение для вызова смарт-контракта с помощью web3.py.

from web3 import Web3, HTTPProvider
from solc import compile_source
from web3.contract import ConciseContract
from random import randint
import time
import json

#actual web3 provider (for more info: http://web3py.readthedocs.io/en/stable/providers.html)
w3 = Web3(HTTPProvider('http://127.0.0.1:8545'))

#abi can be generated form the command line with solc or online with Remix IDE
abi = json.loads('''[
    {
        "constant": false,
        "inputs": [],
        "name": "getSensorData",
        "outputs": [
            {
                "name": "",
                "type": "int256"
            }
        ],
        "payable": false,
        "stateMutability": "nonpayable",
        "type": "function"
    },
    {
        "constant": false,
        "inputs": [
            {
                "name": "_sensorData",
                "type": "int256"
            }
        ],
        "name": "setSensorData",
        "outputs": [],
        "payable": false,
        "stateMutability": "nonpayable",
        "type": "function"
    },
    {
        "inputs": [
            {
                "name": "_sensorData",
                "type": "int256"
            }
        ],
        "payable": false,
        "stateMutability": "nonpayable",
        "type": "constructor"
    }
]

''')


address = Web3.toChecksumAddress("0xc9ab3c7431dd3298b26546ffc2526d9b45469cf0")

StoreIntegerValue = w3.eth.contract(
    address, abi=abi, ContractFactoryClass=ConciseContract)

#Replace with real account address for raspi
raspi = 0x26b3bff595e86d4c318f34f2e92195f44eaa327b

#Example function to submit data to the block chain
def submitSensorData(data):
    #note that data must be an integer,
    StoreIntegerValue.setSensorData(int(data), transact={'from': raspi})

def stopwatch(seconds):
    TempCount=0
    Count=0
    start=time.time()
    time.clock()
    elapsed=0
    while elapsed < seconds:
        elapsed = time.time()-start
        Temp= randint(15,25)
        print("temp values: ", Temp)
        if(Temp>20):
            TempCount=TempCount + 1
            Count = TempCount
            TempCount = 0
            time.sleep(2)
    return Count #, int(time.time())

k= stopwatch(30)
if(k>3):
    submitSensorData(k)

оба кода web3 и solidity работают без ошибок, но в результате транзакции я не смог увидеть формирование нового блока в testrpc. Было бы интересно узнать, отправляются ли данные или нет согласно коду? Если оно отправляется, почему нет формирования блока? есть ли в моих кодах семантические ошибки? Пожалуйста, помогите мне с решением или какими-либо ведущими, чтобы решить проблему.

...