research/data_sync/whisper.py

91 lines
2.4 KiB
Python

from web3 import Web3, HTTPProvider
import time
# Constant
#---------------------------------------------------------------------
host = 'http://localhost:8545'
a_keyPair = "0x57083392b29bdf24512c93cfdf45d38c87d9d882da3918c59f4406445ea976a4"
b_keyPair= "0x7b5c5af9736d9f1773f2020dd0fef0bc3c8aeaf147d2bf41961e766588e086e7"
# Derived, used for addressing
a_pubKey = "0x04d94a1a01872b598c7cdc5aca2358d35eb91cd8a91eaea8da277451bb71d45c0d1eb87a31ea04e32f537e90165c870b3e115a12438c754d507ac75bddd6ecacd5"
b_pubkey = "0x04ff921ddf78b5ed4537402f59a150caf9d96a83f2a345a1ddf9df12e99e7778f314c9ca72e8285eb213af84f5a7b01aabb62c67e46657976ded6658e1b9e83c73"
topic = '0x00000000'
# Connection
#---------------------------------------------------------------------
web3 = Web3(HTTPProvider(host))
from web3.shh import Shh
Shh.attach(web3, "shh")
#kId = web3.shh.addPrivateKey(keyPair)
#pubKey = web3.shh.getPublicKey(kId)
# API
#---------------------------------------------------------------------
# XXX: Hacky
def newKeyPair():
raw_keyPair = web3.shh.newKeyPair()
keyPair = "0x" + raw_keyPair
return keyPair
def pollFilter(topic, keyPair):
kId = web3.shh.addPrivateKey(keyPair)
myFilter = web3.shh.newMessageFilter({'topic': topic,
'privateKeyID': kId})
myFilter.poll_interval = 600;
return myFilter
def sendMessage(address_to, topic, msg):
web3.shh.post({
'pubKey': address_to,
'topic': topic,
'powTarget': 2.01,
'powTime': 2,
'ttl': 10,
'payload': web3.toHex(text=msg)
});
def getMessages(myFilter):
filterID = myFilter.filter_id
retreived_messages = web3.shh.getMessages(filterID)
for i in range(0, len(retreived_messages)):
print(retreived_messages[i]['payload'].decode("utf-8"))
print(retreived_messages[i])
# Run
#---------------------------------------------------------------------
# A sending messages to B and B then checking
# keyPair used for decryption
myFilter = pollFilter(topic, b_keyPair)
# XXX: Part of A's state
sendMessage(b_pubkey, topic, "hello")
sendMessage(b_pubkey, topic, "hi")
#sendMessage(b_pubkey, topic, "hello b")
time.sleep(1)
getMessages(myFilter)
# TODO
# Usage:
# ./whisper a
# => type to send message
# => see incoming messages (poll regularly)
# Vice versa for b
# Then:
# - check discovery topic listen
# - try to get end to end e.g. mobile phone
# - hook up to sync
# - consider subscribe instead?