<100 subscribers
最近一直在做web端的逆向,在浏览器里面逆向,现在开始做一点链上的逆向和脚本,一边做交互一边学习(链上脚本交互分析起来感觉会更轻松一些),今天这份作业是做的Base链的域名注册脚本,因为考虑到女巫的不道德,就删去的批量的逻辑和随机名称的生成部分
手动在网页上铸造一个base域名,把tx放到Tenderly中进行分析,得到交互的合约,函数,以及参数,通过调用堆栈理解合约逻辑




{
"request": {
"name": "binancerensheng",
"owner": "0xb4814cfb0e3b68f016517b86853f28f4bcb52a64",
"duration": "31557600",
"resolver": "0x426fa03fb86e510d0dd9f70335cf102a98b10875",
"data": [
"0xd5fa2b00996cdcdc1052af1138f37aae9bb4487ae74c5f2545fb0990961ee585bb560392000000000000000000000000b4814cfb0e3b68f016517b86853f28f4bcb52a64",
"0x8b95dd71996cdcdc1052af1138f37aae9bb4487ae74c5f2545fb0990961ee585bb560392000000000000000000000000000000000000000000000000000000008000210500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000014b4814cfb0e3b68f016517b86853f28f4bcb52a64000000000000000000000000",
"0x77372213996cdcdc1052af1138f37aae9bb4487ae74c5f2545fb0990961ee585bb5603920000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001862696e616e636572656e7368656e672e626173652e6574680000000000000000"
],
"reverseRecord": true,
"coinTypes": [
"2147492101"
],
"signatureExpiry": "1759918924",
"signature": "0x10b617a37a99cb9bbdc0795737ee39ee0087a991b2865e19a353cab17fae7bb47b3d1e45ee522481686be9cd836f92fc0fc8632c23abae08f1844546ae0826331b"
}
}name -域名
owner- 签名地址
duration- 域名注册时长
resolver -解析合约地址
data -用于调用解析合约所需的数据
reverseRecord-定值
coinTypes-定值
signatureExpiry-可为空值
signature-可为空值所以除了data参数以外都很简单,data参数是三个数组组合生成的,包含函数选择器,铸造者地址以及域名名称等信息,data参数单独分了一个文件进行生成。
data0 = (
SELECTOR_SET_ADDR_SIMPLE +
encode(
["bytes32", "address"],
[nodehash, Web3.to_checksum_address(owner)]
)
)
data0_hex = to_hex(data0)
print(f"data[0]: {data0_hex}")
# Generate data[1]: setAddr(bytes32 node, uint256 coinType, bytes addr)
# Use raw 20-byte address instead of ABI-encoded address
addr_bytes = Web3.to_bytes(hexstr=owner) # Convert address to 20-byte raw bytes
data1 = (
SELECTOR_SET_ADDR_COIN_TYPE +
encode(
["bytes32", "uint256", "bytes"],
[nodehash, COIN_TYPE, addr_bytes]
)
)
data1_hex = to_hex(data1)
print(f"data[1]: {data1_hex}")
# Generate data[2]: setName(bytes32 node, string name)
data2 = (
SELECTOR_SET_NAME +
encode(
["bytes32", "string"],
[nodehash, full_name]
)
)from web3 import Web3
from eth_utils import keccak, to_bytes, to_hex
from eth_abi import encode
COIN_TYPE = 2147492101
# ENS namehash algorithm (equivalent to poc.namehash)
def namehash(name: str) -> bytes:
if not name:
return bytes(32) # Empty name returns 0x00...00
labels = name.split(".")
node = bytes(32) # Initialize to 0
for label in reversed(labels):
label_hash = keccak(text=label)
node = keccak(node + label_hash)
return node
def crackPoc(name,owner):
root_name='.base.eth'
full_name = name + root_name # "binancerensheng.base.eth"
# Target nodehash (for validation)
# Calculate nodehash
nodehash = namehash(full_name)
nodehash_hex = to_hex(nodehash)
# Validate nodehash
print(f"Nodehash: {nodehash_hex}")
# Function selectors
SELECTOR_SET_ADDR_SIMPLE = keccak(text="setAddr(bytes32,address)")[:4] # 0xd5fa2b00
SELECTOR_SET_ADDR_COIN_TYPE = keccak(text="setAddr(bytes32,uint256,bytes)")[:4] # 0x8b95dd71
SELECTOR_SET_NAME = keccak(text="setName(bytes32,string)")[:4] # 0x77372213
# Generate data[0]: setAddr(bytes32 node, address addr)
data0 = (
SELECTOR_SET_ADDR_SIMPLE +
encode(
["bytes32", "address"],
[nodehash, Web3.to_checksum_address(owner)]
)
)
data0_hex = to_hex(data0)
print(f"data[0]: {data0_hex}")
# Generate data[1]: setAddr(bytes32 node, uint256 coinType, bytes addr)
# Use raw 20-byte address instead of ABI-encoded address
addr_bytes = Web3.to_bytes(hexstr=owner) # Convert address to 20-byte raw bytes
data1 = (
SELECTOR_SET_ADDR_COIN_TYPE +
encode(
["bytes32", "uint256", "bytes"],
[nodehash, COIN_TYPE, addr_bytes]
)
)
data1_hex = to_hex(data1)
print(f"data[1]: {data1_hex}")
# Generate data[2]: setName(bytes32 node, string name)
data2 = (
SELECTOR_SET_NAME +
encode(
["bytes32", "string"],
[nodehash, full_name]
)
)
data2_hex = to_hex(data2)
print(f"data[2]: {data2_hex}")
return [data0_hex, data1_hex, data2_hex]成功铸造binancelife的base域名,开启baselife

最近一直在做web端的逆向,在浏览器里面逆向,现在开始做一点链上的逆向和脚本,一边做交互一边学习(链上脚本交互分析起来感觉会更轻松一些),今天这份作业是做的Base链的域名注册脚本,因为考虑到女巫的不道德,就删去的批量的逻辑和随机名称的生成部分
手动在网页上铸造一个base域名,把tx放到Tenderly中进行分析,得到交互的合约,函数,以及参数,通过调用堆栈理解合约逻辑




{
"request": {
"name": "binancerensheng",
"owner": "0xb4814cfb0e3b68f016517b86853f28f4bcb52a64",
"duration": "31557600",
"resolver": "0x426fa03fb86e510d0dd9f70335cf102a98b10875",
"data": [
"0xd5fa2b00996cdcdc1052af1138f37aae9bb4487ae74c5f2545fb0990961ee585bb560392000000000000000000000000b4814cfb0e3b68f016517b86853f28f4bcb52a64",
"0x8b95dd71996cdcdc1052af1138f37aae9bb4487ae74c5f2545fb0990961ee585bb560392000000000000000000000000000000000000000000000000000000008000210500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000014b4814cfb0e3b68f016517b86853f28f4bcb52a64000000000000000000000000",
"0x77372213996cdcdc1052af1138f37aae9bb4487ae74c5f2545fb0990961ee585bb5603920000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001862696e616e636572656e7368656e672e626173652e6574680000000000000000"
],
"reverseRecord": true,
"coinTypes": [
"2147492101"
],
"signatureExpiry": "1759918924",
"signature": "0x10b617a37a99cb9bbdc0795737ee39ee0087a991b2865e19a353cab17fae7bb47b3d1e45ee522481686be9cd836f92fc0fc8632c23abae08f1844546ae0826331b"
}
}name -域名
owner- 签名地址
duration- 域名注册时长
resolver -解析合约地址
data -用于调用解析合约所需的数据
reverseRecord-定值
coinTypes-定值
signatureExpiry-可为空值
signature-可为空值所以除了data参数以外都很简单,data参数是三个数组组合生成的,包含函数选择器,铸造者地址以及域名名称等信息,data参数单独分了一个文件进行生成。
data0 = (
SELECTOR_SET_ADDR_SIMPLE +
encode(
["bytes32", "address"],
[nodehash, Web3.to_checksum_address(owner)]
)
)
data0_hex = to_hex(data0)
print(f"data[0]: {data0_hex}")
# Generate data[1]: setAddr(bytes32 node, uint256 coinType, bytes addr)
# Use raw 20-byte address instead of ABI-encoded address
addr_bytes = Web3.to_bytes(hexstr=owner) # Convert address to 20-byte raw bytes
data1 = (
SELECTOR_SET_ADDR_COIN_TYPE +
encode(
["bytes32", "uint256", "bytes"],
[nodehash, COIN_TYPE, addr_bytes]
)
)
data1_hex = to_hex(data1)
print(f"data[1]: {data1_hex}")
# Generate data[2]: setName(bytes32 node, string name)
data2 = (
SELECTOR_SET_NAME +
encode(
["bytes32", "string"],
[nodehash, full_name]
)
)from web3 import Web3
from eth_utils import keccak, to_bytes, to_hex
from eth_abi import encode
COIN_TYPE = 2147492101
# ENS namehash algorithm (equivalent to poc.namehash)
def namehash(name: str) -> bytes:
if not name:
return bytes(32) # Empty name returns 0x00...00
labels = name.split(".")
node = bytes(32) # Initialize to 0
for label in reversed(labels):
label_hash = keccak(text=label)
node = keccak(node + label_hash)
return node
def crackPoc(name,owner):
root_name='.base.eth'
full_name = name + root_name # "binancerensheng.base.eth"
# Target nodehash (for validation)
# Calculate nodehash
nodehash = namehash(full_name)
nodehash_hex = to_hex(nodehash)
# Validate nodehash
print(f"Nodehash: {nodehash_hex}")
# Function selectors
SELECTOR_SET_ADDR_SIMPLE = keccak(text="setAddr(bytes32,address)")[:4] # 0xd5fa2b00
SELECTOR_SET_ADDR_COIN_TYPE = keccak(text="setAddr(bytes32,uint256,bytes)")[:4] # 0x8b95dd71
SELECTOR_SET_NAME = keccak(text="setName(bytes32,string)")[:4] # 0x77372213
# Generate data[0]: setAddr(bytes32 node, address addr)
data0 = (
SELECTOR_SET_ADDR_SIMPLE +
encode(
["bytes32", "address"],
[nodehash, Web3.to_checksum_address(owner)]
)
)
data0_hex = to_hex(data0)
print(f"data[0]: {data0_hex}")
# Generate data[1]: setAddr(bytes32 node, uint256 coinType, bytes addr)
# Use raw 20-byte address instead of ABI-encoded address
addr_bytes = Web3.to_bytes(hexstr=owner) # Convert address to 20-byte raw bytes
data1 = (
SELECTOR_SET_ADDR_COIN_TYPE +
encode(
["bytes32", "uint256", "bytes"],
[nodehash, COIN_TYPE, addr_bytes]
)
)
data1_hex = to_hex(data1)
print(f"data[1]: {data1_hex}")
# Generate data[2]: setName(bytes32 node, string name)
data2 = (
SELECTOR_SET_NAME +
encode(
["bytes32", "string"],
[nodehash, full_name]
)
)
data2_hex = to_hex(data2)
print(f"data[2]: {data2_hex}")
return [data0_hex, data1_hex, data2_hex]成功铸造binancelife的base域名,开启baselife

import time
import requests
from web3 import Web3
import json
from eth_account import Account
from eth_account.signers.local import LocalAccount
from web3.exceptions import ContractLogicError
import hashlib
import poc.dataPoc
import basechain.WalletManager
import utils.randomInfo
def namehash(name: str) -> bytes:
"""手动实现 ENS namehash 算法"""
if not name:
return bytes(32) # 空名称返回零哈希
labels = name.split('.')
node = bytes(32)
for label in reversed(labels):
label_hash = hashlib.sha3_256(label.encode('utf-8')).digest()
node = hashlib.sha3_256(node + label_hash).digest()
return node
def register_with_contract(
private_key: str,
name,
duration: int = 31557600,
reverse_record: bool = True,
coin_types: list = [2147492101]
) -> dict:
"""
使用指定的私钥与Base链上的代理合约交互,调用register函数注册名称,动态估算gas。
参数:
private_key (str): 用于签名的私钥
name (str): 要注册的名称,例如 "bluekobe109"
duration (int): 注册时长(秒),默认为31557600(1年)
reverse_record (bool): 是否设置反向记录,默认为True
coin_types (list): 币种类型列表,默认为[2147492101]
返回:
dict: 包含交易哈希和交易状态的字典
"""
# 配置Web3
proxies = {
'https': f'socks5h://SJM8Z8KzgM-zone-abc-region-PH:12098904@025c9f07ec41384e.abcproxy.vip:4950'
}
session = requests.Session()
session.proxies = proxies
rpc_url = "https://mainnet.base.org"
w3=Web3(Web3.HTTPProvider(rpc_url, session=session))
while not w3.is_connected():
time.sleep(10)
w3 = Web3(Web3.HTTPProvider(rpc_url,session= session))
print('代理网络连接中')
# 合约地址
contract_address_raw = "0xa7d2607c6bd39ae9521e514026cbb078405ab322"
try:
contract_address = w3.to_checksum_address(contract_address_raw)
except Exception as e:
raise Exception(f"转换合约地址为checksum格式失败: {str(e)}")
# 加载合约ABI(替换为你的完整ABI)
abi_string = '''[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"AlreadyRegisteredWithDiscount","type":"error"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"DurationTooShort","type":"error"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"InactiveDiscount","type":"error"},{"inputs":[],"name":"InsufficientValue","type":"error"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"InvalidDiscount","type":"error"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"InvalidDiscountAmount","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"InvalidPaymentReceiver","type":"error"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"address","name":"validator","type":"address"}],"name":"InvalidValidator","type":"error"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"NameNotValid","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ResolverRequiredWhenDataSupplied","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"registrant","type":"address"},{"indexed":true,"internalType":"bytes32","name":"discountKey","type":"bytes32"}],"name":"DiscountApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"discountKey","type":"bytes32"},{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"address","name":"discountValidator","type":"address"},{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"uint256","name":"discount","type":"uint256"}],"indexed":false,"internalType":"struct UpgradeableRegistrarController.DiscountDetails","name":"details","type":"tuple"}],"name":"DiscountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"payee","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"ETHPaymentProcessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newL2ReverseRegistrar","type":"address"}],"name":"L2ReverseRegistrarUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"bytes32","name":"label","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"expires","type":"uint256"}],"name":"NameRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"bytes32","name":"label","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"expires","type":"uint256"}],"name":"NameRenewed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPaymentReceiver","type":"address"}],"name":"PaymentReceiverUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPrices","type":"address"}],"name":"PriceOracleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newReverseRegistrar","type":"address"}],"name":"ReverseRegistrarUpdated","type":"event"},{"inputs":[],"name":"MIN_NAME_LENGTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_REGISTRATION_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"available","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"bytes[]","name":"data","type":"bytes[]"},{"internalType":"bool","name":"reverseRecord","type":"bool"},{"internalType":"uint256[]","name":"coinTypes","type":"uint256[]"},{"internalType":"uint256","name":"signatureExpiry","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UpgradeableRegistrarController.RegisterRequest","name":"request","type":"tuple"}],"name":"discountedRegister","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"bytes32","name":"discountKey","type":"bytes32"}],"name":"discountedRegisterPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"discountKey","type":"bytes32"}],"name":"discounts","outputs":[{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"address","name":"discountValidator","type":"address"},{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"uint256","name":"discount","type":"uint256"}],"internalType":"struct UpgradeableRegistrarController.DiscountDetails","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getActiveDiscounts","outputs":[{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"address","name":"discountValidator","type":"address"},{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"uint256","name":"discount","type":"uint256"}],"internalType":"struct UpgradeableRegistrarController.DiscountDetails[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"hasRegisteredWithDiscount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IBaseRegistrar","name":"base_","type":"address"},{"internalType":"contract IPriceOracle","name":"prices_","type":"address"},{"internalType":"contract IReverseRegistrar","name":"reverseRegistrar_","type":"address"},{"internalType":"address","name":"owner_","type":"address"},{"internalType":"bytes32","name":"rootNode_","type":"bytes32"},{"internalType":"string","name":"rootName_","type":"string"},{"internalType":"address","name":"paymentReceiver_","type":"address"},{"internalType":"address","name":"legacyRegistrarController_","type":"address"},{"internalType":"address","name":"legacyL2Resolver_","type":"address"},{"internalType":"address","name":"l2ReverseRegistrar_","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prices","outputs":[{"internalType":"contract IPriceOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"bytes[]","name":"data","type":"bytes[]"},{"internalType":"bool","name":"reverseRecord","type":"bool"},{"internalType":"uint256[]","name":"coinTypes","type":"uint256[]"},{"internalType":"uint256","name":"signatureExpiry","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UpgradeableRegistrarController.RegisterRequest","name":"request","type":"tuple"}],"name":"register","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"registerPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"renew","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"rentPrice","outputs":[{"components":[{"internalType":"uint256","name":"base","type":"uint256"},{"internalType":"uint256","name":"premium","type":"uint256"}],"internalType":"struct IPriceOracle.Price","name":"price","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reverseRegistrar","outputs":[{"internalType":"contract IReverseRegistrar","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"address","name":"discountValidator","type":"address"},{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"uint256","name":"discount","type":"uint256"}],"internalType":"struct UpgradeableRegistrarController.DiscountDetails","name":"details","type":"tuple"}],"name":"setDiscountDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"l2ReverseRegistrar_","type":"address"}],"name":"setL2ReverseRegistrar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"paymentReceiver_","type":"address"}],"name":"setPaymentReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPriceOracle","name":"prices_","type":"address"}],"name":"setPriceOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"signatureExpiry","type":"uint256"},{"internalType":"uint256[]","name":"coinTypes","type":"uint256[]"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"setReverseRecord","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IReverseRegistrar","name":"reverse_","type":"address"}],"name":"setReverseRegistrar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"valid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]'''
try:
abi = json.loads(abi_string)
except json.JSONDecodeError as e:
raise Exception(f"解析ABI失败: {str(e)}")
# 创建合约实例
try:
contract = w3.eth.contract(address=contract_address, abi=abi)
except Exception as e:
raise Exception(f"创建合约实例失败: {str(e)}")
# 从私钥获取账户
try:
account: LocalAccount = Account.from_key(private_key)
sender_address = account.address
print('交互地址',sender_address)
except Exception as e:
raise Exception(f"无效的私钥: {str(e)}")
# 验证名称格式
# 假设合约只接受子域(例如 "bluekobe109"),并在内部追加 ".base.eth"
full_name = f"{name}.base.eth"
try:
node = namehash(full_name)
print(f"计算名称哈希 for {full_name}: {node.hex()}")
except Exception as e:
raise Exception(f"计算名称哈希失败: {str(e)}")
# 构造 data 字段
data = poc.dataPoc.crackPoc(name,sender_address)
print(f'data\n{data}')
resolver_address = w3.to_checksum_address("0x426fA03fB86e510D0dD9F70335cF102A98b10875")
# 构建 register 函数的参数
# 注意:合约可能只接受 "bluekobe109" 作为 name 参数,而在内部追加 ".base.eth"
register_request = {
"name": name, # 只传递子域,例如 "bluekobe109"
"owner": sender_address,
"duration": duration,
"resolver": resolver_address,
"data": data,
"reverseRecord": reverse_record,
"coinTypes": coin_types,
"signatureExpiry": 0,
"signature": "0x"
}
# 查询注册价格
try:
price = contract.functions.registerPrice(name, duration).call()
print(f"注册价格 for {name}: {w3.from_wei(price, 'ether')} ETH")
except Exception as e:
raise Exception(f"查询注册价格失败: {str(e)}")
# 获取当前nonce
try:
nonce = w3.eth.get_transaction_count(sender_address)
except Exception as e:
raise Exception(f"获取nonce失败: {str(e)}")
# 动态估算gas
try:
gas_estimate = contract.functions.register(register_request).estimate_gas({
'from': sender_address,
'value': price
})
gas_limit = int(gas_estimate * 1.15)
print(f"估算gas: {gas_estimate}, 使用gas限制: {gas_limit}")
except ContractLogicError as e:
raise Exception(f"Gas估算失败,可能由于合约逻辑错误: {str(e)}")
except Exception as e:
raise Exception(f"Gas估算失败: {str(e)}")
# 动态获取gas价格
try:
base_gas_price = w3.eth.gas_price
gas_price = int(base_gas_price * 1.1)
print(f"当前网络gas价格: {w3.from_wei(base_gas_price, 'gwei')} gwei, 使用gas价格: {w3.from_wei(gas_price, 'gwei')} gwei")
except Exception as e:
raise Exception(f"获取gas价格失败: {str(e)}")
# 构建交易
try:
tx = contract.functions.register(register_request).build_transaction({
'from': sender_address,
'value': price,
'gas': gas_limit,
'gasPrice': gas_price,
'nonce': nonce,
'chainId': 8453
})
except Exception as e:
raise Exception(f"构建交易失败: {str(e)}")
# 签名交易
try:
signed_tx = w3.eth.account.sign_transaction(tx, private_key)
except Exception as e:
raise Exception(f"签名交易失败: {str(e)}")
# 发送交易
try:
tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction)
print(f"交易已发送,交易哈希: {tx_hash.hex()}")
except Exception as e:
raise Exception(f"发送交易失败: {str(e)}")
# 等待交易确认
try:
tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
result = {
"tx_hash": tx_hash.hex(),
"status": "success" if tx_receipt.status == 1 else "failed",
"receipt": tx_receipt
}
if tx_receipt.status == 1:
print("交易成功!")
else:
print("交易失败!")
print(tx_receipt)
return result
except Exception as e:
raise Exception(f"等待交易确认失败: {str(e)}")
if __name__ == "__main__":
private_key=account['private_key']
name='yourensNAME'
result = register_with_contract(
private_key=private_key,
name=name,
duration=31557600,
reverse_record=True,
coin_types=[2147492101]
)
import time
import requests
from web3 import Web3
import json
from eth_account import Account
from eth_account.signers.local import LocalAccount
from web3.exceptions import ContractLogicError
import hashlib
import poc.dataPoc
import basechain.WalletManager
import utils.randomInfo
def namehash(name: str) -> bytes:
"""手动实现 ENS namehash 算法"""
if not name:
return bytes(32) # 空名称返回零哈希
labels = name.split('.')
node = bytes(32)
for label in reversed(labels):
label_hash = hashlib.sha3_256(label.encode('utf-8')).digest()
node = hashlib.sha3_256(node + label_hash).digest()
return node
def register_with_contract(
private_key: str,
name,
duration: int = 31557600,
reverse_record: bool = True,
coin_types: list = [2147492101]
) -> dict:
"""
使用指定的私钥与Base链上的代理合约交互,调用register函数注册名称,动态估算gas。
参数:
private_key (str): 用于签名的私钥
name (str): 要注册的名称,例如 "bluekobe109"
duration (int): 注册时长(秒),默认为31557600(1年)
reverse_record (bool): 是否设置反向记录,默认为True
coin_types (list): 币种类型列表,默认为[2147492101]
返回:
dict: 包含交易哈希和交易状态的字典
"""
# 配置Web3
proxies = {
'https': f'socks5h://SJM8Z8KzgM-zone-abc-region-PH:12098904@025c9f07ec41384e.abcproxy.vip:4950'
}
session = requests.Session()
session.proxies = proxies
rpc_url = "https://mainnet.base.org"
w3=Web3(Web3.HTTPProvider(rpc_url, session=session))
while not w3.is_connected():
time.sleep(10)
w3 = Web3(Web3.HTTPProvider(rpc_url,session= session))
print('代理网络连接中')
# 合约地址
contract_address_raw = "0xa7d2607c6bd39ae9521e514026cbb078405ab322"
try:
contract_address = w3.to_checksum_address(contract_address_raw)
except Exception as e:
raise Exception(f"转换合约地址为checksum格式失败: {str(e)}")
# 加载合约ABI(替换为你的完整ABI)
abi_string = '''[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"AlreadyRegisteredWithDiscount","type":"error"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"DurationTooShort","type":"error"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"InactiveDiscount","type":"error"},{"inputs":[],"name":"InsufficientValue","type":"error"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"InvalidDiscount","type":"error"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"InvalidDiscountAmount","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"InvalidPaymentReceiver","type":"error"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"address","name":"validator","type":"address"}],"name":"InvalidValidator","type":"error"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"NameNotValid","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ResolverRequiredWhenDataSupplied","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"registrant","type":"address"},{"indexed":true,"internalType":"bytes32","name":"discountKey","type":"bytes32"}],"name":"DiscountApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"discountKey","type":"bytes32"},{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"address","name":"discountValidator","type":"address"},{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"uint256","name":"discount","type":"uint256"}],"indexed":false,"internalType":"struct UpgradeableRegistrarController.DiscountDetails","name":"details","type":"tuple"}],"name":"DiscountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"payee","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"ETHPaymentProcessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newL2ReverseRegistrar","type":"address"}],"name":"L2ReverseRegistrarUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"bytes32","name":"label","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"expires","type":"uint256"}],"name":"NameRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"bytes32","name":"label","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"expires","type":"uint256"}],"name":"NameRenewed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPaymentReceiver","type":"address"}],"name":"PaymentReceiverUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPrices","type":"address"}],"name":"PriceOracleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newReverseRegistrar","type":"address"}],"name":"ReverseRegistrarUpdated","type":"event"},{"inputs":[],"name":"MIN_NAME_LENGTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_REGISTRATION_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"available","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"bytes[]","name":"data","type":"bytes[]"},{"internalType":"bool","name":"reverseRecord","type":"bool"},{"internalType":"uint256[]","name":"coinTypes","type":"uint256[]"},{"internalType":"uint256","name":"signatureExpiry","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UpgradeableRegistrarController.RegisterRequest","name":"request","type":"tuple"}],"name":"discountedRegister","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"bytes32","name":"discountKey","type":"bytes32"}],"name":"discountedRegisterPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"discountKey","type":"bytes32"}],"name":"discounts","outputs":[{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"address","name":"discountValidator","type":"address"},{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"uint256","name":"discount","type":"uint256"}],"internalType":"struct UpgradeableRegistrarController.DiscountDetails","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getActiveDiscounts","outputs":[{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"address","name":"discountValidator","type":"address"},{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"uint256","name":"discount","type":"uint256"}],"internalType":"struct UpgradeableRegistrarController.DiscountDetails[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"hasRegisteredWithDiscount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IBaseRegistrar","name":"base_","type":"address"},{"internalType":"contract IPriceOracle","name":"prices_","type":"address"},{"internalType":"contract IReverseRegistrar","name":"reverseRegistrar_","type":"address"},{"internalType":"address","name":"owner_","type":"address"},{"internalType":"bytes32","name":"rootNode_","type":"bytes32"},{"internalType":"string","name":"rootName_","type":"string"},{"internalType":"address","name":"paymentReceiver_","type":"address"},{"internalType":"address","name":"legacyRegistrarController_","type":"address"},{"internalType":"address","name":"legacyL2Resolver_","type":"address"},{"internalType":"address","name":"l2ReverseRegistrar_","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prices","outputs":[{"internalType":"contract IPriceOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"bytes[]","name":"data","type":"bytes[]"},{"internalType":"bool","name":"reverseRecord","type":"bool"},{"internalType":"uint256[]","name":"coinTypes","type":"uint256[]"},{"internalType":"uint256","name":"signatureExpiry","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UpgradeableRegistrarController.RegisterRequest","name":"request","type":"tuple"}],"name":"register","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"registerPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"renew","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"rentPrice","outputs":[{"components":[{"internalType":"uint256","name":"base","type":"uint256"},{"internalType":"uint256","name":"premium","type":"uint256"}],"internalType":"struct IPriceOracle.Price","name":"price","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reverseRegistrar","outputs":[{"internalType":"contract IReverseRegistrar","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"address","name":"discountValidator","type":"address"},{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"uint256","name":"discount","type":"uint256"}],"internalType":"struct UpgradeableRegistrarController.DiscountDetails","name":"details","type":"tuple"}],"name":"setDiscountDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"l2ReverseRegistrar_","type":"address"}],"name":"setL2ReverseRegistrar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"paymentReceiver_","type":"address"}],"name":"setPaymentReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPriceOracle","name":"prices_","type":"address"}],"name":"setPriceOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"signatureExpiry","type":"uint256"},{"internalType":"uint256[]","name":"coinTypes","type":"uint256[]"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"setReverseRecord","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IReverseRegistrar","name":"reverse_","type":"address"}],"name":"setReverseRegistrar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"valid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]'''
try:
abi = json.loads(abi_string)
except json.JSONDecodeError as e:
raise Exception(f"解析ABI失败: {str(e)}")
# 创建合约实例
try:
contract = w3.eth.contract(address=contract_address, abi=abi)
except Exception as e:
raise Exception(f"创建合约实例失败: {str(e)}")
# 从私钥获取账户
try:
account: LocalAccount = Account.from_key(private_key)
sender_address = account.address
print('交互地址',sender_address)
except Exception as e:
raise Exception(f"无效的私钥: {str(e)}")
# 验证名称格式
# 假设合约只接受子域(例如 "bluekobe109"),并在内部追加 ".base.eth"
full_name = f"{name}.base.eth"
try:
node = namehash(full_name)
print(f"计算名称哈希 for {full_name}: {node.hex()}")
except Exception as e:
raise Exception(f"计算名称哈希失败: {str(e)}")
# 构造 data 字段
data = poc.dataPoc.crackPoc(name,sender_address)
print(f'data\n{data}')
resolver_address = w3.to_checksum_address("0x426fA03fB86e510D0dD9F70335cF102A98b10875")
# 构建 register 函数的参数
# 注意:合约可能只接受 "bluekobe109" 作为 name 参数,而在内部追加 ".base.eth"
register_request = {
"name": name, # 只传递子域,例如 "bluekobe109"
"owner": sender_address,
"duration": duration,
"resolver": resolver_address,
"data": data,
"reverseRecord": reverse_record,
"coinTypes": coin_types,
"signatureExpiry": 0,
"signature": "0x"
}
# 查询注册价格
try:
price = contract.functions.registerPrice(name, duration).call()
print(f"注册价格 for {name}: {w3.from_wei(price, 'ether')} ETH")
except Exception as e:
raise Exception(f"查询注册价格失败: {str(e)}")
# 获取当前nonce
try:
nonce = w3.eth.get_transaction_count(sender_address)
except Exception as e:
raise Exception(f"获取nonce失败: {str(e)}")
# 动态估算gas
try:
gas_estimate = contract.functions.register(register_request).estimate_gas({
'from': sender_address,
'value': price
})
gas_limit = int(gas_estimate * 1.15)
print(f"估算gas: {gas_estimate}, 使用gas限制: {gas_limit}")
except ContractLogicError as e:
raise Exception(f"Gas估算失败,可能由于合约逻辑错误: {str(e)}")
except Exception as e:
raise Exception(f"Gas估算失败: {str(e)}")
# 动态获取gas价格
try:
base_gas_price = w3.eth.gas_price
gas_price = int(base_gas_price * 1.1)
print(f"当前网络gas价格: {w3.from_wei(base_gas_price, 'gwei')} gwei, 使用gas价格: {w3.from_wei(gas_price, 'gwei')} gwei")
except Exception as e:
raise Exception(f"获取gas价格失败: {str(e)}")
# 构建交易
try:
tx = contract.functions.register(register_request).build_transaction({
'from': sender_address,
'value': price,
'gas': gas_limit,
'gasPrice': gas_price,
'nonce': nonce,
'chainId': 8453
})
except Exception as e:
raise Exception(f"构建交易失败: {str(e)}")
# 签名交易
try:
signed_tx = w3.eth.account.sign_transaction(tx, private_key)
except Exception as e:
raise Exception(f"签名交易失败: {str(e)}")
# 发送交易
try:
tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction)
print(f"交易已发送,交易哈希: {tx_hash.hex()}")
except Exception as e:
raise Exception(f"发送交易失败: {str(e)}")
# 等待交易确认
try:
tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
result = {
"tx_hash": tx_hash.hex(),
"status": "success" if tx_receipt.status == 1 else "failed",
"receipt": tx_receipt
}
if tx_receipt.status == 1:
print("交易成功!")
else:
print("交易失败!")
print(tx_receipt)
return result
except Exception as e:
raise Exception(f"等待交易确认失败: {str(e)}")
if __name__ == "__main__":
private_key=account['private_key']
name='yourensNAME'
result = register_with_contract(
private_key=private_key,
name=name,
duration=31557600,
reverse_record=True,
coin_types=[2147492101]
)


Share Dialog
Share Dialog
No comments yet