NXTER MAGAZINE

La bière, le pari et la Chaîne-de-Blocs NXT

Supposons que vous ayez un cercle d’amis que vous rencontrez dans un bar sportif pour boire de la bière, regarder des sports et faire des paris. Vous pouvez faire des paris sur la chaîne-de-blocs NXT et avoir une application Python de base l’automatiser pour vous.

Dans mon premier article j’ai présenté les bases d’une chaîne de blocs. Comme nous l’avons appris, la proposition de valeur la plus importante de la chaîne de blocs est l’immutabilité des données soumises dans les transactions enregistrées en blocs, à partir desquelles une chaîne de blocs est construite.

Aujourd’hui, je veux vous montrer comment construire une application de paris simple mais entièrement fonctionnel en python. Pour l’application de pari que je présente, l’immutabilité des données peut être nécessaire, mais dans le cas où un pari doit être annulé, l’application peut être modifiée pour tenir compte de cette fonctionnalité supplémentaire.

Conditions préalables:
NRS (logiciel de référence Nxt) 1.10.2:
https://bitbucket.org/JeanLucPicard/nxt/downloads/, Python 3 (ou Python 2 avec la moindre modification). Une bière ou deux (facultatif).

Logique d’Application

Un utilisateur soumet un pari (transfère tout montant de pièces de monnaie NXT) au compte de pari et ajoute un attachement public non chiffré. Dans la pièce jointe il doit écrire l’id de la mise, un deux-points et un nombre indiquant son choix dans le pari correspondant. Prenons un exemple: le bar des sports exécute un pari que l’équipe de football gagne. Ils attribuent un ID à ce jeu, disons «30».

Les choix sont les suivants:
« 1 » – équipe à domicile gagne. «2» – l’autre équipe gagne. « 3 » – cravate.

Pour parier sur la victoire de l’équipe locale, le joueur doit soumettre une transaction de n’importe quelle quantité de NXT, et joindre un message public non chiffré (pour  »auditabilité ») avec le contenu: 30: 1

Lorsque le moment est venu, l’hôte de pari exécute l’application pour trouver les gagnants et traiter les paiements. L’hôte peut prendre un petit supplément pour le service.

Implémentation

Le serveur Nxt écoute les requêtes sur le port 7876. Si vous l’exécutez sur la même machine que votre code python par défaut, vous devez soumettre des requêtes à http://127.0.0.1:7876/nxt

Pour notre application, nous devrons importer quelques modules et écrire la fonction pour soumettre des requêtes qui seront utilisées à plusieurs reprises dans l’application.

import sys, json, re
def sendQuery(Query):
  from urllib import parse, request
  params = parse.urlencode(Query)
  headers = {"Content-type": "application/x-www-form-urlencoded", 
"Accept": "text/plain"}
  req = request.Request("http://127.0.0.1:7876/nxt", 
params.encode('utf-8'))
  response = request.urlopen(req)
  return response.read()
	
myAccount = "NXT-AAAA-BBBB-CCCC-DDDDD"
totalAmount = 0
serviceFee = 0.05
players = []
secretPhrase = "bla bla bla''

La fonction renvoie une chaîne JSON à décoder, avec les transactions et les pièces jointes à analyser. De plus, quelques variables sont initialisées.

Ensuite, nous devons interroger le compte de pari pour récupérer toutes les transactions entrantes.
Il s’agit de la requête que vous pouvez envoyer au serveur NXT pour l’exécuter:

Query = {'requestType': 'getBlockchainTransactions', 
'account': myAccount, 'type': '0', 'subtype': '0', 'executedOnly': 'true'}

Décoder JSON et le charger sur une variable pour un traitement ultérieur.

output = sendQuery(Query)
data = json.loads(output.decode('utf-8'))

Comme nous avons maintenant toutes les données, nous parcourons la liste et rejetons certaines des transactions dont nous n’avons pas besoin. Par exemple, nous n’avons pas besoin de traiter les transactions sortantes, donc nous continuons la boucle de l’élément suivant.

for i in data['transactions']:
  txAmount = i['amountNQT']
  txSender = i['senderRS']
  if txSender == myAccount:
      continue
  txRecipient = i['recipientRS']
  if txRecipient != myAccount:
      continue

Ensuite, nous retirons la pièce jointe, vérifions si elle n’est pas chiffrée et dépouille les blancs.

line = i['attachment']['message']
  lineIsText = i['attachment']['messageIsText']
  if line.strip() != "" and lineIsText == True:
    line = line.strip()

L’étape suivante consiste à faire correspondre le message soumis à l’expression régulière. Il doit satisfaire au format «Number: Number», le premier nombre peut comporter jusqu’à 3 chiffres.

 matchLine = re.match(r'(d{1,3}:d{1})(.*)', line, re.M|re.I)

Si le message ci-joint est de format correct, nous le traitons plus loin …

L’application de pari accepte jusqu’à 3 arguments de ligne de commande: id du jeu, le numéro de choix qui a gagné, et le troisième paramètre optionnel entre guillemets pour nommer le choix du gagnant pour la verbosité dans le message de paiement.

Par exemple, l’hôte de pari doit l’exécuter comme ceci:
Python3 bet.py 30 1 « L’équipe locale gagne »

L’application traite les transactions avec l’ID de jeu 30 et récompense les joueurs qui ont choisi ‘1’.
Le troisième argument peut être omis: python3 bet.py 30 1

Ensuite, nous devons calculer la somme d’argent soumise pour notre jeu, faire une liste de dictionnaires de joueurs qui ont deviné le nombre correct, et calculer la somme totale pour la distribution après l’hôte de paris reçoit son service facultatif coupé.

  if matchLine:
      if matchLine.group(1).split(':')[0] == sys.argv[1]:
        totalAmount += int(txAmount)
        if matchLine.group(1).split(':')[1] == sys.argv[2]:
          d = {txSender: matchLine.group(1).split(':')[1], 
'amount': txAmount}
          players.append(dict(d))
afterFee = float(totalAmount - totalAmount * serviceFee)

Nous avons des gagnants dans la liste des joueurs de dictionnaires, nous avons de l’argent à distribuer dans ‘afterFee’, nous allons maintenant traiter les paiements.

sumCorrect = 0
for i in players:
  for key in i:
    if i[key] == sys.argv[2]:
      sumCorrect += float(i['amount'])
for i in players:
  for key in i:
    if i[key] == sys.argv[2]:
      t = float(i['amount']) * (afterFee / sumCorrect)
      if t > afterFee:
        strSendAmount = str(int(afterFee))
      else:
        strSendAmount = str(int(t))
      if len(sys.argv) > 3:
        reply = sys.argv[3]
      else:
        reply = sys.argv[2]
      message = "Payout for correct bet in poll " 
+ sys.argv[1] + "; your reply: " + reply
      Query = {'requestType': 'sendMoney', 'recipient': key, 
      'amountNQT': strSendAmount, 'secretPhrase': secretPhrase, 
      'feeNQT': '100000000', 'deadline': '1440', 'broadcast': 'true', 
'message': message, 'messageIsText': 'true', 'messageIsPrunable': 'true'}
      sendQuery(Query)

Inutile de dire que l’application peut être améliorée pour traiter les erreurs, annuler les paris ou éventuellement permettre d’autres paramètres dans les messages attachés. Les messages joints peuvent être soumis avec le Nxt Client (NRS) ou à partir d’un portefeuille Web qui permet l’envoi de pièces jointes.

Pour effectuer des transactions sur le Nxt Blockchain, vous avez besoin de pièces NXT, que vous pouvez acheter directement, en échangeant des Bitcoins pour des NXT ou en assistant au projet Lucky Node en exécutant un nœud public Nxt (serveur Nxt).

Pour savoir comment participer au projet de nœud Lucky, veuillez visiter https://nxtforum.org.

Il ya plus d’une centaine d’appels API que vous pouvez faire sur le serveur Nxt, une liste complète avec des paramètres obligatoires et facultatifs et des exemples sont disponibles à https://nxtwiki.org/wiki/The_Nxt_API.

À votre santé!

blockchain-betting

View this in: English Español

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.