peer/key exchange work (mostly done)
This commit is contained in:
parent
a5e98b4787
commit
cb3015652a
@ -19,7 +19,7 @@ and code to operate as a daemon, getting commands from the command queue databas
|
|||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
'''
|
'''
|
||||||
import sqlite3, requests, hmac, hashlib, time, sys, os, math, logger, urllib.parse
|
import sqlite3, requests, hmac, hashlib, time, sys, os, math, logger, urllib.parse, random
|
||||||
import core, onionrutils, onionrcrypto, onionrproofs, btc, config, onionrplugins as plugins
|
import core, onionrutils, onionrcrypto, onionrproofs, btc, config, onionrplugins as plugins
|
||||||
|
|
||||||
class OnionrCommunicate:
|
class OnionrCommunicate:
|
||||||
@ -49,7 +49,7 @@ class OnionrCommunicate:
|
|||||||
blockProcessAmount = 5
|
blockProcessAmount = 5
|
||||||
heartBeatTimer = 0
|
heartBeatTimer = 0
|
||||||
heartBeatRate = 5
|
heartBeatRate = 5
|
||||||
pexTimer = 900 # How often we should check for new peers
|
pexTimer = 5 # How often we should check for new peers
|
||||||
pexCount = 0
|
pexCount = 0
|
||||||
logger.debug('Communicator debugging enabled.')
|
logger.debug('Communicator debugging enabled.')
|
||||||
torID = open('data/hs/hostname').read()
|
torID = open('data/hs/hostname').read()
|
||||||
@ -89,14 +89,42 @@ class OnionrCommunicate:
|
|||||||
'''
|
'''
|
||||||
Get new peers
|
Get new peers
|
||||||
'''
|
'''
|
||||||
|
peersCheck = 5 # Amount of peers to ask for new peers + keys
|
||||||
|
peersChecked = 0
|
||||||
|
peerList = list(self._core.listAdders()) # random ordered list of peers
|
||||||
|
logger.warn(len(peerList))
|
||||||
|
newKeys = []
|
||||||
|
newAdders = []
|
||||||
|
|
||||||
|
if len(peerList) > peersCheck:
|
||||||
|
peersCheck = len(peerList)
|
||||||
|
|
||||||
|
while peersCheck > peersChecked:
|
||||||
|
i = random.randint(0, len(peerList))
|
||||||
|
logger.info('Using ' + peerList[i] + ' to find new peers')
|
||||||
|
try:
|
||||||
|
newAdders = self.performGet('pex', peerList[i])
|
||||||
|
self._utils.mergeAdders(newAdders)
|
||||||
|
except requests.exceptions.ConnectionError:
|
||||||
|
logger.info(peerList[i] + ' connection failed')
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
logger.info('Using ' + peerList[i] + ' to find new keys')
|
||||||
|
newKeys = self.performGet('kex', peerList[i])
|
||||||
|
# TODO: Require keys to come with POW token (very large amount of POW)
|
||||||
|
self._utils.mergeKeys(newKeys)
|
||||||
|
except requests.exceptions.ConnectionError:
|
||||||
|
logger.info(peerList[i] + ' connection failed')
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
peersChecked += 1
|
||||||
return
|
return
|
||||||
|
|
||||||
def lookupBlocks(self):
|
def lookupBlocks(self):
|
||||||
'''
|
'''
|
||||||
Lookup blocks and merge new ones
|
Lookup blocks and merge new ones
|
||||||
'''
|
'''
|
||||||
|
|
||||||
peerList = self._core.listAdders()
|
peerList = self._core.listAdders()
|
||||||
blocks = ''
|
blocks = ''
|
||||||
for i in peerList:
|
for i in peerList:
|
||||||
|
@ -57,7 +57,7 @@ class Core:
|
|||||||
|
|
||||||
def addPeer(self, peerID, name=''):
|
def addPeer(self, peerID, name=''):
|
||||||
'''
|
'''
|
||||||
Add a peer by their ID, with an optional name, to the peer database
|
Adds a public key to the key database (misleading function name)
|
||||||
|
|
||||||
DOES NO SAFETY CHECKS if the ID is valid, but prepares the insertion
|
DOES NO SAFETY CHECKS if the ID is valid, but prepares the insertion
|
||||||
'''
|
'''
|
||||||
@ -346,7 +346,7 @@ class Core:
|
|||||||
|
|
||||||
def listPeers(self, randomOrder=True):
|
def listPeers(self, randomOrder=True):
|
||||||
'''
|
'''
|
||||||
Return a list of peers
|
Return a list of public keys (misleading function name)
|
||||||
|
|
||||||
randomOrder determines if the list should be in a random order
|
randomOrder determines if the list should be in a random order
|
||||||
'''
|
'''
|
||||||
|
@ -41,6 +41,24 @@ class OnionrUtils:
|
|||||||
'''High level function to encrypt a message to a peer and insert it as a block'''
|
'''High level function to encrypt a message to a peer and insert it as a block'''
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def mergeKeys(self, newKeyList):
|
||||||
|
'''Merge ed25519 key list to our database'''
|
||||||
|
retVal = False
|
||||||
|
for key in newKeyList:
|
||||||
|
if not key in self._core.listPeers(randomOrder=False):
|
||||||
|
if self._core.addPeer(key):
|
||||||
|
retVal = True
|
||||||
|
return retVal
|
||||||
|
|
||||||
|
def mergeAdders(self, newAdderList):
|
||||||
|
'''Merge peer adders list to our database'''
|
||||||
|
retVal = False
|
||||||
|
for adder in newAdderList:
|
||||||
|
if not adder in self._core.listAdders(randomOrder=False):
|
||||||
|
if self._core.addAddress(adder):
|
||||||
|
retVal = True
|
||||||
|
return retVal
|
||||||
|
|
||||||
def localCommand(self, command):
|
def localCommand(self, command):
|
||||||
'''
|
'''
|
||||||
Send a command to the local http API server, securely. Intended for local clients, DO NOT USE for remote peers.
|
Send a command to the local http API server, securely. Intended for local clients, DO NOT USE for remote peers.
|
||||||
|
@ -120,10 +120,10 @@ class OnionrTests(unittest.TestCase):
|
|||||||
def testBitcoinNode(self):
|
def testBitcoinNode(self):
|
||||||
# temporarily disabled- this takes a lot of time the CI doesn't have
|
# temporarily disabled- this takes a lot of time the CI doesn't have
|
||||||
self.assertTrue(True)
|
self.assertTrue(True)
|
||||||
logger.debug('-'*26 + '\n')
|
#logger.debug('-'*26 + '\n')
|
||||||
logger.info('Running bitcoin node test...')
|
#logger.info('Running bitcoin node test...')
|
||||||
|
|
||||||
sbitcoin = btc.OnionrBTC()
|
#sbitcoin = btc.OnionrBTC()
|
||||||
|
|
||||||
def testPluginReload(self):
|
def testPluginReload(self):
|
||||||
logger.debug('-'*26 + '\n')
|
logger.debug('-'*26 + '\n')
|
||||||
|
Loading…
Reference in New Issue
Block a user