eths / data /python_token_code.py
Ethscriptions's picture
Upload 19 files
9c1300a
# EthPen.com
# 最后更新日期:2023 年 8 月 18 日
# 在开始使用前,请仔细阅读相关说明。感谢您的理解与配合。
# 我们已将网站代码完全开源。您可以访问并仔细阅读此页面的源码:[3_🪙_ 批量题写代币铭文.py](https://huggingface.co/spaces/Ethscriptions/eths/tree/main/pages)
# 如果你对此代码存有疑虑,建议你利用如 [OpenAI - ChetGPT](https://chat.openai.com/)、[Google - Bard](https://bard.google.com/)、[Anthropic - Claude](https://claude.ai/)、[抖音 - 豆包](https://www.doubao.com/)、[百度 - 文心一言](https://yiyan.baidu.com/)、[阿里 - 通义千问](https://qianwen.aliyun.com/) 等知名 AI 平台进行问询,这可以帮助你判断代码是否含有恶意内容。
# 复制我们的代码,你同样可以在 [HuggingFace](https://HuggingFace.co) 上搭建专属于你的域名铭文批量题写工具。
# 请务必确保你正在访问的是 [EthPen.com](https://ethpen.com) 网站。我们保证站内代码不包含窃取私钥或其他恶意行为,你可以安心使用。
# 在使用过程中,请按照提示准确地填写信息,这样可以确保程序的顺畅运行。
# 为了安全起见,我们建议您使用备用账号(小号)并确保账号中不存放大额资金。
# 首次使用时,我们建议您先在测试网络中操作。确认一切无误后,再切换至主网络使用。
# 若您在使用过程中遇到问题,请及时向我们反馈。我们明白程序可能存在不完善之处,并且我们的能力也有限。真心希望得到各位程序员大佬的指导和交流。
# 导入运行代码所需要的库
from web3 import Web3 # 与以太坊交互的库,安装的命令是 pip install web3
import hashlib # 用于数据哈希,安装的命令是 pip install hashlib
import requests # 用于发送网络请求,安装的命令是 pip install requests
import re # 用于正则表达式
import time # 用于时间相关
# ---------- 以下是基础配置 ----------
# 填写你的多个 ETH 地址及私钥,建议填写新建的钱包,用英文逗号分隔(,),如下:地址,私钥。
accounts_str = '''
账户1,私钥1
账户2,私钥2
账户3,私钥3
'''
# 需要题写的代币铭文内容,变动的部分文本如 id 请用 "@#" 代替,例如:'data:,{"p":"erc-20","op":"mint","tick":"eths","id":"@#","amt":"1000"}'
ethscription = 'data:,{"p":"erc-20","op":"mint","tick":"eths","id":"@#","amt":"1000"}'
# 设置代币铭文 id 的起始和结束范围
min_id = 100 # 开始的整数
max_id = 888 # 结束的整数
# 决定是否在题写铭文之前检查该铭文有没有被题写过,如果需要检查就填写 Ture 如果不需要就填 False
check = False
# 每次交易成功后暂停 N 秒,0 为不暂停
sleep_sec = 0
# 这里配置 Ethereum PRC URL,如果你没有,请到 infura.io 或者 alchemy.com 申请一个免费的 API
w3 = Web3(Web3.HTTPProvider('https://sepolia.infura.io/v3/eab7f935b9af45e1a54f7d7ed06c5206'))
# 连接的网络 ID。比如说,1 代表 Mainnet,5 代表 Goerli 测试网络,11155111 代表 Sepolia 测试网络,如果你不放心,可以先用测试网试试。
chain_id = 11155111
# ---------- 以上是基础配置 ----------
# 检查 ETH 地址是否有效
def is_valid_eth_address(address):
if re.match("^0x[0-9a-fA-F]{40}$", address):
return True
return False
# 检查 Ethereum 私钥是否有效
def is_valid_eth_private_key(private_key):
if re.match("^[0-9a-fA-F]{64}$", private_key):
return True
return False
# 验证输入的铭文文本是否含有空格和换行符,而且字母全部为小写
def validate_input(data_str):
if re.search(r'[A-Z\s\n]', data_str): # 查找大写字母、空格或换行符
return False
return True
# 把文字转换成 16 进制
def text_to_hex(text):
return ''.join(format(ord(char), '02x') for char in text)
# 使用sha256算法计算哈希
def sha256(input_string):
sha256 = hashlib.sha256()
sha256.update(input_string.encode('utf-8'))
return sha256.hexdigest()
# 使用 Ethscriptions API(主网)检查某个铭文是否已题写
def check_content_exists(sha):
# 定义请求的网址
endpoint = f"/ethscriptions/exists/{sha}"
response = requests.get('https://mainnet-api.ethscriptions.com/api' + endpoint)
# 如果返回状态码是200,说明请求成功,然后返回结果(Ture or False)
if response.status_code == 200:
return response.json()['result']
# 发送自己到自己 0ETH 的交易
def send_transaction(w3, account_address, private_key, chain_id, gas_price, input_data, current_nonce):
# 设置交易的相关信息
tx = {
'chainId': chain_id, # 网络 ID
'gas': 25000, # 如果交易 gas 过低,可适当调高
'gasPrice': gas_price, # gas 的价格
'nonce': current_nonce, # 账户的交易数
'to': account_address, # 接收地址为自己
'value': 0, # 金额为 0ETH
'data': text_to_hex(input_data), # 铭文内容
}
# 用私钥签名这个交易
signed_tx = w3.eth.account.sign_transaction(tx, private_key)
# 发送签名后的交易并获取交易哈希
tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction)
# 打印结果信息
print(f'{account_address} | {input_data} | Transaction Hash: {tx_hash.hex()}')
# 初始化当前账户索引为 0
current_account_index = 0
# 创建账户列表
accounts = []
# 使用字典来跟踪每个地址的nonce
nonces = {}
if accounts_str: # 如果账户列表有内容
for line in accounts_str.strip().split('\n'): # 先去掉首尾的空白,然后根据换行符划分账户
if ',' in line: # 检查是否包含逗号
address, key = line.split(',') # 分开地址和私钥
if is_valid_eth_address(address) and is_valid_eth_private_key(key): # 验证地址和私钥
current_nonce = w3.eth.get_transaction_count(address) # 获取地址的 nonce
nonces[address] = current_nonce # 记录地址的 nonce
accounts.append((address.strip(), key.strip())) # 保存地址和私钥还有 nonce
else:
print(f"地址 {address} 或私钥 {key} 无效,请检查!")
exit()
else:
print(f"输入格式错误,请确保每行包含一个地址和一个私钥,并使用英文逗号分隔(,)。错误行:**{line}**")
exit()
# 判断铭文文本里是否包含空格、换行符,而且所有的字母都必须为小写。
if not validate_input(ethscription):
print("请注意:通常代币铭文文本里不能包含空格、换行符,而且所有的字母都必须为小写。")
# 检查是否留空
if not accounts or not ethscription:
print('请正确谨慎地填写内容,每一项都不应留空。')
exit()
else:
print('看起来你输入的内容均无没有问题!')
# 认真检查铭文内容,如果发现错误,输入 1 结束
print(f'铭文文本:\033[44m{ethscription}\033[m,题写 id 范围为:{min_id} - {max_id}。')
if input('请预览铭文,输入任意内容继续,输入 1 退出程序:') == '1':
exit()
print(f'开始任务,需要题写的铭文总量为:{max_id - min_id + 1}')
# 对代币铭文 id 进行循环
for the_id in range(min_id, max_id + 1):
# 使用当前账户发送交易
address, key = accounts[current_account_index]
# 得到完整的铭文文本
input_data = ethscription.replace('@#', str(the_id))
# 获取 gas
gas_price = w3.eth.gas_price
# 根据是否检查的开关进行
if check:
# 这里是开了检查后请求 Ethscriptions API
if check_content_exists(sha256(input_data)):
# 返回数据为 Ture,说明该铭文已经被题写,打印信息
print(f'{input_data} 已经被题写!')
else:
# 返回数据为 False,说明该铭文还没被题写,发送交易
# 使用 current_nonce 发送交易
send_transaction(w3, address, key, chain_id, gas_price, input_data, nonces[address])
# 交易成功后,手动增加 nonce 值
nonces[address] += 1
else:
# 这里是未开检查后直接发送交易
# 使用 current_nonce 发送交易
send_transaction(w3, address, key, chain_id, gas_price, input_data, nonces[address])
# 交易成功后,手动增加 nonce 值
nonces[address] += 1
# 更新当前账户索引,确保索引始终在账户列表的范围内
current_account_index = (current_account_index + 1) % len(accounts)
# 暂停 sleep_sec 秒
time.sleep(sleep_sec)
print(f'所有任务已经完成。')