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.)