Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

wzls3146
360 0 0
很多了解比原链的都知道,比原链是专注信息和数字资产在链上交互和流转的公链项目,信息上链不是比原链核心能力,所以并没有在钱包端做一个功能入口,但是比原链提供了相关的接口可以将一些信息写到链上去。, v% k3 N+ k& }: i+ ^* S
那如何实现信息上链呢?使用特殊的Retire操作,这个操作可以进行销毁资产的操作,但因为其可以附带信息,所以就可以实现信息上链的功能。+ [. j, f. m, m- Y# x1 o8 Z' q
请往下看,也用postman请求演示,然后用golang写了一个接口的demo, 在用golang代码实现之前,我们先要做一些准备工作。
& W1 _5 I) G& E$ H- J: F
  • 首先确保自己在本地已经搭建好了比原的节点,如果你还没有搭建好节点,请参考开发文档:https://docs.bytom.io/mydoc_build_environment.cn.html
  • 确保自己账户是有足够BTM测试币,如果没有可以去比原链水龙头领取BTM测试币,领取地址:
    $ p- w# f+ \6 F! P
    6 o* h) k+ U5 Y5 Q1 H$ z
    http://test.blockmeta.com/faucet.php4 C8 m* z+ ?. ?, F. s
  • 发行自己的资产,参考:https://bbs.8btc.com/forum.php?mod=viewthread&tid=242940&extra=
  • 信息上链的本质就是其实就是创建并发送一笔交易,我们都知道通过api发起交易主要有三个步骤,先 build → sign → submit,分别对应的api是 build-transaction、sign-transaction、submit-transaction。用postman请求过程如下:1 |9 p" U5 W. c( c7 s

    & E) F0 J  L0 E! s请求build-transaction接口:7 U4 ?9 ]4 s  B. L

    2 m) s' M3 T) D& E9 j) ^; U0 C请求参数:
    3 ^+ T0 E! _6 D% b1 \$ n- y) I{& [" d4 w+ o' G5 f! E
    "base_transaction": null,
    4 c; I/ a' _- S, q( ]- N"actions": [{
    4 D9 |% {( z" ~/ B( R) G0 I        "account_id": "0KTCS3R5G0A02",# l3 Q4 c" x' P; K# i0 C
            "amount": 10000000,
    ) u1 H1 P' \5 a0 ?3 x, n        "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
    # W$ g# \7 w' |( M: S0 _/ {) u        "type": "spend_account"% x$ N! B7 f5 |" M- m+ ?- A- V
    }, {
    # [# E/ J! h  K7 w: `6 T' t* H        "account_id": "0KTCS3R5G0A02",( L9 L5 \/ g. V' z8 p( m& D$ v
            "amount": 100,+ i, N# D2 V# D4 O, l
            "asset_id": "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd",
    ( |3 R; R/ d' R8 h3 y$ N3 x2 F* d        "type": "spend_account"
    - Q) [5 _8 {5 u6 }& @}, {$ z/ W6 R9 j6 x) Z
            "account_id": "0KTCS3R5G0A02",- m" b7 x9 w( n: H) L& @/ g; @) W) z3 D
            "amount": 100,% R2 \# ^$ a2 X. N, ]7 ?" Y
            "asset_id": "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd",- Z! v: K: F7 s; l: ^& T
            "arbitrary": "77656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c",/ N4 ^! l& D! S- M6 X
            "type": "retire"/ C7 a! N6 g: ?. D7 r
    }],3 G7 @" K% V+ d4 A$ `
    "ttl": 0,0 B+ Q# ]3 W% q  ]& D- g! g4 k
    "time_range": 1521625823; C2 Q# T, p4 o
    }7 I! j8 K# s0 w) F) }! o4 v! A
    请求sign-transaction接口:
    6 M" x0 s+ S% K* B; c: R4 I9 g3 Y3 U6 z' w3 o5 U' {7 K
    请求参数:
    1 V7 x( X' |2 G" [9 s9 X+ s8 M{
    , u/ K6 ~# o9 D: K, x+ I6 R"password": "huangxinglong123",
    4 e. a. M4 s  C5 l& {: t# C8 [7 Z"transaction": {" m6 ~# |' \* l
            "allow_additional_actions": false,# t! a/ Z/ I3 {: v2 F5 J( O
            "local": true,1 N* ]- i8 w) ]/ |
            "raw_transaction": "0701dfd5c8d505020160015e560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0989fe3020001160014adb6632c5b10c6d5b6f97b8d1250f6e409e11c0101000161015f560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd9cc5b191f3190101160014dcfd9b78c24260823e318153665d511d6c4ecb1b010003013dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0ebbcde02011600147a9baebd37dba3f14960624ed8e6ca3cc9d5f73800013e608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cdb8c4b191f31901160014f0370fdf7a7bec7b34cc62fd5291071a3dc3d9b0000147608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd6401246a2277656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c00",
    3 j5 d2 E3 J( H, X9 H" l9 @+ M        "signing_instructions": [{
    ! S4 f* Z5 A/ L, S. F  H                "position": 0,
    % F1 w) G9 C2 Z8 r" [' z$ k                "witness_components": [{# x. e& O3 b- b
                            "keys": [{
    $ o+ A- F  z- E& A5 d                                "derivation_path": [# H# I) n* w3 x! }  M7 F
                                            "0000002c",
    4 g' d+ {1 O5 q0 R" R7 I1 a                                        "00000099",4 i5 u/ e( x" u% x
                                            "0100000000000000",
    / P" n3 `& w- y5 Q) G! d* {                                        "0100000000000000",
    1 x% g) W. u; {0 ]6 v2 D                                        "4600000000000000"
    2 ~" }  @/ r* c3 A: {8 X                                ],
    - ]; @4 K% ]5 O/ X4 }+ g- Z! X5 h                                "xpub": "1c03161a08a4dbb7df153815a28f733fec1ac7579f954c4834e5ce9f0ad8deb260ecb2066a8623b69aa936f5798f4dcb9572bc476f2c8171953ce054d58a759f") o- u! W! f; k" A) Q% f: V( ]
                            }],2 c. Q: @  K# y. \- X" w- E7 V" M
                            "quorum": 1,% H* }4 b  i! V6 ?* T3 Z, _
                            "signatures": null,/ r: Y8 ?9 p$ l2 c4 z. L
                            "type": "raw_tx_signature"' O! ?2 I  }* L
                    }, {
    # o) N1 C" g& _0 p3 K                        "type": "data",
    ; x8 G* O( P7 m8 w( n                        "value": "4f089176a5bca95ec9227b8a87dfec947c59453805bf46d3f5a18f8032255b5a"! F1 k, r6 P; D" y7 Q8 ?& u
                    }]
    ( I0 P: A( H" C! K9 ^) J) T4 n        }, {% K( Z- C4 e3 y- d4 o
                    "position": 1,8 g" h1 c  k* h: b# a4 f' }" s
                    "witness_components": [{* b9 _! j) ?0 z
                            "keys": [{
    - j. N* n" a7 e) W' Q+ r4 W# Z                                "derivation_path": [
    1 Z4 q+ l, \6 S4 e- ?( g                                        "0000002c",7 j; X% c, [( p* h4 |
                                            "00000099",
    # W  c: b, j. j! l0 x& J3 |                                        "0100000000000000",
    & F) T% G1 ^" t( X) c                                        "0100000000000000",- C* u8 p4 j0 H5 d1 s/ E
                                            "4700000000000000"& h- T) h" r! @# L# x5 |# Y
                                    ],
    3 G0 A' W$ ~& f2 |3 B9 P- ~                                "xpub": "1c03161a08a4dbb7df153815a28f733fec1ac7579f954c4834e5ce9f0ad8deb260ecb2066a8623b69aa936f5798f4dcb9572bc476f2c8171953ce054d58a759f"2 h" w+ k  B) \% }( C# u
                            }],
    8 y) F- Z2 K$ X, B$ \                        "quorum": 1,
    6 {) X3 d* {5 L( r- W2 {# g                        "signatures": null,
    ( \% n! _& T$ w2 ~9 I0 \                        "type": "raw_tx_signature"# F: {5 e/ L$ w, y
                    }, {4 Q" P) C) G( O  Y5 y
                            "type": "data",
    * P) i+ n: P  T( C% }. t; {                        "value": "67512f9250f559699e32c72c8af29096b1556af145f6ecc0c306e6acc88bbfaa"
      z6 u0 r4 u3 S/ E                }]0 {! |1 J& B' F+ f  i0 k) D- i
            }]
    $ s( b1 o: @5 _}7 d6 H3 e  D: q4 d$ t6 j5 u/ {
    }
    # W( `! P  G! H* K, m请求submit-transaction接口:. f$ e) ]& T5 j& [- {
    6 ?1 @3 `) P7 H0 J9 N4 u
    请求参数:
    2 C) O4 I( ]# h: j. h) O! p+ @ {+ y: L2 Z; L; D6 D% E6 g
    "raw_transaction": "0701dfd5c8d505020160015e560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0989fe3020001160014adb6632c5b10c6d5b6f97b8d1250f6e409e11c01630240c7004022db674ff2961b540d4edab846d550429ae9a92311ba375a4f452331422961fdcde3bf79631755dd12df409e24a849158d4aeab919cab81520fb7d1e02204f089176a5bca95ec9227b8a87dfec947c59453805bf46d3f5a18f8032255b5a0161015f560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd9cc5b191f3190101160014dcfd9b78c24260823e318153665d511d6c4ecb1b6302406b75ef5a9decfa31d4f5ae06e0fb14ca507ba4a03715874d1d831516945121573b9b858e4d7527d209c1f89f74e0aa4c4e38afd098cbadaff31b9107167099012067512f9250f559699e32c72c8af29096b1556af145f6ecc0c306e6acc88bbfaa03013dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0ebbcde02011600147a9baebd37dba3f14960624ed8e6ca3cc9d5f73800013e608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cdb8c4b191f31901160014f0370fdf7a7bec7b34cc62fd5291071a3dc3d9b0000147608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd6401246a2277656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c00"2 c. @8 r: x9 |( Y9 W
      }. e7 Z7 Y$ [) a) \/ S
    响应参数:
    - w* @% M, t8 E6 y' B0 [ {
    ( A. P8 g, Z7 X+ y4 D# T"status": "success",
    0 x8 W6 v- k& N4 ?"data": {
    / j: R" l  }, O  ?    "tx_id": "5ef27b930646d468bbb436d3406972ff201aa63702518f777e31dd6a2147dddc"
    % M3 g1 ]0 \+ U  }7 r7 w# s( d. G' h
    }
    : @9 j* b4 l! J, d; d- X4 b: i3 m$ J9 u% E2 F. _* p
    用上面返回的tx_id去比原的浏览器中去查看交易详情,就可以查看到我们上传的数据
    - L% r; q6 e- b$ u5 `
    . k5 P! X5 T+ N9 u! n9 w' A- x* Q参考代码:6 |7 z" j) n( D) p
    package main
    + N. m1 ?/ O! Yimport (
    2 g' C3 {7 k3 F! {1 |"bytes"5 U; ]. l( Q. k1 f
    "encoding/json"
    " o* \  }: C2 p/ V  U6 x"fmt": D( |2 S* D" O
    "io/ioutil", V$ P" P) {4 t  ?
    "net/http"2 v+ S, E: p( F; d/ Y
    )0 k. ~+ z5 U. _) ~
    //build-transaction params. x# h( M% N! P& A
    //https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction! @1 b! ]' u5 V' I
    type BytomAccount struct {
    1 u* l6 H) x$ `: o4 c$ ?AccountId string `json:"account_id"`4 Z+ A/ \+ W3 p7 t! b% k
    Amount    int    `json:"amount"`
    5 m( D8 Q. P6 h1 |+ F2 G3 a. P" G- u# ?AssetId   string `json:"asset_id"`
    ; b( \+ _( l" j; K//Arbitrary string `json:"arbitrary"`- O9 f; B! G1 {* W$ Y
    Type string `json:"type"`
    3 |/ n8 E* n/ e6 j% o( @7 ]}, j- d+ I; [- s8 j3 l6 B4 {
    type BytomAccount1 struct {: G5 @+ X( y& j& n4 P
    AccountId string `json:"account_id"`7 Y0 i3 K' |1 \# [- f7 E
    Amount    int    `json:"amount"`
    $ N/ V2 y) ~: h+ W: c( uAssetId   string `json:"asset_id"`
    % ], H: k/ `/ E* {/ W& @Arbitrary string `json:"arbitrary"`
    + }0 W, L" X) X8 t; L7 m$ i$ bType      string `json:"type"`
    , R. x  }$ Q# N9 k: h5 y$ ^}
    2 b. c6 ?% a% }" p( s! ]type BaseTransaction struct{}
    % u- E$ C0 ]+ ~+ Jtype TransactionParams struct {2 F4 e  i0 q% n3 E, {
    BaseTransaction *BaseTransaction `json:"base_transaction"`
    9 t% I9 ]1 n7 V. H/ F" TActions         []interface{}    `json:"actions"`8 L" {" j$ S" g: o
    Ttl             int              `json:"ttl"`
    4 q; D7 S3 d; U7 h% z& f8 C; R7 dTimeRange       int              `json:"time_range"`* `2 v. W3 M" Y1 ?) g
    }
    + H  ]' K9 o  X# S1 c5 V//sign-transaction params
    9 D& N: U% z6 A) L$ P- {//https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction( R! V$ c3 t2 t( I8 h* t) n$ @
    type Transaction struct {- |" i) K8 U5 i! k. X
    }; l0 t% y. x- R8 H2 l" p0 ~8 W8 A, W  T
    type SignParams struct {- p# `7 F7 E/ i$ z/ S7 Y
    Password    string      `json:"password"`
    7 o9 b6 P$ P/ ?Transaction Transaction `json:"transaction"`& `* f3 j9 B( C# ^
    }( G  V3 ]5 `; M: _+ P
    //submit-transaction/ _1 B1 M; w8 H9 ~; B8 Q, l% d" W# l
    //https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction. B7 f+ ?; Q1 G  V; O) t7 x
    type SubmitParams struct {. {! m7 l/ e3 c; q7 `+ a  z' ^- i
    RawTransaction string `json:"raw_transaction"`! a0 Y" m# ?; O* G
    }
    + g" A* h1 ?  K: W  r' Ytype SubmitResponse struct {
    8 P2 X" x% \2 s$ ITxId string `json:"tx_id"`
    2 [( w7 D4 ]* M/ T/ s. N}
    6 m" E1 ]5 X6 B( Yfunc main() {7 N) x0 ]( v% A8 M& S
    account1, account2, account3 := BytomAccount{}, BytomAccount{}, BytomAccount1{}
    2 {, I- @0 @' K0 D$ H& \account1.AccountId = "0KTCS3R5G0A02"" D, J1 C" Y. i  T
    account1.Amount = 10000000
    . {- |( k7 u+ A' h! Xaccount1.AssetId = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
    3 N( L1 f, f5 v. z3 faccount1.Type = "spend_account"+ U' ^! y* k) i  F
    account2.AccountId = "0KTCS3R5G0A02"
      S# s) Z6 j% Z; }account2.Amount = 1008 C# y$ J4 }, _: j6 L6 n4 H& t
    account2.AssetId = "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd"5 f$ J' f6 K$ k( \2 h
    account2.Type = "spend_account"" L; Z, k& Z# w( T1 e8 B
    account3.AccountId = "0KTCS3R5G0A02"' q8 V, r+ m. S$ k- B
    account3.Amount = 1009 w9 G: B5 z# V5 W4 l2 r+ Y0 p
    account3.AssetId = "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd"
    . a, [. o- p$ c9 M! [0 Caccount3.Arbitrary = "77656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c"3 M& s- @$ ]# x% h
    account3.Type = "retire"
    3 |* ?/ c- u; F//var array
    5 W" |! m" ~! ~7 T  [var actions []interface{}
    * R$ X& V. e) Z4 M+ Y, o//append three params, e5 X- y# \: \. N& J8 l
    array_actions := append(actions, account1, account2, account3)7 n/ h. f- B; J2 F
    transaction_params := &TransactionParams{}! F5 x# c/ O: k: ?" x" J
    transaction_params.Actions = array_actions7 e" f9 t4 g9 T
    transaction_params.Ttl = 0
    % s+ {$ M0 I% j  n  p" mtransaction_params.TimeRange = 1521625823
    6 W$ q9 z" L, {: u, B//本地测试网节点
    / H8 G! @+ ?) B//build-transaction
    % F" l1 d0 |( ]; _* s' ?port := "http://127.0.0.1:9888/build-transaction"
    ( p* k" g/ W( `) g8 e& cvalue, err := SendTransactionRetire(transaction_params, port)4 U; V; n& b* X- h! P: ?6 R) h" m8 Z
    if err != nil {7 f# T& ~5 o* ~7 @
            fmt.Println("err:", err)! Y5 \' M  c8 S9 d
    }
    5 G  f5 R3 b( Q) S$ xfmt.Println("build-transaction接口返回的参数:", value)2 J" [- P4 l, X) N
    //sign-transaction# L1 b. c6 S# P5 }
    //...........
    ; `: x6 j. I6 X+ k, C# }$ n" L' A0 p6 Y//submit-transaction$ r+ _' i" e- u8 T2 n4 g
    //...........
    ' F9 k0 w/ v/ v5 c8 D2 @}: Q% e+ y# t) z6 h, V
    //send post request0 l9 x  I$ D( b  i, V# c/ h
    func SendTransactionRetire(params *TransactionParams, port   string) (v interface{}, err error) {
    8 O2 b2 N, n* C3 {0 d* I5 x- W, h//以本地测试网节点连接2 X4 k+ k+ F( E8 h
    ParamsStr, err := json.Marshal(params)
    ; L" Y9 _% j0 Z( k+ zif err != nil {4 m7 s. F9 A3 S
            return nil, err
    # g6 j4 ?8 I& \+ N}
    # n, I  \  C1 y& m3 h2 ljsonStr := bytes.NewBuffer(ParamsStr)' W* y, `8 Q) d
    fmt.Println(jsonStr)
    : L& Z! n# t3 q) z( freq, err := http.NewRequest("POST", port, jsonStr)+ f( X9 X7 q2 {& S0 R5 \' l
    req.Header.Set("Content-Type", "application/json")
    7 M. Q# x/ Y. G& f5 I6 C- E: Nreq.Header.Add("Accept", "application/json")6 {0 g+ H/ k+ c- ]# F
    client := &http.Client{}& H- P# R4 I' }  V% Z
    resp, err := client.Do(req)
    , z! d& D' ?9 W* jif err != nil {/ B# X1 Y# V1 o4 G6 {5 G
            panic(err)& B. [# z7 @, r& }3 k1 n
    }, p# l! C' T5 V; f
    defer resp.Body.Close()
    6 p, J5 w, W( _; _var bodyBytes []byte, t; ^8 G: D& j. _  U! O- j
    if resp.StatusCode == 200 {1 s, _+ L% l- b7 U. Q
            bodyBytes, err = ioutil.ReadAll(resp.Body)) c; Y5 f9 g7 d
            if err != nil {6 g6 {# S4 x; P5 ~- }& }6 Q* U
                    return nil, err2 S5 k4 Z0 d2 _$ C
            }& \4 D! v; M2 k7 g
    }
    . _8 l1 Z/ P0 E2 J/ Ereturn string(bodyBytes), nil4 S+ n) B) U) Y+ O
    }
    8 W5 `6 ^$ o5 @/ x% t0 E上面的代码只是build-transaction一个步骤,另外sign-transaction和submit-transaction请求需要自己去组织参数进行请求。请求完submit-transaction 获得返回的交易hash,去区块链浏览器上查看自己的上链信息,区块链浏览器地址:http://52.82.46.157:8082/。) P' D5 g: `/ u0 k3 F
    好了,通过以上的4个步骤,我们就可以借助比原链实现信息上链。如果你有什么疑问或者不明白,请在我们的社区联系我们,https://github.com/Bytom/bytom。
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    wzls3146 小学生
    • 粉丝

      0

    • 关注

      0

    • 主题

      1