小试牛刀-Telebot区块链游戏机器人

目录

1.编写目的

2.实现功能

2.1 Wallet功能

2.2  游戏功能

2.3  提出功能

2.4  辅助功能

3.功能实现详解

3.1 wallet功能

3.2 游戏功能

3.3 提出功能

3.4 辅助功能

4.测试视频 


Welcome to Code Block's blog

本篇文章主要介绍了

[Telebot区块链游戏机器人]
❤博主广交技术好友,喜欢文章的可以关注一下❤

1.编写目的

        本文章为记录自己开发基于区块链和Telebot实现的[石头、剪刀、布]游戏的过程,加深自己对区块链知识的理解和使用,加深对TeleBot依赖库的使用,同时希望可以帮助到有想实现相关功能的朋友.     

2.实现功能

2.1 Wallet功能

       用户可以通过/create命令命令创建游戏wallet,同时可以输入地址或扫码向该wallet发送一定数量的游戏代币,使用/wallet命令可以显示当前游戏wallet内的剩余代币数量。

2.2  游戏功能

        用户可以将bot机器人添加到公开群组,同时在群组内发送/game命令创建具有奖励随机结果的游戏,使用不同的人向群组内回复该游戏/pk进行对战,获取对战结果并向游戏wallet发送设定的奖励游戏代币,用户可以使用/del删除当前已创建游戏。

2.3  提出功能

        用户可以通过/bind命令绑定外部wallet并进行代币提出.

2.4  辅助功能

        用户可以输入/rules查看游戏规则,输入/help命令查看机器人命令及解释。

3.功能实现详解

3.1 wallet功能

        用户通过/create命令命令创建游戏wallet可以参考我的博客生成solana公私钥,/wallet显示wallet信息是通过solana.py根据保存的用户公钥查询.

def getBalance(publicKey:str):solana_client = Client(rpc_url)#公钥转换pubkey=Pubkey.from_string(publicKey)tokenPublicKey=Pubkey.from_string(BOGGY_TOKEN_MINT)#获取SOL余额sol_balance = solana_client.get_balance(pubkey)#获取SPL代币余额token_account=solana_client.get_token_accounts_by_owner_json_parsed(pubkey,TokenAccountOpts(mint=tokenPublicKey))if noTokenAccount(token_account):#不存在代币账户时,则余额为0token_balance=0.0else:token_account_json=token_account.value[0].account.to_json()token_balance=json.loads(token_account_json)['data']['parsed']['info']['tokenAmount']['uiAmount']sol_balance=(sol_balance.value/10**9)return sol_balance,token_balance

        同时为方便用户使用,这边会将用户公钥通过qrcode库转换为二维码供用户扫码,主要代码为:

import qrcode
from io import BytesIO
from PIL import Image
import qrcode.maindef generate_qr(data):# 生成普通二维码qr = qrcode.main.QRCode(version=1,box_size=10,border=4,)qr.add_data(data)qr.make(fit=True)qr_img = qr.make_image(fill_color="black", back_color="white")# 将二维码图片保存到 BytesIO 对象中img_io = BytesIO()qr_img.save(img_io, format='PNG')img_io.seek(0)return img_io

实现效果:

3.2 游戏功能

        游戏功能的设计思路是当用户在群组内输入/game时,根据(群组id+用户id+消息id)生成唯一的游戏id并通过json文件存储创建者生成的随机值信息.存储信息如下:

{"create_user_id": 5385955983,"create_username": "GameOfBoggy","create_select": 0,"pk_user_id": 2038830708,"pk_username": "USERT1223","pk_select": 1,"pk_select_hex": "4b32e3c83744655cd4ab5cc991a342c99f52c73fa83f2393a995d53baf7aeb42","amount": 20,"winner": "USERT1223","create_select_hex": "bd55d5aa6e461c63c811ff78bb00753c517eba47f086e563783a5e023ff342af","timestamp": 1721092512.869742,"create_drand_hex": "e3b4d8b6af061ddc40449d87c57c06d93de8fa73dff0055a07cc8dadb047dd1e","pk_drand_hex": "808391bb3761db7f5be8ba296e143154f043ecced8e7a693698c8490300fe34f"
}

这里的是使用本地secrets库和调用远程的drand随机数链生成两个hash值(create_drand_hex和create_select_hex为创建者游戏结果计算hash,pk_select_hex和pk_drand_hex为pk者游戏结果计算hash,这些结果面会保存到链上以保证游戏结果公平性和随机性.),这两个hash值转换为整数相加并对3取余获得随机结果,以保证游戏的随机性和不可预测性:

调用远程drand API:

def get_drand_randomness():# Drand API endpointurl = "https://api.drand.sh/52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971/public/latest"# Send request to Drandresponse = requests.get(url)if response.status_code == 200:# Parse the JSON responsedata = response.json()randomness = data['randomness']return randomnesselse:return secrets.token_hex()

计算游戏随机结果:

def get_random_hex_int():select_hex=secrets.token_hex()drand_hex=get_drand_randomness()hex_int = int(select_hex, 16)drand_int = int(drand_hex,16)select=(drand_int+hex_int)%3return select,select_hex,drand_hex

为保证游戏的美观性,这边使用图片+文字方式让机器人回复用户随机结果:

def random_game(bot,message,type,create_username):select,select_hex,drand_hex = get_random_hex_int()imgPath="./img/{}.png".format(img[select])msgText="<b>[{}] You random [{}]! @{}</b>".format(type,img[select],create_username)send_message=bot.send_photo(message.chat.id, open(imgPath, 'rb'), caption=msgText,parse_mode='HTML')return select,send_message,select_hex,drand_hex

游戏奖励发放给获胜者为代币转移操作,实现代码如下(这里的draw_data即为计算出结果的hash值,将其备注添加链上):

#向绑定账户发送代币
def drawTokenAccount(sender_public_key:str,privateKey:str,draw_public_key:str,tokenAmount,draw_data):solana_client = Client(rpc_url)#发送者sender_pubkey = Pubkey.from_string(sender_public_key)#接收者draw_pubkey = Pubkey.from_string(draw_public_key)#Token代币地址token_mint_address = Pubkey.from_string(BOGGY_TOKEN_MINT)#发送者keypairsender_keypair=Keypair.from_base58_string(privateKey)try:#spl_client客户端source_token_account=get_associated_token_address(sender_pubkey,token_mint_address)dest_token_account=get_associated_token_address(draw_pubkey,token_mint_address)#交易transfer_instruction = transfer_checked(TransferCheckedParams(program_id=TOKEN_PROGRAM_ID,source=source_token_account,mint=token_mint_address,dest=dest_token_account,owner=sender_pubkey,amount=int(float(tokenAmount) * 1000000000),decimals=9,))memo_instruction=create_memo(MemoParams(program_id=MEMO_PROGRAM_ID,signer=sender_pubkey,message=draw_data.encode('utf-8')))# #获取最新的区块hashrecent_blockhash_resp = solana_client.get_latest_blockhash()recent_blockhash=recent_blockhash_resp.value.blockhash# # 创建交易并添加转账指令transaction = Transaction()transaction.add(set_compute_unit_limit(200000))transaction.add(set_compute_unit_price(7500))transaction.add(transfer_instruction)transaction.add(memo_instruction)#设置最新区块hashtransaction.recent_blockhash=recent_blockhash#设置手续费支付地址为发送者transaction.fee_payer=sender_pubkey#签名transaction.sign(sender_keypair)#发送交易response = solana_client.send_raw_transaction(transaction.serialize())#打印交易return response.valueexcept Exception as e:print(f"Exception occurred: {str(e)}")return "error"

实现效果:

/game 20 即创建了一个奖励为20代币的游戏,这里随机的是[剪刀]

/pk pk者出了[布],所以创建者获得了奖励.

我们可以点击按钮在链上查看奖励内容.

可以看到这里包含了一个转移代币操作,是从pk者转移到创建者中的,同时包含了生成随机结果的hash值以保证游戏的公开和公平性。 

3.3 提出功能

        用户输入/bind 绑定自己的链上地址后,提出功能即为代币转移操作,主要实现代码如下,这边直接根据用户的ID查到用户的创建的游戏wallet公钥私钥并进行转移:

def drawTokenFromUserId(send_user_id,draw_user_id,gameId,draw_data):publicKey,privateKey=get_account(send_user_id)drawPublicKey=getPublicKey(draw_user_id)amount=get_game_amount(gameId)tx=drawTokenAccount(publicKey,privateKey,drawPublicKey,amount,draw_data)return amount,tx

3.4 辅助功能

        辅助功能即为telebot消息的回复,实现代码如下:

/rules:

from telebot import types
def handle_rules(bot, message):# 处理 /start 命令markup = types.InlineKeyboardMarkup()item1 = types.InlineKeyboardButton("BOGGY GROUP",url="https://t.me/BoggyCoin")markup.add(item1)welcome_message=("<b>""1.Before starting the game, you need to create(/create) a game wallet and transfer a small amount of sol and BOGGY tokens inward\n\n""2.You can send '/game [amount]' create a game(default amount:500),and the Pker reply /pk with [GAME](need enough sol and BOGGY)\n\n""3.Waiting for the results, the winner will receive the bonus set by the game creator\n\n""4.The [Scissors] will win [Paper],[Parer] will win [Rock],[Rock] will win [Scissors]\n\n""5.You Can at /wallet,draw you all token in you bind wallet,you can send '/bind [address]' bind you wallet\n\n""[Create With #BOGGY]""</b>")bot.send_photo(message.chat.id,open("./img/rules.jpeg","rb"),welcome_message,parse_mode='HTML',reply_markup=markup)
def register_handlers(bot):bot.message_handler(commands=['rules'])(lambda message: handle_rules(bot, message))

/help:

from telebot import types
def handle_help(bot, message):markup = types.InlineKeyboardMarkup()item1 = types.InlineKeyboardButton("BOGGY GROUP",url="https://t.me/BoggyCoin")markup.add(item1)help_text = ("<b>Welcome!</b>\n" "<b>Here are the available commands:</b>\n""<b>[/create]         Create you game wallet [DM*]</b>\n""<b>[/bind]           Bind you draw wallet [DM*]</b> \n""<b>[/wallet]         Show you wallet Info and Draw [DM*]</b>\n\n""<b>[/game]           Create Game with amount</b>\n""<b>[/pk]             Reply the Game Message and Pk it</b>\n""<b>[/rules]          View more detailed game rules</b>\n\n""<b>The [DM*] need DM Bot</b>")bot.send_photo(message.chat.id,open("./img/help.jpeg","rb"),help_text, parse_mode='HTML',reply_markup=markup)def register_handlers(bot):bot.message_handler(commands=['help'])(lambda message: handle_help(bot, message))

4.测试视频 

video_2024-07-16_11-48-41

 
感谢您的关注和收藏!!!!!!

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/47826.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

专业PDF编辑工具:Acrobat Pro DC 2024.002.20933绿色版,提升你的工作效率!

软件介绍 Adobe Acrobat Pro DC 2024绿色便携版是一款功能强大的PDF编辑和转换软件&#xff0c;由Adobe公司推出。它是Acrobat XI系列的后续产品&#xff0c;提供了全新的用户界面和增强功能。用户可以借助这款软件将纸质文件转换为可编辑的电子文件&#xff0c;便于传输、签署…

Python项目打包与依赖管理指南

在Python开发中&#xff0c;python文件需要在安装有python解释器的计算机的电脑上才能运行&#xff0c;但是在工作时&#xff0c;我们需要给客户介绍演示项目功能时并不一定可以条件安装解释器&#xff0c;而且这样做非常不方便。这时候我们可以打包项目&#xff0c;用于给客户…

数据结构课程设计:源代码(C)客房信息管理系统

main.c #include <unistd.h> #include "SeqList.h" #include "User.h"int main() {SL user;SLInit(&user);char ans 0;printf("是否需要导入昨日续住客人的数据&#xff1a;y/n\n");scanf(" %c", &ans);if (ans y){L…

vscode使用及调试方式和技巧

常用快捷键 ctrl ~ 显示隐藏终端面板 Ctrl\ 快速拆分文件编辑 Alt ↑↓ 移动当前代码行的位置 CtrlD 选中当前匹配项 CtrlB 切换侧边栏 alt 单机左键 或 长按鼠标滚轮鼠标左键下拉 添加多处光标 Ctrlp 快捷键设置 vscode调试 2022年了&#xff0c;该学会用VSC…

无人驾驶概览(1)

主要部分包括&#xff1a;高精度地图HD MAPS&#xff0c;定位Localization&#xff0c; 感知perception&#xff0c;预测 perdicition 规划 plan 控制 control 高精度地图HD MAPS中&#xff0c;几乎支持软件栈所有其他模块&#xff0c;包括定位感知预测和规划 定位Localizati…

Redis常用的5大数据类型

Reids字符串&#xff08;String&#xff09; 设置相同的key&#xff0c;之前内容会覆盖掉 Redis列表&#xff08;List&#xff09; 常用命令 从左往右放值 数据结构 Redis集合&#xff08;set&#xff09; sadd<key><value1><value2>...... 数据结构 Set数据…

Servlet运行过程

Servlet运行过程 Servlet程序是由WEB服务器调用&#xff0c;web服务器收到客户端的Servlet访问请求后&#xff1a; ①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是&#xff0c;则直接执行第④步&#xff0c;否则执行第②步。 ②装载并创建该Servlet的…

超声波清洗机哪款好用?保姆级教学,教你手把手挑选适合自己的超声波清洗机

提及超声波清洗机&#xff0c;大家都不陌生&#xff0c;尤其是佩戴眼镜的小伙伴&#xff0c;眼镜的镜片长时间不清洁容易模糊不清&#xff0c;而超声波清洗机的出现&#xff0c;可以轻松清洗还不会损坏镜片&#xff0c;备受眼镜党喜爱。但由于现在市面上的超声波清洗机的款式太…

pyqt/pyside QTableWidget失去焦点后,选中的行仍高亮的显示

正常情况下pyqt/pyside的QTableWidget&#xff0c;点击input或者按钮失去焦点后 行的颜色消失了 如何在失去焦点时保持行的选中颜色&#xff0c;增加下面的代码&#xff1a; # 获取当前表格部件的调色板 p tableWidget.palette()# 获取活跃状态下的高亮颜色和高亮文本颜色&a…

排序系列 之 插入排序

&#xff01;&#xff01;&#xff01;排序仅针对于数组哦本次排序是按照升序来的哦 介绍 插入排序英文名为InsertSort 基本思路 1、认为数组当中的第一个数值已经排好序了2、定义一个游标从第二个数值开始不断地向后进行遍历3、游标指向的数据插入已经排好序的数组中 代码…

Windows server漏洞解决

Windows server漏洞解决 一、SSL/TLS问题1、问题2、建议3、方法1)、winR运行&#xff1a;regedit&#xff0c;进入注册表。2&#xff09;、找到注册表3&#xff09;、在Ciphers新建五个项4&#xff09;、在每个新建文件加入值 二、Apache Tomcat问题1、问题2、下载 好家伙&…

国内从事双臂机器人的团队

一、背景 随着人形机器人的发展&#xff0c;双臂协同操作得到了越来越多研究人员的关注。我自己也是做双臂机器人方向的&#xff0c;虽然通过看论文或刷知乎了解到国内有许多团队在做双臂机器人方向&#xff0c;但还没有系统的整理过&#xff0c;因此趁这次机会&#xff0c;好…

C#数字医学影像系统(RIS/PACS)源码,Oracle数据库,C/S架构,运行稳定

数字医学影像系统&#xff08;RIS/PACS&#xff09;源码&#xff0c;三甲以下的医院都能满足。PACS 系统全套成品源码。 开发技术&#xff1a;C/S架构&#xff0c;C#开发语言&#xff0c;数据库服务器采用Oracle数据库。 医学影像存储与传输系统&#xff0c;融合了医学信息化…

算法-经典递归解决排列组合

文章目录 前言1. 获取字符串的所有字串2. 数组的子集(无重复)3. 数组的子集(有重复)4. 字符大小写全排列5. 全排列(无重复)6. 全排列(有重复) 前言 如何正确的处理递归 所有的递归都分为带路径的递归和不带路径的递归, 我们之前学二叉树的时候基本上都是带路径的递归, 所有的递…

HBuilder x 使用Git管理项目,配合easy-git插件管理项目代码配置git和推送/拉取使用教程

文章目录 目录 文章目录 使用流程 小结 概要安装流程技术细节小结 概要 克隆/拉取项目代码到本地电脑教程 HBuilder x 使用Git管理项目&#xff0c;配合easy-git插件 克隆项目代码到本地教程-CSDN博客 电脑环境已安装好Hbuilder x工具 如果没有安装可以参考以下先安装好Hbui…

银发经济发展需要什么支持

随着社会老龄化的加剧&#xff0c;“银发经济”应运而生&#xff0c;成为社会发展的新动向。银发经济指的是针对老年人群体的经济活动&#xff0c;包括健康护理、休闲旅游、教育文化等多方面内容。这一现象不仅体现了社会对老年群体的关注和尊重&#xff0c;同时也为经济发展提…

HarmonyOS NEXT零基础入门到实战-第一部分

构建节页面思路&#xff1a; 1、排版 (分析布局) 2、内容&#xff08;基础组件&#xff09; 3、美化&#xff08;属性方法&#xff09; 设计资源-svg图标 界面中展示图标 ->可以使用svg图标&#xff08;任意放大缩小不失真&#xff0c;可以改颜色&#xff09; 使用方式&a…

重磅活动推荐:2024 CLK 大会启动中,承办单位开放报名

中国 Linux 内核开发者大会&#xff08;简称“CLK 大会”&#xff09;是中国 Linux 内核领域最具影响力的峰会之一&#xff0c;由清华大学、英特尔、富士通南大、IBM、阿里云、华为、腾讯等企业支持主办。大会秉承“自由、协作、创新”理念&#xff0c;以推动和普及开源技术为使…

java中Hashcode的作用【详解版】

一 HashCode作用 1.1 HashCode作用 hashCode是object类的一个方法&#xff0c;用于哈希表结构&#xff0c;主要是用来获取哈希值&#xff0c;用于确定对象在哈希表中的位置&#xff0c;如果两个对象的hashcode相同&#xff0c;那么他们可能被放在哈希表同一个位置(这取决于哈…

【每天值得看】文章获得《每天值得看》人工智能板块推荐第三名!为自己点个赞!!!

[2024-07-19]&#xff5c;CSDN每天值得看&#xff5c;人工智能 ① 【机器学习】Grid Search: 一种系统性的超参数优化方法&#xff08;鑫宝Code:[博客] [成就]&#xff09; [质量分&#xff1a;97&#xff1b;难度等级&#xff1a;未知&#xff1b;新鲜技术&#xff1a;99] 摘…