Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

wzls3146
282 0 0
很多了解比原链的都知道,比原链是专注信息和数字资产在链上交互和流转的公链项目,信息上链不是比原链核心能力,所以并没有在钱包端做一个功能入口,但是比原链提供了相关的接口可以将一些信息写到链上去。
) [  f* j! c( K, \那如何实现信息上链呢?使用特殊的Retire操作,这个操作可以进行销毁资产的操作,但因为其可以附带信息,所以就可以实现信息上链的功能。
+ o1 O& Q# G& {; S0 v请往下看,也用postman请求演示,然后用golang写了一个接口的demo, 在用golang代码实现之前,我们先要做一些准备工作。0 ?! j5 Q$ {1 z1 ^! }' i3 [: D
  • 首先确保自己在本地已经搭建好了比原的节点,如果你还没有搭建好节点,请参考开发文档:https://docs.bytom.io/mydoc_build_environment.cn.html
  • 确保自己账户是有足够BTM测试币,如果没有可以去比原链水龙头领取BTM测试币,领取地址:! W8 s9 u" l1 U/ B" K0 ?
    4 \7 _0 u+ ~/ n. t
    http://test.blockmeta.com/faucet.php5 t6 J' S6 W2 L% R" H. g- g
  • 发行自己的资产,参考:https://bbs.8btc.com/forum.php?mod=viewthread&tid=242940&extra=
  • 信息上链的本质就是其实就是创建并发送一笔交易,我们都知道通过api发起交易主要有三个步骤,先 build → sign → submit,分别对应的api是 build-transaction、sign-transaction、submit-transaction。用postman请求过程如下:+ u4 J, ?& o+ _& z* {/ {$ ^; q
    0 N0 }8 F$ E( s( F2 M0 ]  R+ ~
    请求build-transaction接口:6 j  o" b$ n0 r% g

    ' j" i6 m( h0 I请求参数:
    4 I# E7 f0 q9 J+ U# v{
    0 r4 W! C* ^$ k' Z! v  h"base_transaction": null,! u0 }! j6 L1 J  l! B7 h" Y
    "actions": [{  o* A( ?/ P9 m8 N, }* W
            "account_id": "0KTCS3R5G0A02",. ~/ U# G1 ~$ ]# X% k' j
            "amount": 10000000,
    " o1 O: x+ K( Y- n        "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",6 }0 A0 s* Z. b  l1 q3 N
            "type": "spend_account"
    " M) z1 n, c9 h}, {3 K/ S* h8 z0 A: v1 j& Q1 K# L4 I
            "account_id": "0KTCS3R5G0A02",1 v8 l6 M; P% X( ~
            "amount": 100,3 q0 D- e! ?8 I$ v7 B/ i
            "asset_id": "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd",
    . A4 w, i2 ~2 [- q. h        "type": "spend_account"7 P: a5 A4 i( ?* I% `) C1 {
    }, {
    $ J+ q- P7 b; m# _7 c. @. b7 w/ i        "account_id": "0KTCS3R5G0A02",
    $ W  [6 c5 s  x- o) |" G2 o8 H' U        "amount": 100,
    ; |: D! f1 s5 c# c        "asset_id": "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd",( K9 s) F) R/ X4 u" a/ Q( M
            "arbitrary": "77656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c",6 _. J  \- @. o8 C. \* C! O5 ^" w+ Q
            "type": "retire"
    ; f4 }; z, X5 w3 @# g}],- B2 h$ @" f% v
    "ttl": 0,8 u2 K9 o9 _& x0 N* y/ K+ Z
    "time_range": 1521625823/ _& n5 x" o% ]0 i" F1 P
    }
    2 ^% i! b9 s$ y, u# F0 G; q请求sign-transaction接口:
    * g* X1 N4 I9 J9 ]
    " r, t& z7 M  t! |请求参数:
    , |6 p, \; S+ e( r* p$ a+ X{/ T- L5 A; I2 B6 @6 E5 ?; r
    "password": "huangxinglong123",  p" m+ {/ i6 `+ c0 H* e7 M* e
    "transaction": {6 [" q: O- |- j
            "allow_additional_actions": false,/ R: u3 t0 m$ c; E) D6 E; f! F- F: |
            "local": true,
    8 \/ k  U4 d: v( ], E/ s% Q        "raw_transaction": "0701dfd5c8d505020160015e560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0989fe3020001160014adb6632c5b10c6d5b6f97b8d1250f6e409e11c0101000161015f560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd9cc5b191f3190101160014dcfd9b78c24260823e318153665d511d6c4ecb1b010003013dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0ebbcde02011600147a9baebd37dba3f14960624ed8e6ca3cc9d5f73800013e608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cdb8c4b191f31901160014f0370fdf7a7bec7b34cc62fd5291071a3dc3d9b0000147608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd6401246a2277656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c00",
    # u0 u+ e3 _+ p* o4 ]0 m# X        "signing_instructions": [{
    ! n2 x( v/ v0 N* Z                "position": 0,2 K" K3 Y/ `6 m$ b7 v/ @
                    "witness_components": [{
    ( _( T+ e: y; n! O5 {6 M  D                        "keys": [{
    ; k4 A2 [7 P0 t; @0 F                                "derivation_path": [
    ! Y. H7 O0 o3 T/ l3 ^: }                                        "0000002c",
    ' H9 Z% p* q8 }( [                                        "00000099"," v% o) @7 o' e; P8 d2 s9 {7 Z
                                            "0100000000000000",
      z1 l! m1 @1 Z* R- R% p; a. b% `- ]                                        "0100000000000000",  B/ D" N) P) y0 i
                                            "4600000000000000"
    # e7 l9 n' ]' o9 g) B                                ],
    8 N0 d: J1 E" s5 q                                "xpub": "1c03161a08a4dbb7df153815a28f733fec1ac7579f954c4834e5ce9f0ad8deb260ecb2066a8623b69aa936f5798f4dcb9572bc476f2c8171953ce054d58a759f"
    , I# d  j8 H( @                        }],
    & |& R$ i% O7 ~( w8 O7 e                        "quorum": 1,
    + m* R. S% w) Q; l                        "signatures": null,
    & q, D% A8 r9 \- U( W# q                        "type": "raw_tx_signature"
    6 X! ^. y. {0 N- o+ [                }, {
    + h! Q/ I8 ~0 E8 M$ K, N7 ~                        "type": "data",& H2 K2 R6 ]7 x& p" t5 d
                            "value": "4f089176a5bca95ec9227b8a87dfec947c59453805bf46d3f5a18f8032255b5a"/ J% r  o9 B0 f
                    }]
    # t1 y2 w2 o: E2 }        }, {& e6 p0 W; C7 O1 {/ e# a# E% M0 V1 e
                    "position": 1,0 K$ {" B2 L8 U' j8 w
                    "witness_components": [{
    & U& p1 ?. I* M% \                        "keys": [{
    ) c# p, `) w, p5 T% o* A                                "derivation_path": [9 f# D6 P7 Q% x$ x' |2 O+ J
                                            "0000002c",
    ! g5 W) Y6 T4 F, H# ^                                        "00000099",
    % M* J6 M8 s0 Q; D& G                                        "0100000000000000",
    6 U6 B* u/ Y6 u# z2 [2 b$ ^                                        "0100000000000000",  }2 C& X1 r9 D! [& P) X
                                            "4700000000000000"
    6 K  Z( ^- l/ S7 }                                ],# T1 Y$ Y7 \. c# F
                                    "xpub": "1c03161a08a4dbb7df153815a28f733fec1ac7579f954c4834e5ce9f0ad8deb260ecb2066a8623b69aa936f5798f4dcb9572bc476f2c8171953ce054d58a759f"
    ( u/ x. K+ y) l# ~                        }],
    8 P, l- I& v% d- z$ z                        "quorum": 1,% U  ~+ Y, j6 ^' Z2 H
                            "signatures": null,
    5 r& ?. Y5 d" m* J* l0 d6 J                        "type": "raw_tx_signature"5 `% g* D# A& N+ t( i
                    }, {
    7 R- G- B: R* {                        "type": "data",
    6 j0 f% G" n3 L  a                        "value": "67512f9250f559699e32c72c8af29096b1556af145f6ecc0c306e6acc88bbfaa"
    6 Y. d  Y4 h8 o9 Y# k3 m* P1 p                }]/ W2 [# F6 E$ S6 m7 ~
            }]: Z% r1 [3 r' h% x; h8 Q
    }
    / z3 i5 ]# ]: Q' W+ l7 b& t8 X}4 ~/ y7 I+ T, p5 h  J
    请求submit-transaction接口:, }9 }. {3 K2 t( o: x3 |7 W
    * o% ^: Q- G7 z, L
    请求参数:# }- }7 ?" g0 ~7 s
    {4 A. r( s4 d! f0 V$ i$ S7 D
    "raw_transaction": "0701dfd5c8d505020160015e560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0989fe3020001160014adb6632c5b10c6d5b6f97b8d1250f6e409e11c01630240c7004022db674ff2961b540d4edab846d550429ae9a92311ba375a4f452331422961fdcde3bf79631755dd12df409e24a849158d4aeab919cab81520fb7d1e02204f089176a5bca95ec9227b8a87dfec947c59453805bf46d3f5a18f8032255b5a0161015f560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd9cc5b191f3190101160014dcfd9b78c24260823e318153665d511d6c4ecb1b6302406b75ef5a9decfa31d4f5ae06e0fb14ca507ba4a03715874d1d831516945121573b9b858e4d7527d209c1f89f74e0aa4c4e38afd098cbadaff31b9107167099012067512f9250f559699e32c72c8af29096b1556af145f6ecc0c306e6acc88bbfaa03013dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0ebbcde02011600147a9baebd37dba3f14960624ed8e6ca3cc9d5f73800013e608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cdb8c4b191f31901160014f0370fdf7a7bec7b34cc62fd5291071a3dc3d9b0000147608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd6401246a2277656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c00"
    5 _7 Z5 A* ~; j9 l8 j  }: i& T0 V7 Z$ N6 t& ?& l5 J. M
    响应参数:
    2 \" `& }1 H$ @  i {7 U4 J( _6 j* S% M7 _
    "status": "success",! {+ U1 t( k( r
    "data": {2 E8 T# W+ ^9 u" K2 }+ x. l
        "tx_id": "5ef27b930646d468bbb436d3406972ff201aa63702518f777e31dd6a2147dddc"7 ^6 F8 M; Y) p* \8 |
      }
    : I: o1 W3 K! q8 V( ]( ^}. Z' m5 L( h# r
    : ]# r2 Q2 R& s  A6 X# t1 S
    用上面返回的tx_id去比原的浏览器中去查看交易详情,就可以查看到我们上传的数据. c7 V: h; q/ a! M8 ^8 m
    2 V' s/ m6 M' j1 @7 b
    参考代码:
    6 h) |4 V3 ^. m) Y, f9 T) Gpackage main
    # J/ X, ]3 K1 Nimport (! i' t% H' `: J5 F, t% |
    "bytes", q$ O% b1 o% I
    "encoding/json"
    $ e4 o8 V3 z! ]; q% R"fmt"# k, L/ Y) v! T1 G$ m! A' t! R" M
    "io/ioutil"
    3 V2 e  E- _& u"net/http"
    9 x+ H) D. i7 `3 V)
    3 j; u$ v+ A% H: I7 J//build-transaction params
      j: ^+ u7 y( s* \! e5 j2 w//https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction
    / N( G* V7 d& Itype BytomAccount struct {
    * C- B; w- X+ O1 n$ iAccountId string `json:"account_id"`
    4 y6 a( z4 u9 J4 w, }Amount    int    `json:"amount"`; l# U' z/ i( l) K: J
    AssetId   string `json:"asset_id"`
    6 f5 F- {* u) ]//Arbitrary string `json:"arbitrary"`
    ( v' o1 w$ e8 OType string `json:"type"`. f, A' H0 l6 W+ G+ q- F' E
    }; ~9 X. F6 q: W: g7 G
    type BytomAccount1 struct {
    , x$ c2 V. p6 PAccountId string `json:"account_id"`
    3 a5 X$ J7 d: @7 @4 w& P; JAmount    int    `json:"amount"`
    % u- h  Y: x" f- oAssetId   string `json:"asset_id"`2 H$ P- i3 _) O  x
    Arbitrary string `json:"arbitrary"`
    # g! m6 i* R% n1 s" |Type      string `json:"type"`2 U5 x. B0 u9 l3 b' D' T4 }4 I
    }0 Y$ B7 f4 ~: S; J+ Y/ n
    type BaseTransaction struct{}2 K  _' g* |: K4 ~# A8 J
    type TransactionParams struct {
    , B0 B& k. f4 q+ S$ F; \BaseTransaction *BaseTransaction `json:"base_transaction"`$ C; D$ ^7 x$ K2 X* \
    Actions         []interface{}    `json:"actions"`# B. ]3 f8 V. O  `
    Ttl             int              `json:"ttl"`5 n0 h. Z5 R+ _  B
    TimeRange       int              `json:"time_range"`- m/ G9 A4 d# g
    }' I  c  g& Q# W8 `
    //sign-transaction params- I. e6 M0 z5 j! {
    //https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction" @4 S" l2 N1 h1 G
    type Transaction struct {' q- ~+ M. ^+ K% q
    }
    ' h! F/ H* m% x% E. P" ltype SignParams struct {
    $ P- ]& q9 O. B9 G3 }Password    string      `json:"password"`2 b) a4 R  I4 E1 ^$ A5 P0 X, y
    Transaction Transaction `json:"transaction"`
    - ~8 k/ E  `; T: u5 X! I3 J$ [+ @}! O1 {* R1 y3 O1 ~" Y+ t+ g
    //submit-transaction/ t' W4 u5 a* E7 e
    //https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction7 j: c' N9 C9 V9 J0 Y8 L/ M" d
    type SubmitParams struct {
    0 L  |" j3 ^( r) D: dRawTransaction string `json:"raw_transaction"`
    8 j" V5 k: H: u& {5 w: t% _}" `, N% `" U4 h/ w: X$ B6 L* {! C( q
    type SubmitResponse struct {
    ; l1 D  v) I( d+ aTxId string `json:"tx_id"`
    . W# W# b6 w8 @/ e( c# a- q( R}( M" r2 Z2 ^& X
    func main() {
    ( }# q$ {$ ~+ t. k% H. C: vaccount1, account2, account3 := BytomAccount{}, BytomAccount{}, BytomAccount1{}2 J" |! t$ N7 p6 `
    account1.AccountId = "0KTCS3R5G0A02"
    * c3 O% j4 Q, ]* O3 s& `account1.Amount = 10000000  {' y9 H8 u$ T" f6 G
    account1.AssetId = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
    . ~8 k: P8 M4 Z: Taccount1.Type = "spend_account"
    8 c0 b% W' Z% V5 ^  T3 waccount2.AccountId = "0KTCS3R5G0A02"
    # y- i, ~8 n$ h. taccount2.Amount = 1004 |; x& j. a: J5 ^( a
    account2.AssetId = "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd"0 H% H8 B0 J) W
    account2.Type = "spend_account", W& b0 [" ?/ F& [8 `
    account3.AccountId = "0KTCS3R5G0A02"; Y2 z% g* M* B" e
    account3.Amount = 100
    7 R: y5 r9 A0 Z+ a6 haccount3.AssetId = "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd"
    5 u+ r4 t, y' ~account3.Arbitrary = "77656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c"4 m9 O) P. W1 _7 {
    account3.Type = "retire"
    3 V) {! x' Z" R; _. {5 c//var array7 D1 ~# e$ S# \6 w) ?
    var actions []interface{}/ U& t$ s( ?, P# R  R! [
    //append three params( a2 y' N2 L7 `0 [0 o
    array_actions := append(actions, account1, account2, account3)
    8 j1 k: \1 Q2 a; Ctransaction_params := &TransactionParams{}, Z7 J. i# W7 q' Z- e6 _
    transaction_params.Actions = array_actions
    # I4 ^9 `  I5 }9 g7 Btransaction_params.Ttl = 0
    + E% m, A. k) O( H* Stransaction_params.TimeRange = 1521625823
    ! y* J1 @  J3 Q. y# z+ _//本地测试网节点
    ( F. N8 {' e* i- {5 Y" ?$ f! n# R- l//build-transaction
    1 k4 v; n1 f& W' d9 Q+ i$ B5 ~port := "http://127.0.0.1:9888/build-transaction"6 G! l1 V9 p7 U% q
    value, err := SendTransactionRetire(transaction_params, port)( x" n; s" {' f7 @. J
    if err != nil {
    / j; X7 r; j6 k: ^0 y3 @        fmt.Println("err:", err)
    # L5 p) ?8 b4 W2 M. T# N* t}7 j( h" U  O7 M& q
    fmt.Println("build-transaction接口返回的参数:", value)
    / `; B4 [8 {+ P# r8 g  L3 M2 P//sign-transaction
    9 l. u; K  M! |; |: A& s+ o& j//...........
    ( h: [4 e  u' C# j) e- c- ^//submit-transaction
    : o5 u7 {/ p/ c* w# t//...........2 ^& }# |4 s" S+ Y
    }
    : X8 X5 Y. a0 @  E4 i//send post request9 F# X1 m+ \6 }- o, n
    func SendTransactionRetire(params *TransactionParams, port   string) (v interface{}, err error) {4 v5 w% D  q% b$ R; P
    //以本地测试网节点连接$ T5 ]. K& V; k* {* o
    ParamsStr, err := json.Marshal(params)+ m! ~0 V* x2 A0 I* n8 r
    if err != nil {4 w1 l  O: x- x* Y* O
            return nil, err' r! @' \6 R: s0 Q. s& e, x: `
    }# S! o: I; t$ q" [$ O
    jsonStr := bytes.NewBuffer(ParamsStr)8 |) c& M- v9 c1 C2 s1 N% z6 S
    fmt.Println(jsonStr)
    / @  I5 _0 n6 \9 J+ [5 Lreq, err := http.NewRequest("POST", port, jsonStr)
    - y1 T- K" G) F$ u/ ?req.Header.Set("Content-Type", "application/json")
    5 N9 u% s. r# \, G9 r2 Wreq.Header.Add("Accept", "application/json")
    # M3 l4 c" k) `3 D7 g) p' kclient := &http.Client{}8 g3 p" ^& ~, p7 o' ^9 K
    resp, err := client.Do(req)
    3 ^) [! h* ~( \% @, zif err != nil {
    $ ?) d8 H+ g. @# w; J        panic(err)
    . W( c4 J: s; j  t4 }+ q( G}
    : n# @2 |8 w- I* q' udefer resp.Body.Close()& U( _2 i$ q9 b& J
    var bodyBytes []byte
    ) @1 C' B+ Z1 Y, ]& \if resp.StatusCode == 200 {
    ) N# c4 r. j/ j        bodyBytes, err = ioutil.ReadAll(resp.Body)
    & D5 F# m0 `8 i        if err != nil {" b. N. h" Z1 e$ T
                    return nil, err1 @+ v  V) N3 r
            }
    6 I( }1 L3 H& ?! d8 M}
    4 H; G& K; p  [/ c+ z9 d4 nreturn string(bodyBytes), nil( r; K! ?: V6 m! O
    }
    ( Z8 O2 ~9 W( S, Q  z上面的代码只是build-transaction一个步骤,另外sign-transaction和submit-transaction请求需要自己去组织参数进行请求。请求完submit-transaction 获得返回的交易hash,去区块链浏览器上查看自己的上链信息,区块链浏览器地址:http://52.82.46.157:8082/。
    ! k% v# X. j3 ~* a; C好了,通过以上的4个步骤,我们就可以借助比原链实现信息上链。如果你有什么疑问或者不明白,请在我们的社区联系我们,https://github.com/Bytom/bytom。
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    wzls3146 小学生
    • 粉丝

      0

    • 关注

      0

    • 主题

      1