小试牛刀-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
感谢您的关注和收藏!!!!!!
相关文章:
小试牛刀-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 Blocks blog 本篇文章主要介绍了 [Telebot区块链游戏机器人] ❤博主…...
使用github actions构建多平台electron应用
1. 创建electron项目 使用pnpm创建项目 pnpm create quick-start/electron 2. 修改electron-builder.yml文件 修改mac的target mac:target:- target: dmgarch: universal 3. 添加workflow 创建 .github/workflows/main.yml 文件 name: Build/release Electron appon:work…...
java通过pdf-box插件完成对pdf文件中图片/文字的替换
需要引入的Maven依赖: <!-- pdf替换图片 --><dependency><groupId>e-iceblue</groupId><artifactId>spire.pdf.free</artifactId><version>5.1.0</version></dependency> java代码: public AjaxResult replacepd…...
鸿蒙 next 5.0 版本页面跳转传参 接受参数 ,,接受的时候 要先定义接受参数的类型, 代码可以直接CV使用 [教程]
1, 先看效果 2, 先准备好两个页面 index 页面 传递参数 import router from ohos.routerEntry Component struct Index {Statelist: string[] [星期一, 星期二,星期三, 星期四,星期五]StateactiveIndex: number 0build() {Row() {Column({ space: 10 }) {ForEach(this.list,…...
【electron6】浏览器实时播放PCM数据
pcm介绍:PCM(Puls Code Modulation)全称脉码调制录音,PCM录音就是将声音的模拟信号表示成0,1标识的数字信号,未经任何编码和压缩处理,所以可以认为PCM是未经压缩的音频原始格式。PCM格式文件中不包含头部信…...
嵌入式C/C++、FreeRTOS、STM32F407VGT6和TCP:智能家居安防系统的全流程介绍(代码示例)
1. 项目概述 随着物联网技术的快速发展,智能家居安防系统越来越受到人们的重视。本文介绍了一种基于STM32单片机的嵌入式安防中控系统的设计与实现方案。该系统集成了多种传感器,实现了实时监控、报警和远程控制等功能,为用户提供了一个安全、可靠的家居安防解决方案。 1.1 系…...
【Django】django自带后台管理系统样式错乱,uwsgi启动css格式消失的问题
正常情况: ERROR:(css、js文件加载失败) 问题:CSS加载的样式没有了,原因:使用了django自带的admin,在使用 python manage.py runserver启动 的时候,可以加载到admin的文…...
解决npm install(‘proxy‘ config is set properly. See: ‘npm help config‘)失败问题
摘要 重装电脑系统后,使用npm install初始化项目依赖失败了,错误提示:‘proxy’ config is set properly…,具体的错误提示如下图所示: 解决方案 经过报错信息查询解决办法,最终找到了两个比较好的方案&a…...
汽车及零部件研发项目管理系统:一汽东机工选择奥博思 PowerProject 提升研发项目管理效率
在汽车行业中,汽车零部件的研发和生产是一个关键的环节。随着汽车市场的不断扩大和消费者需求的不断增加,汽车零部件项目管理的重要性日益凸显。通过有效的项目管理方法及利用先进的数字项目管理系统,可以大幅提高项目的成功率和顺利度&#…...
Keil开发IDE
Keil开发IDE 简述Keil C51Keil ARMMDK DFP安装 简述 Keil公司是一家业界领先的微控制器(MCU)软件开发工具的独立供应商。Keil公司由两家私人公司联合运营,分别是德国慕尼黑的Keil Elektronik GmbH和美国德克萨斯的Keil Software Inc。Keil公…...
数据结构与算法05堆|建堆|Top-k问题
一、堆 1、堆的介绍 堆(heap)是一种满足特定的条件的完全二叉树,主要可以分为大根堆和小根堆。 大根堆(max heap):任意节点的值大于等于其子节点的值。小根堆(min heap)࿱…...
【精简版】jQuery 中的 Ajax 详解
目录 一、概念 二、jQuery 发送 GET 请求 三、jQuery 发送 POST 请求 四、$.ajax() 方法 1、含义 2、settings 选项 ① type 属性 ② async 属性 ③ headers 属性 ④ contentType 属性 ⑤ processData 属性 ⑥ data 属性 ⑦ timeout 属性 ⑧ beforeSend(jqXHR) 方…...
win10删除鼠标右键选项
鼠标右键菜单时,发现里面的选项特别多,找一下属性,半天找不到。删除一些不常用的选项,让右键菜单变得干净整洁。 1、按下键盘上的“winR”组合按键,调出“运行”对话框,输入“regedit”命令,点击…...
分层评估的艺术:sklearn中的策略与实践
分层评估的艺术:sklearn中的策略与实践 在机器学习中,评估模型性能是一个至关重要的步骤。然而,对于不平衡的数据集,传统的评估方法可能会产生误导性的结果。分层评估(Stratified Evaluation)是一种确保评…...
排序系列 之 快速排序
!!!排序仅针对于数组哦本次排序是按照升序来的哦代码后边有图解哦 介绍 快速排序英文名为Quick Sort 基本思路 快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素base,利用base将待排序的序列分…...
【银河麒麟服务器操作系统】java进程oom现象分析及处理建议
了解银河麒麟操作系统更多全新产品,请点击访问麒麟软件产品专区:https://product.kylinos.cn 现象描述 某服务器系统升级内核至4.19.90-25.22.v2101版本后仍会触发oom导致java进程被kill。 现象分析 oom现象分析 系统messages日志分析,故…...
Redis的AOF持久化策略(AOF的工作流程、AOF的重写流程,操作演示、注意事项等)
文章目录 缓冲AOF 策略(append only file)AOF 的工作流程AOF 缓冲区策略AOF 的重写机制重写完的AOF文件为什么可以变小?AOF 重写流程 缓冲AOF 策略(append only file) AOF 的核心思路是 “实时备份“,只要我添加了新的数据或者更新了新的数据࿰…...
共享模型之无锁
一、问题提出 1.1 需求描述 有如下的需求,需要保证 account.withdraw() 取款方法的线程安全,代码如下: interface Account {// 获取余额Integer getBalance();// 取款void withdraw(Integer amount);/*** 方法内会启动 1000 个线程…...
下载安装VSCode并添加插件作为仓颉编程入门编辑器
VSCode下载地址:下载 Visual Studio Code - Mac、Linux、Windows 插件下载:GitCode - 全球开发者的开源社区,开源代码托管平台 仓颉社区中下载解压 cangjie.vsix 插件 打开VSCode 按 Ctrl Shift X 弹出下图 按照上图步骤依次点击选中我们下…...
解决:Linux上SVN 1.12版本以上无法直接存储明文密码
问题:今天在Linux机器上安装了SVN,作为客户端使用,首次执行SVN相关操作,输入账号密码信息后,后面再执行SVN相关操作(比如"svn update")还是每次都需要输入密码。 回想以前在首次输入…...
Kinaxis在2026年Gartner®供应链规划魔力象限报告中获评“领导者”
该项认可基于公司在“愿景完整性”与“执行能力”两大评估维度上的卓越表现 全球领先的供应链编排解决方案提供商Kinaxis Inc.(多伦多证券交易所代码:KXS)今日宣布,公司在《2026年Gartner面向离散行业的供应链规划解决方案魔力象限…...
(复现)基于观测器的事件触发跟踪一致性控制(非理想一般线性多 智能体系统) 复现参考文献
(复现)基于观测器的事件触发跟踪一致性控制(非理想一般线性多 智能体系统) 复现参考文献:《Observer-based Event-triggered Tracking Consensus of Non-ideal General Linear Multi-agent Systems 》①控制:设计了一个分布式观测…...
ChatTTS API 实战:如何构建高可用的 AI 辅助开发工作流
最近在做一个需要大量语音合成的项目,用到了 ChatTTS API。说实话,直接调用 API 虽然简单,但一旦涉及到生产环境的高并发、稳定性和成本控制,问题就接踵而至。经过一番折腾,我总结了一套基于 Python 异步编程的高可用工…...
告别繁琐配置:用快马ai一键生成跨平台vscode python开发环境
最近在帮团队新成员配置Python开发环境时,发现虽然VSCode很强大,但初始配置过程对新手来说还是有点复杂。不同操作系统下的路径处理、工具链选择、调试配置这些细节,经常要反复调试才能跑通。后来尝试用InsCode(快马)平台的AI辅助功能&#x…...
Notepad--:跨平台文本编辑器的技术架构与国产化实践
Notepad--:跨平台文本编辑器的技术架构与国产化实践 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- Notepa…...
嵌入式设备与PC通信协议设计核心原则
嵌入式设备与PC上位机通信协议设计原则1. 通信协议概述嵌入式系统与PC上位机之间的参数配置和数据交换需要设计高效的通信协议。在资源受限的嵌入式环境中,固定二进制协议因其高效性成为首选方案。一个完善的通信协议应包含以下基本域:帧头:标…...
openclaw改配置
配置在 ~/.openclaw/openclaw.json建议先备份:cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw_bp.json修改后重启:openclaw gateway restart查看模型修改是否生效:openclaw models status...
开源情报员:OpenClaw+nanobot镜像竞品动态追踪器
开源情报员:OpenClawnanobot镜像竞品动态追踪器 1. 为什么需要自动化竞品追踪 作为一名独立开发者,我每天需要花费大量时间手动检查竞品的GitHub仓库更新。这种重复性工作不仅效率低下,还容易遗漏关键信息。直到我发现OpenClaw与nanobot镜像…...
探索Comsol弱形式求解三维光子晶体能带
Comsol弱形式求解三维光子晶体能带。在光子学领域,三维光子晶体能带的研究至关重要。而Comsol作为一款强大的多物理场仿真软件,其弱形式求解方法为我们探索三维光子晶体能带提供了有效途径。 光子晶体与能带理论基础 光子晶体是一种具有周期性介电结构的…...
告别闪烁!用C语言数学函数实现超平滑LED呼吸灯(附Arduino/STM32代码)
用数学之美打造丝滑LED呼吸灯:从原理到代码实战 呼吸灯作为嵌入式开发的"Hello World",看似简单却暗藏玄机。传统线性PWM调光常出现亮度突变、过渡生硬的问题,就像楼梯台阶般让人不适。本文将带你用数学函数破解这一难题࿰…...
