Я написал надежный контракт для получения данных от 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. Было бы интересно узнать, отправляются ли данные или нет согласно коду? Если оно отправляется, почему нет формирования блока? есть ли в моих кодах семантические ошибки? Пожалуйста, помогите мне с решением или какими-либо ведущими, чтобы решить проблему.