work on new block metadata format and some small bug fixes
This commit is contained in:
parent
bbd881785d
commit
6b9d4f8fc6
@ -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
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
'''
|
||||
import sqlite3, requests, hmac, hashlib, time, sys, os, math, logger, urllib.parse, random, base64, binascii
|
||||
import sqlite3, requests, hmac, hashlib, time, sys, os, math, logger, urllib.parse, base64, binascii, secrets
|
||||
import core, onionrutils, onionrcrypto, netcontroller, onionrproofs, btc, config, onionrplugins as plugins
|
||||
|
||||
class OnionrCommunicate:
|
||||
@ -149,7 +149,7 @@ class OnionrCommunicate:
|
||||
peersCheck = len(peerList)
|
||||
|
||||
while peersCheck > peersChecked:
|
||||
i = random.randint(0, maxN)
|
||||
i = secrets.randbelow(maxN)
|
||||
logger.info('Using ' + peerList[i] + ' to find new peers', timestamp=True)
|
||||
try:
|
||||
newAdders = self.performGet('pex', peerList[i], skipHighFailureAddress=True)
|
||||
@ -260,7 +260,7 @@ class OnionrCommunicate:
|
||||
blocks = ''
|
||||
for i in peerList:
|
||||
hasher = hashlib.sha3_256()
|
||||
data = self.performGet('getData', i, hash)
|
||||
data = self.performGet('getData', i, hash, skipHighFailureAddress=True)
|
||||
if data == False or len(data) > 10000000 or data == '':
|
||||
continue
|
||||
try:
|
||||
|
@ -221,12 +221,14 @@ class Core:
|
||||
'''
|
||||
Create a database for blocks
|
||||
|
||||
hash - the hash of a block
|
||||
hash - the hash of a block
|
||||
dateReceived - the date the block was recieved, not necessarily when it was created
|
||||
decrypted - if we can successfully decrypt the block (does not describe its current state)
|
||||
dataType - data type of the block
|
||||
dataFound - if the data has been found for the block
|
||||
dataSaved - if the data has been saved for the block
|
||||
decrypted - if we can successfully decrypt the block (does not describe its current state)
|
||||
dataType - data type of the block
|
||||
dataFound - if the data has been found for the block
|
||||
dataSaved - if the data has been saved for the block
|
||||
signature - optional signature by the author (not optional if author is specified)
|
||||
author - multi-round partial scrypt hash of authors public key
|
||||
'''
|
||||
if os.path.exists(self.blockDB):
|
||||
raise Exception("Block database already exists")
|
||||
@ -238,7 +240,10 @@ class Core:
|
||||
decrypted int,
|
||||
dataType text,
|
||||
dataFound int,
|
||||
dataSaved int);
|
||||
dataSaved int,
|
||||
signature text,
|
||||
author text,
|
||||
);
|
||||
''')
|
||||
conn.commit()
|
||||
conn.close()
|
||||
@ -584,15 +589,19 @@ class Core:
|
||||
|
||||
return
|
||||
|
||||
def insertBlock(self, data, header='txt'):
|
||||
def insertBlock(self, data, header='txt', sign=False):
|
||||
'''
|
||||
Inserts a block into the network
|
||||
'''
|
||||
retData = ''
|
||||
metadata = header
|
||||
if sign:
|
||||
metadata += '-' + self._crypto.pubKeyHashID() + '-'
|
||||
metadata += self._crypto.edSign(data, encodeResult=True) + '-'
|
||||
if len(data) == 0:
|
||||
logger.error('Will not insert empty block')
|
||||
else:
|
||||
addedHash = self.setData('-' + header + '-' + data)
|
||||
addedHash = self.setData(metadata + data)
|
||||
self.addToBlockDB(addedHash, selfInsert=True)
|
||||
self.setBlockType(addedHash, header)
|
||||
retData = addedHash
|
||||
|
@ -576,7 +576,7 @@ class Onionr:
|
||||
except FileNotFoundError:
|
||||
logger.warn('That file does not exist. Improper path?')
|
||||
else:
|
||||
print(new)
|
||||
logger.debug(new)
|
||||
self.onionrCore.insertBlock(new, header='bin')
|
||||
|
||||
|
||||
|
@ -17,7 +17,7 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
'''
|
||||
import nacl.signing, nacl.encoding, nacl.public, nacl.secret, os, binascii, base64
|
||||
import nacl.signing, nacl.encoding, nacl.public, nacl.secret, os, binascii, base64, hashlib
|
||||
|
||||
class OnionrCrypto:
|
||||
def __init__(self, coreInstance):
|
||||
@ -25,6 +25,8 @@ class OnionrCrypto:
|
||||
self._keyFile = 'data/keys.txt'
|
||||
self.pubKey = None
|
||||
self.privKey = None
|
||||
|
||||
self.HASH_ID_ROUNDS = 2000
|
||||
|
||||
# Load our own pub/priv Ed25519 keys, gen & save them if they don't exist
|
||||
if os.path.exists(self._keyFile):
|
||||
@ -170,4 +172,15 @@ class OnionrCrypto:
|
||||
'''Generate a Ed25519 public key pair, return tuple of base32encoded pubkey, privkey'''
|
||||
private_key = nacl.signing.SigningKey.generate()
|
||||
public_key = private_key.verify_key.encode(encoder=nacl.encoding.Base32Encoder())
|
||||
return (public_key.decode(), private_key.encode(encoder=nacl.encoding.Base32Encoder()).decode())
|
||||
return (public_key.decode(), private_key.encode(encoder=nacl.encoding.Base32Encoder()).decode())
|
||||
|
||||
def pubKeyHashID(self, pubkey=self.pubKey):
|
||||
'''Accept a ed25519 public key, return a truncated result of X many sha3_256 hash rounds'''
|
||||
prev = ''
|
||||
pubkey = pubkey.encode()
|
||||
for i in range(self.HASH_ID_ROUNDS):
|
||||
hasher = hashlib.sha3_256()
|
||||
hasher.update(pubkey + prev.encode())
|
||||
prev = hasher.hexdigest()
|
||||
result = prev
|
||||
return result
|
Loading…
Reference in New Issue
Block a user