Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

wzls3146
266 0 0
很多了解比原链的都知道,比原链是专注信息和数字资产在链上交互和流转的公链项目,信息上链不是比原链核心能力,所以并没有在钱包端做一个功能入口,但是比原链提供了相关的接口可以将一些信息写到链上去。
9 B4 ~% e+ b/ l' T4 f% c那如何实现信息上链呢?使用特殊的Retire操作,这个操作可以进行销毁资产的操作,但因为其可以附带信息,所以就可以实现信息上链的功能。  m, Z8 ]6 i3 Y- r
请往下看,也用postman请求演示,然后用golang写了一个接口的demo, 在用golang代码实现之前,我们先要做一些准备工作。2 r- D' F8 a3 ]% u* v
  • 首先确保自己在本地已经搭建好了比原的节点,如果你还没有搭建好节点,请参考开发文档:https://docs.bytom.io/mydoc_build_environment.cn.html
  • 确保自己账户是有足够BTM测试币,如果没有可以去比原链水龙头领取BTM测试币,领取地址:
    ( d$ e% d0 G/ H  h
    ( V2 A  P" R; X- z( K
    http://test.blockmeta.com/faucet.php! p1 u9 _# k! z
  • 发行自己的资产,参考:https://bbs.8btc.com/forum.php?mod=viewthread&tid=242940&extra=
  • 信息上链的本质就是其实就是创建并发送一笔交易,我们都知道通过api发起交易主要有三个步骤,先 build → sign → submit,分别对应的api是 build-transaction、sign-transaction、submit-transaction。用postman请求过程如下:
    ; f& I5 {" {: }% M. J( j/ c$ K
    . V, f0 x0 u  E! o* ^
    请求build-transaction接口:$ }& j% H0 I% ~) ]5 z$ }0 Y7 b# b* B
    % U  e$ u3 m' f2 T* j
    请求参数:4 v- S$ d  y; q3 q
    {5 m! s8 z( w: e) ?6 p1 e
    "base_transaction": null,, z& `7 W0 i/ [+ y5 ?2 ~0 ?' L
    "actions": [{( k* D0 o$ S6 p6 E
            "account_id": "0KTCS3R5G0A02",
    6 \1 [/ F. E2 p5 }3 F* ~! t# C        "amount": 10000000,
    - ~8 v2 ]7 _9 v2 W: x. x' j& L        "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",/ v' [5 D# e  `& }/ }3 x& U
            "type": "spend_account"
    0 x( ~8 ~4 S% `# r1 ]- h4 [+ I% Q}, {
    / e& `$ P4 {7 n7 Z/ ^3 @        "account_id": "0KTCS3R5G0A02",: K/ H  C& h) f  s
            "amount": 100,
    % N- y( D$ O# N2 x9 E; ]% D        "asset_id": "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd",. m. c) e5 V4 }
            "type": "spend_account"
    % k) Q# n! G7 N3 e" D4 Y* D. u}, {
    / J; R  H4 ^8 e$ o. I        "account_id": "0KTCS3R5G0A02",  ?, l) r( o; ]" \- {
            "amount": 100,8 }' G$ x  |  d9 s# O0 I1 Y
            "asset_id": "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd",
    0 k! D3 U1 b5 L# x$ R        "arbitrary": "77656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c",
    * J: y5 ~+ I5 [        "type": "retire"/ t! l9 b9 l4 B& S. R5 A5 }  ]
    }],/ B* k; M9 x8 g  Q: S; Q9 K$ {
    "ttl": 0,- t4 f7 k% ~( H$ Y$ \
    "time_range": 15216258236 U! ^: A& |! [% u3 b# s& {/ s
    }$ {8 f- H5 q$ X" p
    请求sign-transaction接口:
    5 O6 D; v" h/ X8 b# F1 m; o: m3 {+ A, O3 Y
    请求参数:: @8 t, K6 S, k0 W. r/ v* f
    {
    ; ^$ D. b, }* [2 b* Y! I"password": "huangxinglong123",
    : h& B( ~! p1 o- ~8 H8 r4 ]"transaction": {
    . n' K; ]4 Q$ ]- l        "allow_additional_actions": false,3 T5 M& N; K1 P  o  ~& H6 A
            "local": true,  f- y% W9 Q3 [+ c5 \3 ?
            "raw_transaction": "0701dfd5c8d505020160015e560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0989fe3020001160014adb6632c5b10c6d5b6f97b8d1250f6e409e11c0101000161015f560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd9cc5b191f3190101160014dcfd9b78c24260823e318153665d511d6c4ecb1b010003013dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0ebbcde02011600147a9baebd37dba3f14960624ed8e6ca3cc9d5f73800013e608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cdb8c4b191f31901160014f0370fdf7a7bec7b34cc62fd5291071a3dc3d9b0000147608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd6401246a2277656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c00",* t/ S" ^  X% X& U; Z$ {
            "signing_instructions": [{1 v' e% p1 T9 s2 V* t# {
                    "position": 0,7 d, L1 p+ x4 ?  d' L, h3 h7 F
                    "witness_components": [{
    - _6 h1 X  u2 [                        "keys": [{* y8 _/ A. A' W3 x- {
                                    "derivation_path": [
    ( f, s5 x% O8 t; G                                        "0000002c",
    * s! {1 G" g/ g  \& b3 L7 O                                        "00000099",+ Z, A2 n" e9 E3 z; C, j+ Y5 Y
                                            "0100000000000000",
    / F: s5 ]) e/ k' t8 G                                        "0100000000000000",
    ' \1 e' A. k$ C                                        "4600000000000000"* \* H' f' \4 x6 ~/ W
                                    ],# L8 W& h& r1 R3 r6 B9 [3 Z- ?
                                    "xpub": "1c03161a08a4dbb7df153815a28f733fec1ac7579f954c4834e5ce9f0ad8deb260ecb2066a8623b69aa936f5798f4dcb9572bc476f2c8171953ce054d58a759f"
    3 l9 ]+ L% P0 \% |                        }],- M& n; d# f0 B' ]4 ~9 @8 E
                            "quorum": 1,$ U0 T" @8 C+ H9 M
                            "signatures": null,. S' `8 Z8 Y  U# Y, g, a
                            "type": "raw_tx_signature": j" x# F* t" S+ I/ \) O
                    }, {0 |; c/ [- l% ]" n
                            "type": "data",
    $ B* G/ ?/ p+ z: s. a! ]/ H: w                        "value": "4f089176a5bca95ec9227b8a87dfec947c59453805bf46d3f5a18f8032255b5a"
    8 x8 H& e$ R( ~                }]3 W' {. J) |9 R; ~+ ~" e
            }, {5 `  v( x5 ^0 c% H( N
                    "position": 1,* ]1 b9 u# C" ^- O: K
                    "witness_components": [{$ ]) r! _* g1 G2 O' S3 D: h1 l
                            "keys": [{0 {! t1 J% y$ w0 C6 @+ \5 n
                                    "derivation_path": [6 A' K( j$ a5 w, ~' j
                                            "0000002c",9 j: s8 V" s- m0 r
                                            "00000099",
    + v9 r+ g) |- w% K4 _9 s  [9 B5 F                                        "0100000000000000",
    ( l# `/ k+ H+ ^                                        "0100000000000000",
    0 c4 h# c7 N6 `                                        "4700000000000000"
    6 M5 e  G7 S7 H; i5 i2 n                                ],
    6 _4 m! ^+ I; M9 t/ e                                "xpub": "1c03161a08a4dbb7df153815a28f733fec1ac7579f954c4834e5ce9f0ad8deb260ecb2066a8623b69aa936f5798f4dcb9572bc476f2c8171953ce054d58a759f". j" p6 s5 ]* F+ F* p* x8 R: m
                            }],
    . V" Q* b0 g# J9 v                        "quorum": 1,6 S" t' U0 J; c3 h% Z1 t. O- O
                            "signatures": null,' u! [- i/ @* M, H1 }5 P: S0 P
                            "type": "raw_tx_signature"- N( \' b3 X3 e+ I6 Z3 o- S2 o! L
                    }, {
    ( w) S! C" o( G! ~                        "type": "data",
    % `# [% F2 C8 b                        "value": "67512f9250f559699e32c72c8af29096b1556af145f6ecc0c306e6acc88bbfaa". y9 V* P; }7 E
                    }]
    . i+ |( \4 _8 Q. \        }], k; n: }9 {' c. E* S3 i4 H
    }
    * C2 f5 F, {5 j/ W( q+ G9 Z}% z/ n+ ^( o/ V4 }9 K& ^
    请求submit-transaction接口:& W. O( n( k( g% e/ Q' w

    . l+ Z0 J; }1 i; Y. q请求参数:
    , z! P  x, {0 g( o( ]8 X  S {
    ( O. ~' e+ K! a/ i- c8 O "raw_transaction": "0701dfd5c8d505020160015e560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0989fe3020001160014adb6632c5b10c6d5b6f97b8d1250f6e409e11c01630240c7004022db674ff2961b540d4edab846d550429ae9a92311ba375a4f452331422961fdcde3bf79631755dd12df409e24a849158d4aeab919cab81520fb7d1e02204f089176a5bca95ec9227b8a87dfec947c59453805bf46d3f5a18f8032255b5a0161015f560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd9cc5b191f3190101160014dcfd9b78c24260823e318153665d511d6c4ecb1b6302406b75ef5a9decfa31d4f5ae06e0fb14ca507ba4a03715874d1d831516945121573b9b858e4d7527d209c1f89f74e0aa4c4e38afd098cbadaff31b9107167099012067512f9250f559699e32c72c8af29096b1556af145f6ecc0c306e6acc88bbfaa03013dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0ebbcde02011600147a9baebd37dba3f14960624ed8e6ca3cc9d5f73800013e608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cdb8c4b191f31901160014f0370fdf7a7bec7b34cc62fd5291071a3dc3d9b0000147608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd6401246a2277656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c00"
    2 ~* j, [3 A7 c6 T3 O# {  }
    ) Y  S: r" q( n/ l3 j0 k" o3 R; Q. {响应参数:
    % ?$ ^  ?) R0 c( ]; o# Q) S  R {# D: e5 ?- S2 ^! W, s
    "status": "success",5 X& A/ I1 m. Y, Q. \
    "data": {5 }2 P. w3 h% f/ l
        "tx_id": "5ef27b930646d468bbb436d3406972ff201aa63702518f777e31dd6a2147dddc"
    6 R/ Z- ~' n3 [' Z: B  }2 u( x% p& t# m' S3 _8 z2 Z
    }
    $ N8 z5 H  N; A# I! \
    2 g. p, p0 d5 D: e" `用上面返回的tx_id去比原的浏览器中去查看交易详情,就可以查看到我们上传的数据/ C' q8 i/ Z! G: I- o
    3 ]& |  h8 G3 }& b
    参考代码:
    - G; N4 I. O- M9 G8 r) ]package main
    " X$ {1 `/ B4 a- l- rimport (
    & f6 b) o( `7 B" A' S5 I"bytes"
    6 ^* X" z2 s5 i! a5 {9 Q5 v  w( S"encoding/json"; o$ \+ I2 \8 ^+ r* R6 I
    "fmt"# p( {8 S7 j$ X7 n5 B( X
    "io/ioutil"
    5 K: b# f6 @) a0 y6 `* `: p"net/http"
    7 C; `$ T4 s6 L1 E% T# |. d)1 n9 @5 W* j' h/ g  d
    //build-transaction params
    ( v. k( c- L; D( U0 m//https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction  D0 ~7 }( t" j1 p7 H
    type BytomAccount struct {: y9 q+ f  t1 a' e
    AccountId string `json:"account_id"`
    " [+ G) z- J! T& a5 ]) jAmount    int    `json:"amount"`1 g0 h8 q1 d: Y7 e6 Z5 L
    AssetId   string `json:"asset_id"`
    ) x  w2 U; G! m% J% u+ F( L; Z//Arbitrary string `json:"arbitrary"`+ R6 {- d* H  T! h+ ?  r
    Type string `json:"type"`9 ]- C$ [: u: w( r0 y
    }
    ' L1 |6 r& P) n6 P4 ?3 n4 Ftype BytomAccount1 struct {6 E! d9 j% a7 \0 K3 R! {/ D: ]
    AccountId string `json:"account_id"`9 n- O. Y+ I, F! e% o
    Amount    int    `json:"amount"`" c2 W8 a/ K: L' B  o/ t' Z6 F
    AssetId   string `json:"asset_id"`
    ( d4 U( T3 j! XArbitrary string `json:"arbitrary"`3 c* C6 l( m: b& \
    Type      string `json:"type"`3 X0 f+ i3 g* o) Y9 v
    }
    . ]) x/ ?/ O  M7 ytype BaseTransaction struct{}
    : u3 o. F/ T2 B  w" \; Vtype TransactionParams struct {- g- v  {9 z/ q, D- u
    BaseTransaction *BaseTransaction `json:"base_transaction"`! x* F: r3 K) n% n5 j
    Actions         []interface{}    `json:"actions"`% @: X0 E3 s" `8 q. {/ c
    Ttl             int              `json:"ttl"`
    0 z- c2 B9 m" j5 G( oTimeRange       int              `json:"time_range"`; }5 o$ ~0 i9 j! `5 f2 o
    }) L" H% T# {) u9 s8 H  [0 I- W. w- d; l
    //sign-transaction params& f7 P! e% F) K4 D! y, d
    //https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction- Y* B/ w, a6 N# D# _/ O2 Q; ], v* J: {
    type Transaction struct {% k# f# I: x4 J- }2 ~
    }( }# g- Y4 s2 k  P; N& X) I# T0 i
    type SignParams struct {8 t( D( s  h8 f! A
    Password    string      `json:"password"`
    * F5 G; m4 L* [$ ~& n$ I% i9 [% WTransaction Transaction `json:"transaction"`
    % a# z' F/ {  i* b) P}8 s; t0 [3 G6 t$ T, i+ W
    //submit-transaction
    6 x- u8 Z& {2 T" J2 Y//https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction
    3 X; o+ x8 [/ }  o' J2 Ftype SubmitParams struct {
    ; ?3 n; m7 X7 |8 q& A  z/ I) N& ^RawTransaction string `json:"raw_transaction"`5 t6 G# ~; e* t2 j$ c$ W
    }
    ' P, m+ i7 q9 W: ~type SubmitResponse struct {
    0 M! i( n. q9 gTxId string `json:"tx_id"`7 Y5 i; t& i1 x. b& V) ]
    }
    / B% |" R7 l, Hfunc main() {0 D  A* K  n% ?, _1 G# p& k
    account1, account2, account3 := BytomAccount{}, BytomAccount{}, BytomAccount1{}
    ' H- A' f+ w  B% `2 |% h: p" R" qaccount1.AccountId = "0KTCS3R5G0A02"% o4 F4 @$ `5 u
    account1.Amount = 10000000
    ) V5 y$ w* ]5 J9 maccount1.AssetId = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
    1 q$ H8 B( j/ j! x' f9 C$ Jaccount1.Type = "spend_account"; `+ ^0 L& K5 ?- R& \$ K- u
    account2.AccountId = "0KTCS3R5G0A02"6 |, ^6 [7 l/ U0 u
    account2.Amount = 100
    & q! R' @7 t5 z; qaccount2.AssetId = "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd"9 j' s5 F2 Y  o$ ^
    account2.Type = "spend_account"
    ) F! `) U! A. {9 R2 kaccount3.AccountId = "0KTCS3R5G0A02"
    5 M! ~* W: T5 n9 R! j3 O: @" caccount3.Amount = 1002 ?9 ]( v( k/ u/ N2 S- r! G
    account3.AssetId = "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd"
    $ }! C1 h+ O1 j! l" i- Xaccount3.Arbitrary = "77656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c"
    $ c0 i5 N2 }* W4 V  W0 n6 f  xaccount3.Type = "retire"
    + f5 ^+ |) G2 V# u//var array
    , z' J" ]. W7 `  o3 V" O/ Q7 |var actions []interface{}
    % S( Q9 B* o6 G$ \& I# [//append three params
      O0 B+ _0 I6 P. R6 {. larray_actions := append(actions, account1, account2, account3)
    - G) O1 }0 w' f& |transaction_params := &TransactionParams{}
    1 H8 c, B' G' utransaction_params.Actions = array_actions" m, u0 d# `: q
    transaction_params.Ttl = 0  N* ^  \! d6 j& P( g$ X
    transaction_params.TimeRange = 1521625823
    9 [- d# v" t, ?- |6 F6 s//本地测试网节点5 F. Z( m7 |4 Y) L( n4 i
    //build-transaction
    - X1 D0 w6 m0 ~' o, O' }port := "http://127.0.0.1:9888/build-transaction"  L, g( x) v5 {( G* w# _1 F
    value, err := SendTransactionRetire(transaction_params, port)' S# A0 r1 |$ I3 ?
    if err != nil {, t' I% t7 C; H/ C: L/ U6 e; x
            fmt.Println("err:", err)
    - `* k" d  {( F: i' w9 A}
    + h) }% L, t1 }fmt.Println("build-transaction接口返回的参数:", value)
    ( R! ?8 M7 \. C* _/ B, i//sign-transaction8 S+ f1 `) q4 A; s3 j
    //...........( K/ d! w9 Z) n. I* N) g
    //submit-transaction& X  Y9 Q" N: S! X: O4 g9 W
    //...........
      I; ]' s* M  J}/ t* w5 Y8 b$ v  g# Q) }
    //send post request
    / ?! Z2 W$ r2 cfunc SendTransactionRetire(params *TransactionParams, port   string) (v interface{}, err error) {; o; X9 I% [5 n0 B& ?/ H
    //以本地测试网节点连接
    7 t2 n$ M% b6 z2 w' w$ q$ x$ ]6 RParamsStr, err := json.Marshal(params)
    & T7 @1 S1 a6 f3 L) mif err != nil {
    / U9 c+ [! c2 e* _        return nil, err
    ( g( g; ~$ k8 a1 K}
    5 t5 M2 a' H* q# BjsonStr := bytes.NewBuffer(ParamsStr)
      g( T* L  H% a+ B( T0 y- x& r( mfmt.Println(jsonStr)( q6 d# e5 k; p$ r' T/ ^$ @
    req, err := http.NewRequest("POST", port, jsonStr)6 c* S$ M0 S$ P4 b
    req.Header.Set("Content-Type", "application/json")
    ; J8 f4 i+ x8 |4 ?: a5 C1 u: y; q; Zreq.Header.Add("Accept", "application/json")# l1 B/ R% |: u3 Q4 `
    client := &http.Client{}6 u  _0 a& F9 D
    resp, err := client.Do(req)
    4 S/ y. H+ S' G9 |if err != nil {0 D# [+ o/ A, I7 u
            panic(err)- s0 T. X2 z" `2 A
    }7 z: H$ T! p3 Y0 X! W6 n
    defer resp.Body.Close()1 y( }: ]& s7 T
    var bodyBytes []byte/ H/ ?; G6 J5 v; p
    if resp.StatusCode == 200 {
    $ j& G4 N/ O& Z3 E8 ~% `        bodyBytes, err = ioutil.ReadAll(resp.Body)
    ) T: @5 G/ `9 p2 N4 R        if err != nil {- H# Q, l, U" c# R6 N* j
                    return nil, err
    " b, T) G. e! r5 z        }/ L# `( e1 J8 P
    }% i* R. C0 u8 ?$ r5 X1 O
    return string(bodyBytes), nil
    & l8 m4 S( G& R4 Q* `3 }  T# ]}
    3 ~/ g8 G) S) J  R4 z. k上面的代码只是build-transaction一个步骤,另外sign-transaction和submit-transaction请求需要自己去组织参数进行请求。请求完submit-transaction 获得返回的交易hash,去区块链浏览器上查看自己的上链信息,区块链浏览器地址:http://52.82.46.157:8082/。- |; U. y- {# F6 G
    好了,通过以上的4个步骤,我们就可以借助比原链实现信息上链。如果你有什么疑问或者不明白,请在我们的社区联系我们,https://github.com/Bytom/bytom。
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    wzls3146 小学生
    • 粉丝

      0

    • 关注

      0

    • 主题

      1