def index(): params = request.json valid, _ = transaction.isValid(params['data']) if not valid: return api.responce({'message':'failed', 'detail':_}) tx = transaction.decode(params['data']) valid = crypto.verify(params['signature'], params['data'], tx['signer']) if not valid: return api.responce({'message':'failed', 'detail':'INVALID_SIGNATURE'}) # TODO: 正当なトランザクションに正当な署名が付いているならpoolに追加する sqlite.insert("pool", (params['data'], params['signature'], tx['deadline'])) return api.responce({'message':'ok'})
def index(): certId = request.query.id or "0000000000000000" if certId == "0000000000000000": resp = { "signer": "f60e73c1904c679e08d6614faf8b68b5e5b32134b3e38abeaba59350efb1cc42", "version": 0, "timeStamp": 0, "certificateDefinition": { "id": certId, "name": "base.xct", "description": "", "properties": [{ "name": "supply", "value": "1000000000" }, { "name": "unit", "value": "XCT" }] } } elif certId == "ffffffffffffffff": resp = { "signer": "f60e73c1904c679e08d6614faf8b68b5e5b32134b3e38abeaba59350efb1cc42", "version": 0, "timeStamp": 0, "certificateDefinition": { "id": certId, "name": "base.xa", "description": "", "properties": [{ "name": "supply", "value": "1000000000" }, { "name": "unit", "value": "XA" }] } } else: certInfo = cert.info(certId) if len(certInfo) == 0: return api.responce({"message": "failed", "detail": "NOT_FOUND"}) resp = transaction.decode(certInfo[0][1]) resp['certificateDefinition']['name'] = "cert." + resp[ 'certificateDefinition']['name'] # cert.をプレフィックスとして付加 return api.responce({"message": "ok", "cert": resp})
def index(): tx = request.json valid, _ = transaction.isValidJson(tx) print(tx) if not valid: return api.responce({'message':'failed', 'detail':_}) data = transaction.encode(tx) resp = { 'message':'ok', 'data':data } return api.responce(resp)
def index(): params = request.json tx = transaction.decode(params['data']) return api.responce({ 'message':'ok', 'transactiont':tx })
def index(io): if io != "incoming" and io != "outgoing" and io != "all": abort(404, "Not found: '/account/transflers/"+io+"'") addr = request.query.address txStructures = account.tx(addr, io=io, unconfirmed=True) resp = { "data": txStructures } return api.responce(resp)
def index(): params = request.json tx = transaction.decode(params['data']) valid = crypto.verify(params['signature'], params['data'], tx['signer']) resp = { 'message':'ok', 'valid':valid } return api.responce(resp)
def index(): params = request.json sig = crypto.sign(params['data'], params['privateKey']) resp = { 'message':'ok', 'data':params['data'], 'signature':sig } return api.responce(resp)
def index(): sk = crypto.sk() pk = crypto.sk2pk(sk) addr = crypto.pk2addr(pk) resp = { "privateKey": sk, "publicKey": pk, "address": addr } return api.responce(resp)
def index(): txs = sqlite.fetchAll("pool") if len(txs)>20: return api.responce({'message':'failed', 'detail':'NETWORK_OVER_LOADED'}) params = request.json valid, _ = transaction.isValid(params['data']) if not valid: return api.responce({'message':'failed', 'detail':_}) tx = transaction.decode(params['data']) valid = crypto.verify(params['signature'], params['data'], tx['signer']) if not valid: return api.responce({'message':'failed', 'detail':'INVALID_SIGNATURE'}) txs.append([params['data'], params['signature']]) transactions = [] for tx_ in txs: transactions.append({"data":tx_[0], "signature":tx_[1]}) if not block.balanceCheck(transactions): # バランスが不整合を起こすトランザクションはリジェクト return api.responce({'message':'failed', 'detail':'INSUFFICIENT_BALANCE'}) network.announce(params['data'], params['signature']) return api.responce({'message':'ok'})
def index(): addr=request.query.address or "" balance = account.balance(addr) resp = { "address": addr, "balance": balance['balance'], "vestedBalance": balance['vestedBalance'], "importance": 0.010263666447108395, "publicKey": "a11a1a6c17a24252e674d151713cdf51991ad101751e4af02a20c61b59f1fe1a", "harvestedBlocks": 645, "multisigInfo": {}, "MOCK":True } return api.responce(resp)
def index(string): return api.responce({"status":"ok"})
def index(): print("receive broadcast!!", flush=True) params = request.json # broadcastData = { # 'data':data, # 'signature':sig, # 'phase':const.PHASE.BROADCAST, # 'nodePublicKey':const.NODE.PUBLICK_KEY, # 'messageSignature':concatDataSig # } # 1位のノードからの送信かを確認 rnl = network.rnl() firstNode = network.firstNode(rnl) print(params['nodePublicKey'], firstNode['publicKey']) if params['nodePublicKey'] != firstNode['publicKey']: return api.responce({ 'message': 'failed', 'detail': 'INVELID_RANKED_NODE' }) # メッセージ署名検証 concatData = common.concat(const.PHASE.BROADCAST, params['nodePublicKey'], params['signature'], params['data']) valid = crypto.verify(params['messageSignature'], concatData, params['nodePublicKey']) if not valid: return api.responce({ 'message': 'failed', 'detail': 'INVALID_MESSAGE_SIGNATURE' }) # ブロック署名検証 bl = block.decode(params['data']) valid = crypto.verify(params['signature'], params['data'], bl['signer']) if not valid: return api.responce({ 'message': 'failed', 'detail': 'INVALID_BLOCK_SIGNATURE' }) # ブロック高検証 currentHeight = block.height() if bl['height'] != (currentHeight + 1): return api.responce({ 'message': 'failed', 'detail': 'INVALID_BLOCK_HEIGHT' }) # 確定済みのブロックと検証するブロック内のトランザクションの結果によって残高が負にならないかをチェック valid = block.balanceCheck(bl['transactions']) if not valid: return api.responce({ 'message': 'failed', 'detail': 'INVALID_BALANCE_RESULT' }) # トランザクション検証 for tx in bl['transactions']: valid, _ = transaction.isValid(tx['data']) if not valid: return api.responce({'message': 'failed', 'detail': _}) # 正当なトランザクションに正当な署名が付いており、正当なノードの署名付きであれば/transaction/preprepareへブロードキャストする network.preprepare(params['data'], params['signature']) return api.responce({'message': 'ok'})
def index(): params = request.json print("receive prepare!!", flush=True) # prepareData = { # 'data':data, # 'signature':sig, # 'phase':const.PHASE.PREPARE, # 'nodePublicKey':const.NODE.PUBLICK_KEY, # 'messageSignature':concatDataSig # } # 1位のノードからでなくて良い # メッセージ署名検証 concatData = common.concat(const.PHASE.PREPARE, params['nodePublicKey'], params['signature'], params['data']) valid = crypto.verify(params['messageSignature'], concatData, params['nodePublicKey']) if not valid: return api.responce({ 'message': 'failed', 'detail': 'INVALID_MESSAGE_SIGNATURE' }) # ブロック署名検証 bl = block.decode(params['data']) valid = crypto.verify(params['signature'], params['data'], bl['signer']) if not valid: return api.responce({ 'message': 'failed', 'detail': 'INVALID_BLOCK_SIGNATURE' }) # ブロック高検証 currentHeight = block.height() if bl['height'] != (currentHeight + 1): return api.responce({ 'message': 'failed', 'detail': 'INVALID_BLOCK_HEIGHT' }) # トランザクション検証 for tx in bl['transactions']: valid, _ = transaction.isValid(tx['data']) if not valid: return api.responce({'message': 'failed', 'detail': _}) # 確定済みのブロックと検証するブロック内のトランザクションの結果によって残高が負にならないかをチェック valid = block.balanceCheck(bl['transactions']) if not valid: return api.responce({ 'message': 'failed', 'detail': 'INVALID_BALANCE_RESULT' }) # 正当なトランザクションに正当な署名が付いており、正当なノードの署名付きであれば、受信回数をインクリメントする # TODO increment updated = sqlite.update("prepare", "nodePublicKey", params['nodePublicKey'], { "data": params['data'], "created": common.epoch() }) if not updated: sqlite.insert( "prepare", (params['nodePublicKey'], params['data'], common.epoch())) li = sqlite.dataSearch("prepare", params['data']) print("prepare", len(li), flush=True) if len(li) > 6: #受信回数が規定値を超えたらブロックを保存する print("save block", flush=True) block.writeBlock(bl['height'], params['data']) currentHeight = block.height() schedule.updateDB(currentHeight) # ブロックに含まれるトランザクションをpoolから削除する for tx in bl['transactions']: sqlite.delete("pool", "data", tx['data']) return api.responce({'message': 'ok'})
def index(): unusedid = cert.unusedid() # TODO: 未使用か否かのチェック return api.responce({"message": "ok", "id": unusedid})