BitClout API를 사용하여 BitClout에 게시하는 방법
단계 1: 거래 후 16진수 가져오기
2단계: 거래 기록 서명
3단계: 거래 제출.
첫 번째 단계와 세 번째 단계는 상당히 간단하지만 두 번째 단계는 많은 사람들이 완성하기 어렵다.이것이 바로 본문이 이 사람들에게 유용한 곳이다!귀하는 이 글은 귀하의 계정에서 댓글을 만드는 데만 사용됩니다.다른 사용자를 대표하여 게시물을 올릴 수 있는 서비스 (예: schedule post 또는 다른 것) 를 만들려고 시도할 수 없습니다.이 강좌는 코드에서 계정의seedHex를 사용할 것이기 때문에 테스트 계정을 사용해서 배우는 것도 권장합니다.다른 언어의 seedHex는 당신의 BitClout seed 짧은 말만큼 강력합니다.만약 누군가가 당신의seedHex를 방문할 수 있다면, 그들은 당신의 계좌로 어떤 일을 할 수 있습니다.만약 당신이 장기적으로 암호화 세계에 처해 있다면, 피드 단어 (또는 피드 16진법) 를 컴퓨터나 온라인 어느 곳에 저장할 위험을 알 수 있을 것이다.이것이 바로 네가 이 강좌를 배우기 위해 테스트 계정을 사용해야 하는 이유다. (내가 다시 한 번 말하지만.)
우리가 시작하기 전에, 나는 너희들에게 이 완전한 강좌는 파이톤으로 작성된 것이며, 너희들은 적어도 파이톤의 기초 지식을 익혀야 한다는 것을 알려주고 싶다.
거래 후 16진수 가져오기:
이 단계는 상당히 간단하다.
https://bitclout.com/api/v0/submit-post 포트에서 필요한post의transactionHex를 수집하기만 하면 됩니다.다음은python 함수입니다.post의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은 게시물을 게시하려는 계정의 공개 키를 가리키며, body은 게시물 내용의 문자열을 가리키며, imageURL은 목록 유형 변수로BitClout에 게시하고자 하는 이미지 URL을 저장하는 데 사용된다.영향력에서 top post 이미지를 사용하지 않으려면 imageURL을 []으로 전달할 수 있다.TransactionHex에 서명하려면 다음과 같이 하십시오.
가장 중요한 단계는 거래에 서명하는 것이다.하지만 등등, 거래에 서명하는 것은 무엇을 의미하는가?응, 당신은 한 계좌에서 거래를 하기 때문에 그것을 은행 계좌 거래로 연결할 수 있어. 그 중에는 반드시 은행 계좌 소유자의 서명이 있어야 해.이게 의미가 있나요?
서명 부분은 거래가 계좌 소유자 본인이 완성한 것이지 그 어떠한 도둑이 완성한 것이 아니라는 것을 확보하기 위한 것이다*.BitClout은 자체 ID 서비스를 개발하여 거래에 서명합니다.
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/> 개발 도구 > 애플리케이션 > 스토리지 > 로컬 스토리지 > https://identity.bitclout.com> 사용자 > 게시할 공개 키 선택 > seedHex주의: 영원히 누구와도 당신의 seedHex를 공유하지 마세요.공유 seedHex는 공유 seed 구문에 해당합니다.두 번째 인자
TransactionHex은 서명할 업무입니다.다른 한편, I은 상술한 코드를 만들지 않았지만, 나는 상술한 코드가 안전하다는 것을 확보할 수 있다!당신은 환매 협의 here을 볼 수 있습니다.
주의: 본 논문의 코드만 사용해야 하며, 본 논문에서 언급한 다른 환매 프로토콜의 코드를 사용해서는 안 됩니다.본고의 코드는 안전하고 귀하의 개인 정보(예를 들어seedHex)는 그 어떠한 제3자와 공유되지 않습니다.안전을 위해서, 당신은 반드시 코드
sign.py을 직접 보아야 합니다.서명 제출 후 거래:
세 번째이자 마지막 단계는 서명된postTransactionHex를 제출하는 것입니다.다음은
https://bitclout.com/api/v0/submit-transaction으로 업무를 제출하는python 코드입니다import requests
def submitTransaction(signedTransactionHex):
    payload= {
        "TransactionHex": signedTransactionHex
    }
    response = requests.post(
        "https://bitclout.com/api/v0/submit-transaction", json=payload)
    return response.status_code
submitTransaction 방법은 signedTransactionHex을 매개 변수로만 받아들인다.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에 메시지를 남기는 것을 잊지 마세요.당신도DevClout discord server에 가입하여BitClout에서 멋진 프로젝트를 구축하는 개발자와 채팅을 할 수 있습니다!우리는 너의 메아리를 매우 듣고 싶다.
Reference
이 문제에 관하여(BitClout API를 사용하여 BitClout에 게시하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/itsaditya/how-to-make-post-on-bitclout-using-bitclout-api-372n텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)