Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

用比原链(Bytom)实现信息上链

wzls3146
293 0 0
很多了解比原链的都知道,比原链是专注信息和数字资产在链上交互和流转的公链项目,信息上链不是比原链核心能力,所以并没有在钱包端做一个功能入口,但是比原链提供了相关的接口可以将一些信息写到链上去。& P9 y: y; ~0 |
那如何实现信息上链呢?使用特殊的Retire操作,这个操作可以进行销毁资产的操作,但因为其可以附带信息,所以就可以实现信息上链的功能。
; H; X" O/ J2 }请往下看,也用postman请求演示,然后用golang写了一个接口的demo, 在用golang代码实现之前,我们先要做一些准备工作。
( h( M8 |9 _( F5 y; ?
  • 首先确保自己在本地已经搭建好了比原的节点,如果你还没有搭建好节点,请参考开发文档:https://docs.bytom.io/mydoc_build_environment.cn.html
  • 确保自己账户是有足够BTM测试币,如果没有可以去比原链水龙头领取BTM测试币,领取地址:
    , d5 j. L' g: Q- i4 j% c
    3 O2 ~8 q, l, K, h% v; S
    http://test.blockmeta.com/faucet.php
    2 l7 v4 W# E4 {9 a. W- M
  • 发行自己的资产,参考:https://bbs.8btc.com/forum.php?mod=viewthread&tid=242940&extra=
  • 信息上链的本质就是其实就是创建并发送一笔交易,我们都知道通过api发起交易主要有三个步骤,先 build → sign → submit,分别对应的api是 build-transaction、sign-transaction、submit-transaction。用postman请求过程如下:" c! n8 s2 O, u$ i# }0 b9 L- t
      I* {5 A0 G9 `6 i
    请求build-transaction接口:
    7 S" v+ N* ^" w# o& h5 A1 H
    . X3 G, ^0 d2 U8 o请求参数:9 F9 E/ J' S2 Y+ }6 `6 a
    {
    , v. v; i7 q4 u+ }3 D; h, h"base_transaction": null,+ ~. j4 e; l$ R) I( P
    "actions": [{
    : T% m+ W$ R, U        "account_id": "0KTCS3R5G0A02",
    ' Y  F6 d3 a% n5 Q  T# D. ?  f        "amount": 10000000,
    : f! Y+ S+ b" z# f) v        "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
    9 \9 ~% T% R: Y* ?( ^$ o        "type": "spend_account"% c; V, e4 }  }/ u5 e* T! ^+ K2 W# ~
    }, {
    4 C/ L0 L) }8 d# `; @* Q/ s        "account_id": "0KTCS3R5G0A02",+ O6 _' j1 Z: B4 z' k, Q8 I
            "amount": 100,
    9 D3 _% I0 a' _$ O/ p        "asset_id": "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd",
    0 X7 D% L0 _0 Q6 G" j% s2 a        "type": "spend_account"
    . u0 j" ]4 A; I6 S6 I- N5 e}, {4 t/ }. i3 b& ?
            "account_id": "0KTCS3R5G0A02",8 \6 J* }& f" Q% m( X
            "amount": 100,
    0 s% I5 N( Y7 M" Y* O, }1 |( g: j        "asset_id": "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd",7 R: q- Z; O: [$ p% s" }: z  g
            "arbitrary": "77656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c",
    ( s2 f" H/ w) i0 j" Q+ q5 x        "type": "retire"
    3 O0 K. D! X: V6 T% d7 Z6 |}],4 u; [6 _. G$ r7 S! y0 w
    "ttl": 0,
    $ o4 F/ n; e7 D9 p3 i) Z% l"time_range": 1521625823! e) j8 L) V- x2 I$ e3 d6 z8 X
    }
    6 B- e# O, N4 ~: |6 d& J7 o请求sign-transaction接口:0 ]" P6 [4 I9 j- T% U
    % d# j1 O% t4 Z
    请求参数:
    % ?& r7 y; d+ j7 \7 V! W1 j: D{
    * P& n& ^" Z- N& `  m# t, X"password": "huangxinglong123",% u: z; _' C. \* Z5 x; [6 ]
    "transaction": {
    9 I+ g6 t' s. y2 h- u% ]        "allow_additional_actions": false,  @+ ]- ]7 F! i# \7 t8 A# j
            "local": true,
    2 l1 F2 d; Z) Z- [2 m3 p' N        "raw_transaction": "0701dfd5c8d505020160015e560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0989fe3020001160014adb6632c5b10c6d5b6f97b8d1250f6e409e11c0101000161015f560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd9cc5b191f3190101160014dcfd9b78c24260823e318153665d511d6c4ecb1b010003013dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0ebbcde02011600147a9baebd37dba3f14960624ed8e6ca3cc9d5f73800013e608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cdb8c4b191f31901160014f0370fdf7a7bec7b34cc62fd5291071a3dc3d9b0000147608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd6401246a2277656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c00",
    ! |5 h3 S: |: D% {        "signing_instructions": [{
    0 F& O( n4 u% \+ Q4 L  h7 _" A                "position": 0,
    2 q3 _0 [- r& d9 j& R8 S                "witness_components": [{& X; s# |! Y4 [( t8 O" L
                            "keys": [{  O6 Q7 |& |0 r" B" x
                                    "derivation_path": [6 [, Y* D& b. o4 }0 Y
                                            "0000002c",
    & |% L! Y+ E) a  n9 ~                                        "00000099"," i) A8 U: d7 c6 C- ]3 z, R! P  A
                                            "0100000000000000",1 T( D" b' S6 ^' C; `
                                            "0100000000000000",/ E* c  p, i" ]
                                            "4600000000000000"/ n& q" Q/ W- A; |
                                    ],6 O, Z- F2 W& X4 x: Z) {9 _/ p) E
                                    "xpub": "1c03161a08a4dbb7df153815a28f733fec1ac7579f954c4834e5ce9f0ad8deb260ecb2066a8623b69aa936f5798f4dcb9572bc476f2c8171953ce054d58a759f"
    ) S. l0 O% \9 t                        }],
    $ S7 T+ y" z* I# l6 g( H5 y' T                        "quorum": 1,4 F, w  H( [5 p$ [
                            "signatures": null,6 K! k- D- s1 V" h
                            "type": "raw_tx_signature"
    7 ~! H0 F2 a" t" Y+ E% g3 K7 G                }, {
    + W& l7 e+ `8 z. [& K* ]9 z, Y- ?                        "type": "data",7 ^& P/ j) k: }+ _. n, b. \
                            "value": "4f089176a5bca95ec9227b8a87dfec947c59453805bf46d3f5a18f8032255b5a"4 [" v. ?. d  N" I& B
                    }]
    3 e& O4 c* h6 Y: h* T. R4 k; Y/ U/ u        }, {7 \* i  r) X9 @
                    "position": 1,
    , I9 H+ J2 @% c$ P% F3 q                "witness_components": [{
    8 {+ K- c$ e/ ?) z2 m! _/ J6 q& V                        "keys": [{- @- X1 |, x+ {) Q
                                    "derivation_path": [
    0 v) c) P1 j! o' Y( Y+ T4 L                                        "0000002c",. e" c2 ~  o& Q
                                            "00000099",$ z5 |2 Q! t; Y1 b4 S& g
                                            "0100000000000000",0 i! `" u4 C: c& a
                                            "0100000000000000"," A% o# w$ B$ n1 }
                                            "4700000000000000"8 f, A/ p( G, M
                                    ],8 D6 l# I  v& A8 C5 t: o
                                    "xpub": "1c03161a08a4dbb7df153815a28f733fec1ac7579f954c4834e5ce9f0ad8deb260ecb2066a8623b69aa936f5798f4dcb9572bc476f2c8171953ce054d58a759f"; M; a6 X, \6 v
                            }],. U# N6 c9 ^5 B  f
                            "quorum": 1,- N% C: {" _, @7 f" y0 `- g5 {
                            "signatures": null,. s! @4 G$ d8 @/ y) N" v
                            "type": "raw_tx_signature"
    8 {9 H+ Q4 }( X( a8 H                }, {0 P# S2 i  o) w/ @4 {
                            "type": "data",* s1 |" F( ]- C$ L+ j7 h
                            "value": "67512f9250f559699e32c72c8af29096b1556af145f6ecc0c306e6acc88bbfaa"# q2 C9 G  L8 `6 y9 P) G
                    }]7 {1 E  f9 \- ~
            }]( h, W% d' y  B, [
    }( e% v& J0 g" s1 a+ c: p
    }2 S0 G) v9 w5 g: p' \  }1 P
    请求submit-transaction接口:
    * ]* R; b; f  Y1 F# g; z$ P  U' ]7 @
    请求参数:  k9 F: A2 e( j# V4 u: {
    {
    & I4 N7 ~5 Y% {6 n9 E# r% m4 k6 T3 T) m "raw_transaction": "0701dfd5c8d505020160015e560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0989fe3020001160014adb6632c5b10c6d5b6f97b8d1250f6e409e11c01630240c7004022db674ff2961b540d4edab846d550429ae9a92311ba375a4f452331422961fdcde3bf79631755dd12df409e24a849158d4aeab919cab81520fb7d1e02204f089176a5bca95ec9227b8a87dfec947c59453805bf46d3f5a18f8032255b5a0161015f560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd9cc5b191f3190101160014dcfd9b78c24260823e318153665d511d6c4ecb1b6302406b75ef5a9decfa31d4f5ae06e0fb14ca507ba4a03715874d1d831516945121573b9b858e4d7527d209c1f89f74e0aa4c4e38afd098cbadaff31b9107167099012067512f9250f559699e32c72c8af29096b1556af145f6ecc0c306e6acc88bbfaa03013dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0ebbcde02011600147a9baebd37dba3f14960624ed8e6ca3cc9d5f73800013e608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cdb8c4b191f31901160014f0370fdf7a7bec7b34cc62fd5291071a3dc3d9b0000147608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd6401246a2277656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c00"
    , Q7 J8 a: {$ E2 u/ U  M  V  }
    9 A; \4 N5 t# q响应参数:2 Z6 `5 {+ z3 S: M" h' B4 o
    {( s1 l2 X( R! Q" f. ?- s: a  P/ P
    "status": "success",
    % q  P5 n* S8 \6 S2 J# b+ E' N2 ~"data": {  t2 d, Q, f" J+ p9 z1 d$ x; J
        "tx_id": "5ef27b930646d468bbb436d3406972ff201aa63702518f777e31dd6a2147dddc"
    ) C$ E. Z% m4 x$ j) @& B$ m  }
    3 v/ ~' ?) T& r: t/ X3 `( P" Y. L}- G; l6 m/ x* ?/ a! A" T; |8 o3 D

    ) o8 c) Z3 v% F用上面返回的tx_id去比原的浏览器中去查看交易详情,就可以查看到我们上传的数据
    ! z9 ^5 a6 {2 R) [* M) w; y- m$ ^9 k1 A6 W
    参考代码:- X% K. n2 ^8 L+ c
    package main( ~% M5 \/ W( Q; S1 V8 m3 N
    import (# o: z9 H8 N" E- F
    "bytes"
    + M. D9 e6 u; C"encoding/json"
    + v$ a: ^9 J. r/ |"fmt"1 R' L0 V( e! U* t& |
    "io/ioutil"9 G* m5 Z6 }( H4 i- r; [
    "net/http"
    : Y+ f0 f  [! T; ?& d2 L3 R)
    6 a& @; s2 q5 n//build-transaction params
    3 n  u$ l/ _" X6 C8 U//https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction
    ' ?* s! c; s7 B" W4 }7 l) l4 ~3 @& Atype BytomAccount struct {: E1 v! g8 W# n% d  z, s# X) e
    AccountId string `json:"account_id"`
    # F( e/ v& O7 I9 x2 K% G' EAmount    int    `json:"amount"`8 ~& z5 O7 E, b/ [" Q
    AssetId   string `json:"asset_id"`' I( g8 V  p7 ^! r, O( z( T5 K
    //Arbitrary string `json:"arbitrary"`6 I1 @; i! r5 X1 A$ D
    Type string `json:"type"`, I3 t! U3 |8 g- ~. o
    }# h8 _+ n, |& B" j$ v
    type BytomAccount1 struct {# X2 t( g# O$ v; ]" j
    AccountId string `json:"account_id"`+ z) K/ e* [* I8 g$ }; M( x6 i+ j, L
    Amount    int    `json:"amount"`$ g2 c8 r1 n" X6 w$ G9 X
    AssetId   string `json:"asset_id"`
    5 N! T" P( J6 S2 Q$ z3 \7 C* r/ wArbitrary string `json:"arbitrary"`
    4 D' _4 O$ f# W4 qType      string `json:"type"`+ ~7 K# q: c! U- ^
    }  N+ b8 a2 \% U3 x: ]$ }" R
    type BaseTransaction struct{}9 M, O& f. x6 R+ V0 o
    type TransactionParams struct {
    : ?! o( ^6 H+ @+ }9 Y" c% RBaseTransaction *BaseTransaction `json:"base_transaction"`- Z: i1 B% D* A
    Actions         []interface{}    `json:"actions"`3 c' m! S9 W8 e0 n
    Ttl             int              `json:"ttl"`: X. e6 c7 x9 l' k$ Z" t- r
    TimeRange       int              `json:"time_range"`
    , s" w+ N, B6 K. y* F; c& L}
    ) U4 L+ B$ W7 B; |//sign-transaction params
    + Y& }" n1 \' g+ W, E+ C//https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction% k( f: G. T9 i1 D1 T4 F+ N
    type Transaction struct {
    % S$ t2 A4 i5 L6 ^. \}& k  x" E' I- |' p  `& k
    type SignParams struct {3 Z. q& r8 p: m% n7 U
    Password    string      `json:"password"`
    # \8 L, P# P3 t2 Y0 H% fTransaction Transaction `json:"transaction"`
    . _- F3 h+ o7 @3 X0 g( M}
    6 p; u+ D! e' n& l0 p5 g- p//submit-transaction: w2 L0 y! v+ H6 V6 V0 F
    //https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction. i1 _( O3 \0 B$ C- i
    type SubmitParams struct {
    & i! \: v; \  bRawTransaction string `json:"raw_transaction"`
    & i2 Y( b/ N& F0 e1 F8 ^}9 g3 B7 T+ R9 T/ [; W" y
    type SubmitResponse struct {8 }: B- y, F: }
    TxId string `json:"tx_id"`
    & J8 P7 H/ o, D}0 [5 v5 I, T  q, _" ^6 M# O8 L5 i  l
    func main() {
      M" N. P( l3 D3 w: Vaccount1, account2, account3 := BytomAccount{}, BytomAccount{}, BytomAccount1{}) V) m4 H9 J( v  s1 Y
    account1.AccountId = "0KTCS3R5G0A02"
    9 L3 h. r% l2 ~account1.Amount = 100000004 b) Y6 }5 \) e, }( ^7 ?9 |2 ?
    account1.AssetId = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
    8 A4 T; Q2 Z6 B% J# E% Baccount1.Type = "spend_account"' S" q, \4 q1 e5 n9 k
    account2.AccountId = "0KTCS3R5G0A02"
    , {) q. Z4 ]* Aaccount2.Amount = 100
    ; v6 n' [- g1 ]$ @# G& Z5 ?- Zaccount2.AssetId = "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd"
    9 _9 f5 b6 G4 r+ M  `; p  ~account2.Type = "spend_account"
    * e3 \& c6 @1 p% \! Caccount3.AccountId = "0KTCS3R5G0A02". H% a$ ~5 o% S
    account3.Amount = 1008 m* W. \: R( u8 p
    account3.AssetId = "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd"5 \6 b3 t4 _6 Q6 Z% C  n
    account3.Arbitrary = "77656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c"- n/ y) A9 }6 }  z2 z3 P* s
    account3.Type = "retire"
    ( P7 Y6 a) N2 m3 c0 S2 B9 `5 O  \//var array
    % U+ u  m& P% `8 `5 bvar actions []interface{}
    0 S% i3 p! u) H6 d7 p//append three params
    * ~9 B1 e3 s5 \6 b+ Narray_actions := append(actions, account1, account2, account3)- E8 T) x1 o  s! P
    transaction_params := &TransactionParams{}4 _& J: c6 O/ t+ K0 S+ C
    transaction_params.Actions = array_actions
    + d. q* ?2 ?  b) z+ A" n2 x" ~# Ftransaction_params.Ttl = 0+ O4 a1 w/ W; C# {, Q
    transaction_params.TimeRange = 1521625823
    $ {; b3 w. t; o. v& I6 J//本地测试网节点
    , w  x% n- X# m( o# m//build-transaction
    ! z; B5 _% s0 z0 J: o0 N( X' S4 n: k+ W- C& [port := "http://127.0.0.1:9888/build-transaction"
    , {: P" e( }& o' Ovalue, err := SendTransactionRetire(transaction_params, port)
    : Z9 ^: i- w6 f9 @1 n. E; ~  cif err != nil {
    + X7 f* H0 L- _2 N# n( ?        fmt.Println("err:", err)
    - c9 E$ f/ C* L: G2 s0 {; ^}# a  {( S' p, I3 w
    fmt.Println("build-transaction接口返回的参数:", value)
    # ]! q& q) q. ^//sign-transaction9 [7 q1 m4 l$ F. r# i" X8 U: m) L
    //...........# o! {$ }- l- s: C) P6 {1 v# ?
    //submit-transaction, q5 y! e5 Y. z2 v" B% _
    //.........../ \& ]3 h7 [; \0 [6 P  x
    }7 o7 j# b5 N5 P- `! t$ m
    //send post request8 J/ a& n: @' }( a8 S' \, j/ }
    func SendTransactionRetire(params *TransactionParams, port   string) (v interface{}, err error) {
      a# `1 L: @2 R//以本地测试网节点连接
    # E0 q+ o/ }9 rParamsStr, err := json.Marshal(params). a; t! Y) M9 H7 c, C+ m9 T1 F4 s
    if err != nil {
    / _; ?% m' |6 e, \/ k  u        return nil, err
    4 s  |. x6 E% {, ]" ^$ n& q7 a* G( V}4 N( u( o4 h8 A( v: H. I1 ~
    jsonStr := bytes.NewBuffer(ParamsStr)4 B8 M! }3 ~7 H2 S3 l0 X
    fmt.Println(jsonStr)& R- @2 l: ~# U. t  J
    req, err := http.NewRequest("POST", port, jsonStr)
    & L3 G1 I& M5 i; kreq.Header.Set("Content-Type", "application/json")$ c% ~3 i2 i$ x4 I1 r
    req.Header.Add("Accept", "application/json")4 ^, Y9 C) l0 }9 @% S
    client := &http.Client{}
    * N6 w; _/ D* I& B; Z! Cresp, err := client.Do(req)8 Q" ~2 g* [* _2 W# n) k
    if err != nil {
    7 I: B8 M3 J: o4 i! B& }  D        panic(err)/ y4 A) V: A4 C* z6 S) s
    }
    1 a+ i% G( q0 rdefer resp.Body.Close()
    6 ]$ o4 U$ i" g7 ~var bodyBytes []byte
    - D7 Q  b: U  Z7 N4 Cif resp.StatusCode == 200 {9 k1 N1 j7 f( o3 D3 y; ~# X
            bodyBytes, err = ioutil.ReadAll(resp.Body)8 {) v1 \2 H7 l0 z
            if err != nil {
    3 E8 f0 G. m# `# T                return nil, err
    . e7 ~7 J" [0 N" \        }3 Y5 u- c* g. n$ R' P) a! D, v2 M
    }
    / f0 s3 i8 t( `9 {0 j4 c/ {return string(bodyBytes), nil, Z/ n+ g% n1 F: V
    }# w1 `/ t6 G% J4 {3 g" `( m5 t
    上面的代码只是build-transaction一个步骤,另外sign-transaction和submit-transaction请求需要自己去组织参数进行请求。请求完submit-transaction 获得返回的交易hash,去区块链浏览器上查看自己的上链信息,区块链浏览器地址:http://52.82.46.157:8082/。
    + N3 K2 V# v* `& W# a9 L" f# L& Q* ?  g好了,通过以上的4个步骤,我们就可以借助比原链实现信息上链。如果你有什么疑问或者不明白,请在我们的社区联系我们,https://github.com/Bytom/bytom。
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    wzls3146 小学生
    • 粉丝

      0

    • 关注

      0

    • 主题

      1