Рубрики
Без рубрики

Как сделать сообщение на BitClout с помощью BitClout API

Создание битлота не так просто. Если вы когда -либо использовали API Twitter (он же Tweepy) … Tagged с Bitclout, Python, API, Crypto.

Создание битлота не так просто. Если вы когда -либо использовали API Twitter (он же Tweepy), вы могли бы вспомнить, что твитт через API был действительно простым и удобным. Все, что вам нужно было сделать, это назвать предопределенные функции API Twitter. Это не так с BitClout. Если вам нужно сделать сообщение или какую -либо транзакцию (поскольку пост также является транзакцией), вам придется пройти 3 основных шага:

Шаг 1 : Получите пост транзакцию Гекс

Шаг 2 : Подписать гекс транзакции HEX

Шаг 3 : Отправить транзакцию.

В то время как шаг 1 и шаг 3 довольно прост, шаг 2 – это то, что многим людям трудно пройти. Здесь эта статья может пригодиться для этих людей! Вы должны отметить, что эта статья предназначена только для создания сообщения только из вашей учетной записи. Вы не должны пытаться создать какой -либо сервис (например, Post Post или что -то в этом роде), который будет делать публикацию от имени другого пользователя. Также рекомендуется использовать тестовую учетную запись для выполнения этого учебника, потому что вы будете использовать SEEDHEX вашей учетной записи в вашем коде. SEEDHEX На другом языке такая же мощная, как и ваша фраза Bitclout Seed. Если у кого -то есть доступ к вашему SEEDHEX Они могут делать что угодно с вашей учетной записью. Если вы находитесь в крипто -мире с долгого времени, вы можете знать риск хранения семян (или семян гекса) на компьютере или в любом месте онлайн. Вот почему вы должны использовать тестовую учетную запись, чтобы следовать этому уроку (я повторяю).

Прежде чем мы начнем, я хочу сообщить вам, что этот полный учебник находится в Python, и должно быть, вам следует чувствовать себя комфортно с основами Python, по крайней мере.

  1. Получение шестнадцатеричного шестигранника : Этот шаг достаточно прост. Все, что вам нужно, это собрать TransactionHex требуемого поста от https://bitclout.com/api/v0/submit-post конечная точка. Ниже приведена функция Python, которая возвращает TransactionHex для поста
import json
import requests

def getPostTransaction(publicKey, body, imageUrl): 

  header = {
        "content-type": "application/json"
    }

  payload= {"UpdaterPublicKeyBase58Check": publicKey,
    "PostHashHexToModify": "",
    "ParentStakeID": "",
    "Title": "",
    "BodyObj": {"Body": body, "ImageURLs": imageUrl},
    "RecloutedPostHashHex": "",
    "PostExtraData": {},
    "Sub": "",
    "IsHidden":  False,
    "MinFeeRateNanosPerKB": 1000}

  res = requests.post(
        "https://bitclout.com/api/v0/submit-post", json=payload, headers=header)

  resJson = res.json()
  transactionHex = resJson["TransactionHex"]
  return transactionHex

В приведенном выше фрагменте кода, PublicKey относится к открытому ключу учетной записи, через которую вы хотите сделать пост, тело это строка, относящаяся к контенту Post и Imageurl это переменная типа списка, в которой хранится URL -адреса изображения, которые вы хотите опубликовать на BitClout. Вы можете пройти Imageurl к [] Если вы не хотите в своем влиянии на топ -карт (влияние на BitClout, так как твит в Твиттере)

  1. Подписание TransactionHex : Следующий и самый важный шаг – подписать транзакцию. Но подождите, что означает подписание транзакции? Что ж, вы совершаете транзакцию со счета, чтобы вы могли рассказать о ней как с транзакцией банковского счета, где должна быть подпись владельца банковского счета. Это имеет смысл? Часть подписи состоит в том, чтобы убедиться, что транзакция осуществляется от самого владельца учетной записи, а не от какого -либо вор *. BitClout разработала свою собственную службу идентификации, которая используется для подписи транзакции.

Есть сторонние API -интерфейсы, такие как API, такие как это Но, как говорит сам автор API, что у API могут быть уязвимости, которые могут быть нарушением безопасности вашей учетной записи, вы не должны использовать вышеупомянутый API, чтобы подписать транзакцию. Но не волнуйтесь, есть и другие способы подписать транзакцию!

TransactionHex может быть подписан без использования идентификационной службы. Ниже приведен сценарий Python, который может подписать TransactionHex за несколько миллисекунд! Создайте новый файл Python sign.py который содержит следующий сценарий:

import hashlib
import hmac

def get_hmac(key, data):
    return hmac.new(key, data, hashlib.sha256).digest()

def hmac_drbg(entropy, string):
    material = entropy + string
    K = b"\x00" * 32
    V = b"\x01" * 32

    K = get_hmac(K, V + b"\x00" + material)
    V = get_hmac(K, V)
    K = get_hmac(K, V + b"\x01" + material)
    V = get_hmac(K, V)

    temp = b""
    while len(temp) < 32:
        V = get_hmac(K, V)
        temp += V

    return temp[:32]

#######

g=(0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798,
    0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8)
p=0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141

def point_add(point1, point2):
    # Returns the result of point1 + point2 according to the group law.
    if point1 is None:
        return point2
    if point2 is None:
        return point1

    x1, y1 = point1
    x2, y2 = point2

    if x1 == x2 and y1 != y2:
        return None

    if x1 == x2:
        m = (3 * x1 * x1) * pow(2 * y1, -1, p)
    else:
        m = (y1 - y2) * pow(x1 - x2, -1, p)

    x3 = m * m - x1 - x2
    y3 = y1 + m * (x3 - x1)
    result = (x3 % p, -y3 % p)

    return result

def scalar_mult(k, point):
    # Returns k * point computed using the double and point_add algorithm.
    result = None
    addend = point

    while k:
        if k & 1:
            # Add.
            result = point_add(result, addend)
        # Double.
        addend = point_add(addend, addend)
        k >>= 1

    return result

#######

def to_DER(r, s): # Signature to DER format
    r = bytes.fromhex(r)
    s = bytes.fromhex(s)
    if r[0] > 0x80:
        r = bytes.fromhex("00")+r
    if s[0] > 0x80:
        s = bytes.fromhex("00")+s
    res = bytes.fromhex("02"+hex(len(r))[2:]) + r + bytes.fromhex("02"+hex(len(s))[2:]) + s
    res = bytes.fromhex("30"+hex(len(res))[2:]) + res

    return res.hex()



def Sign_Transaction(seedHex, TransactionHex):
    s256 = hashlib.sha256(hashlib.sha256(bytes.fromhex(TransactionHex)).digest()).digest()
    drbg = hmac_drbg(entropy=bytes.fromhex(seedHex), string=s256)
    k = int.from_bytes(drbg, 'big')
    kp = scalar_mult(k, g)
    kpX = kp[0]
    r = kpX % n
    s = pow(k, -1, n) * (r * int(seedHex, 16)+int(s256.hex(), 16))
    s = s % n
    signature = to_DER(hex(r)[2:].zfill(64), hex(s)[2:].zfill(64))
    signed_transaction = TransactionHex[:-2] + hex(len(bytearray.fromhex(signature)))[2:] + signature

    return signed_transaction

Метод Sign_transaction (SeedHex, TransactionHex) принимает SeedHex и TransactionHex как два аргумента. Вы можете найти SeedHex вашей учетной записи в хранилище браузера. Просто открыта https://bitclout.com/ > Dev Tools> Приложение> Хранение> Локальное хранилище> https://identity.bitclout.com > Пользователи> Выберите открытый ключ, с помощью которого вы хотите опубликовать> SEEDHEX

ПРИМЕЧАНИЕ. Никогда не делитесь своим SeedHex с кем -либо. Совместное использование SeedHex эквивалентно обмену семенной фразой

Второй аргумент TransactionHex это транзакция, которую вы хотите подписать.

На боковом примечании Я Не создал приведенный выше код, но я могу убедиться, что приведенный выше код защищен! Вы можете проверить репо Здесь Анкет Примечание : Вы должны использовать только код этой статьи, а не из любого другого репо, упомянутого в этой статье. Код в этой статье безопасен, и ни одна из вашей личной информации, как SEEDHEX делится с любой третьей стороной. Находясь на безопасной стороне, вы должны просмотреть код sign.py самостоятельно.

  1. Отправка подписанной почтовой транзакции : Третий и последний шаг – отправить подписанный Post TransactionHex. Ниже приведен код Python, который подчиняется транзакции с использованием https://bitclout.com/api/v0/submit-transaction
import requests

def submitTransaction(signedTransactionHex):
    payload= {
        "TransactionHex": signedTransactionHex
    }
    response = requests.post(
        "https://bitclout.com/api/v0/submit-transaction", json=payload)

    return response.status_code

Отправить транзакцию Метод требует только SignedTransactionHex как аргумент.

Это то, что 3 необходимых шага должны сделать пост на Bitclout. Подводя сумму вышеуказанных 3 шагов, ниже приведен 100% рабочий код.

import os
import requests
import json
import hashlib
import hmac


def getPostTransaction(publicKey, body, imageUrl): 

  header = {
        "content-type": "application/json"
    }

  payload= {"UpdaterPublicKeyBase58Check": publicKey,
    "PostHashHexToModify": "",
    "ParentStakeID": "",
    "Title": "",
    "BodyObj": {"Body": body, "ImageURLs": imageUrl},
    "RecloutedPostHashHex": "",
    "PostExtraData": {},
    "Sub": "",
    "IsHidden":  False,
    "MinFeeRateNanosPerKB": 1000}

  res = requests.post(
        "https://bitclout.com/api/v0/submit-post", json=payload, headers=header)

  resJson = res.json()
  transactionHex = resJson["TransactionHex"]
  return transactionHex


def get_hmac(key, data):
    return hmac.new(key, data, hashlib.sha256).digest()

def hmac_drbg(entropy, string):
    material = entropy + string
    K = b"\x00" * 32
    V = b"\x01" * 32

    K = get_hmac(K, V + b"\x00" + material)
    V = get_hmac(K, V)
    K = get_hmac(K, V + b"\x01" + material)
    V = get_hmac(K, V)

    temp = b""
    while len(temp) < 32:
        V = get_hmac(K, V)
        temp += V

    return temp[:32]

#######

g=(0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798,
    0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8)
p=0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141

def point_add(point1, point2):
    # Returns the result of point1 + point2 according to the group law.
    if point1 is None:
        return point2
    if point2 is None:
        return point1

    x1, y1 = point1
    x2, y2 = point2

    if x1 == x2 and y1 != y2:
        return None

    if x1 == x2:
        m = (3 * x1 * x1) * pow(2 * y1, -1, p)
    else:
        m = (y1 - y2) * pow(x1 - x2, -1, p)

    x3 = m * m - x1 - x2
    y3 = y1 + m * (x3 - x1)
    result = (x3 % p, -y3 % p)

    return result

def scalar_mult(k, point):
    # Returns k * point computed using the double and point_add algorithm.
    result = None
    addend = point

    while k:
        if k & 1:
            # Add.
            result = point_add(result, addend)
        # Double.
        addend = point_add(addend, addend)
        k >>= 1

    return result

#######

def to_DER(r, s): # Signature to DER format
    r = bytes.fromhex(r)
    s = bytes.fromhex(s)
    if r[0] > 0x80:
        r = bytes.fromhex("00")+r
    if s[0] > 0x80:
        s = bytes.fromhex("00")+s
    res = bytes.fromhex("02"+hex(len(r))[2:]) + r + bytes.fromhex("02"+hex(len(s))[2:]) + s
    res = bytes.fromhex("30"+hex(len(res))[2:]) + res

    return res.hex()



def Sign_Transaction(seedHex, TransactionHex):
    s256 = hashlib.sha256(hashlib.sha256(bytes.fromhex(TransactionHex)).digest()).digest()
    drbg = hmac_drbg(entropy=bytes.fromhex(seedHex), string=s256)
    k = int.from_bytes(drbg, 'big')
    kp = scalar_mult(k, g)
    kpX = kp[0]
    r = kpX % n
    s = pow(k, -1, n) * (r * int(seedHex, 16)+int(s256.hex(), 16))
    s = s % n
    signature = to_DER(hex(r)[2:].zfill(64), hex(s)[2:].zfill(64))
    signed_transaction = TransactionHex[:-2] + hex(len(bytearray.fromhex(signature)))[2:] + signature

    return signed_transaction


def submitTransaction(signedTransactionHex):
    payload= {
        "TransactionHex": signedTransactionHex
    }
    response = requests.post(
        "https://bitclout.com/api/v0/submit-transaction", json=payload)

    return response.status_code



if __name__ == "__main__":
  postBody = "In retrospect, it was inevitable 💎🤲 " #don't dare change this body, Diamondhands won't like you
  imageURL = []
  seedHex = "YOUR_SEED_HEX"  # It is recommended to store your seedHex as environment variable
  publicKey = "YOUR_PUBLIC_KEY" 

  postTxn = getPostTransaction(publicKey, postBody, imageURL)
  signedTxn = Sign_Transaction(seedHex,postTxn)
  status = submitTransaction(signedTxn)

  if status == 200:
    print("Post done!")
  else:
    print("Error " + str(status))

Ниже приведен результат приведенного выше кода:

Поздравляю! Вы сделали пост на BitClout через свой код.

Если вам нравится статья, не забудьте сообщить нам об этом в комментариях или, возможно, выкрикивайте Devsclout ? Вы также можете присоединиться к DevsClout Discord Server Поговорить с большим количеством разработчиков, которые строят потрясающие проекты на Bitclout! Мы хотели бы услышать от вас!

Оригинал: “https://dev.to/itsaditya/how-to-make-post-on-bitclout-using-bitclout-api-372n”