Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

wzls3146
270 0 0
很多了解比原链的都知道,比原链是专注信息和数字资产在链上交互和流转的公链项目,信息上链不是比原链核心能力,所以并没有在钱包端做一个功能入口,但是比原链提供了相关的接口可以将一些信息写到链上去。
+ k: b- F$ ^' z7 g: N那如何实现信息上链呢?使用特殊的Retire操作,这个操作可以进行销毁资产的操作,但因为其可以附带信息,所以就可以实现信息上链的功能。
( s' t( D; z6 w' r1 G请往下看,也用postman请求演示,然后用golang写了一个接口的demo, 在用golang代码实现之前,我们先要做一些准备工作。) d* o2 }: Q3 {
  • 首先确保自己在本地已经搭建好了比原的节点,如果你还没有搭建好节点,请参考开发文档:https://docs.bytom.io/mydoc_build_environment.cn.html
  • 确保自己账户是有足够BTM测试币,如果没有可以去比原链水龙头领取BTM测试币,领取地址:' e9 ]# y2 q/ L$ g2 k1 [

    # H  s4 d' `8 Zhttp://test.blockmeta.com/faucet.php( Q6 I$ F5 X8 _8 P  w( L
  • 发行自己的资产,参考:https://bbs.8btc.com/forum.php?mod=viewthread&tid=242940&extra=
  • 信息上链的本质就是其实就是创建并发送一笔交易,我们都知道通过api发起交易主要有三个步骤,先 build → sign → submit,分别对应的api是 build-transaction、sign-transaction、submit-transaction。用postman请求过程如下:% v- k) n% `2 @5 U" L7 h. O% A

    5 a7 u1 i4 N% X+ K$ w5 |2 c$ M请求build-transaction接口:
    ! J2 N8 j* d- d$ a9 e4 k. B
    . G3 ?5 D0 Q- S) w  K请求参数:0 G, Q1 f: |- V; Z
    {; J+ o. i$ x6 s. a" C1 w7 S
    "base_transaction": null,0 Q8 u2 m' x) L5 P; U7 y
    "actions": [{7 J8 A( Z1 k7 g% _4 b4 F) o
            "account_id": "0KTCS3R5G0A02",
    ' \8 N" t+ ?' H. r9 R3 F8 m* b        "amount": 10000000,% B* G! ^) ~* [3 p" e& L2 p  r* l! h
            "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",: u6 `9 C9 Q: o- N! T9 V; F8 l2 U
            "type": "spend_account"
    " X0 @# A) }" ?8 l# g}, {; \, {# f. ?; A9 f
            "account_id": "0KTCS3R5G0A02",
    0 x. y5 ]+ D3 Y8 O        "amount": 100,
    $ b3 j7 h- ~7 }  o- h4 u        "asset_id": "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd",
    1 J8 |3 a4 [/ V* s+ ~        "type": "spend_account"% O9 K5 d" T- L! {7 P" H
    }, {) Z7 k  r  ~! P9 D8 `
            "account_id": "0KTCS3R5G0A02",. b) _, O& @0 a; \% F
            "amount": 100,
    0 H. ?& F) S, I; ?        "asset_id": "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd",* B; \- t1 F) @' s7 ~5 ]; V* Q( i
            "arbitrary": "77656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c",
    ! [9 W3 a3 a9 `. Q3 J        "type": "retire"
    # ?+ ~3 N  F7 G/ M% C8 r}],' u% A0 g0 g. v3 n1 _
    "ttl": 0,
    $ X: |$ k4 `2 C9 I. i  q) n4 O"time_range": 1521625823$ N) [3 t4 M) e% v( u( {4 U
    }
    & f5 K: T- \6 }; u% ^请求sign-transaction接口:$ D0 }% d# D2 d! ~. Y3 O. X

    + E2 D: l0 D9 q! C. a: z1 \9 t9 C请求参数:
    . d( e5 i8 h  c* F/ ^4 j* `5 I' g{2 O8 j3 F0 E# b5 P
    "password": "huangxinglong123",
    / M% O8 w) m/ G7 {  Y"transaction": {1 C9 r* B( z4 V. D/ |# B
            "allow_additional_actions": false,
    & c8 E0 O- q7 O        "local": true,0 X) K+ X; y5 h( r% Y
            "raw_transaction": "0701dfd5c8d505020160015e560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0989fe3020001160014adb6632c5b10c6d5b6f97b8d1250f6e409e11c0101000161015f560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd9cc5b191f3190101160014dcfd9b78c24260823e318153665d511d6c4ecb1b010003013dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0ebbcde02011600147a9baebd37dba3f14960624ed8e6ca3cc9d5f73800013e608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cdb8c4b191f31901160014f0370fdf7a7bec7b34cc62fd5291071a3dc3d9b0000147608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd6401246a2277656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c00",
    # E( r+ |% ~6 l- y4 _; c% I$ _8 Z        "signing_instructions": [{
    4 k' x, \2 K' F% F$ c( M4 y' M! v                "position": 0,; q& m& E  _" c0 M+ u; ^
                    "witness_components": [{
    ' L  L3 x( l! ^/ ~                        "keys": [{
      r  l  B9 f3 q! {                                "derivation_path": [' _3 E% W3 G8 m
                                            "0000002c",
    ' C% o8 P- M4 B                                        "00000099",9 N- @) F8 h0 h) h! C
                                            "0100000000000000",
    $ k3 a7 H  U! I) {3 D                                        "0100000000000000",( f$ @, q/ h: @/ r+ X
                                            "4600000000000000"$ S5 A( C, e# Y. w8 ?
                                    ],- G1 {$ W# v! [* X3 _, I' F; S
                                    "xpub": "1c03161a08a4dbb7df153815a28f733fec1ac7579f954c4834e5ce9f0ad8deb260ecb2066a8623b69aa936f5798f4dcb9572bc476f2c8171953ce054d58a759f"
    ( P8 p3 D& o$ r; k- C  Q0 |$ ?                        }],3 P$ ^& |5 x% F, F" n
                            "quorum": 1,
    . s% j) O$ Q1 J1 a3 k                        "signatures": null,
    1 T/ t: b) r8 o5 f* U                        "type": "raw_tx_signature"6 j2 i' B. y% S7 N, l& k# F
                    }, {4 ?+ i; `5 e+ ~6 m$ O
                            "type": "data",2 x0 Y3 c& F9 f6 K, n5 _
                            "value": "4f089176a5bca95ec9227b8a87dfec947c59453805bf46d3f5a18f8032255b5a"
    / X/ }# g8 K5 U                }]* I: A0 b6 \! ^# m7 A& h
            }, {" ?& i; C9 B# B0 h
                    "position": 1,
    ! ^8 M) S3 O2 _                "witness_components": [{
    8 U0 K7 E9 C1 S) u: [. t" ], h9 \                        "keys": [{: }+ m5 g3 K" K1 ~6 G; d& @
                                    "derivation_path": [  w) X$ r! {2 {& Z$ V* e
                                            "0000002c",2 \0 l. z, D1 f0 a+ Z
                                            "00000099",
    ' t2 |& f; L" J- [( `# N- r1 Q4 s                                        "0100000000000000",/ {  _! L+ ?7 @+ e( h- Y# o
                                            "0100000000000000",
    4 ~7 C7 H8 u+ T" g) t3 R3 z* }                                        "4700000000000000"
    # Z8 [. I1 w' r5 H                                ],
    2 \6 c2 Z) R  _( v5 b                                "xpub": "1c03161a08a4dbb7df153815a28f733fec1ac7579f954c4834e5ce9f0ad8deb260ecb2066a8623b69aa936f5798f4dcb9572bc476f2c8171953ce054d58a759f"
    " V% E' _+ M1 P8 D. a                        }],7 D6 j! m2 P; p% j1 l
                            "quorum": 1,+ Y- @/ z0 g! D$ _1 x. ~
                            "signatures": null,
    0 N4 D4 r4 ^$ Y+ Z# X- R. `) {$ |                        "type": "raw_tx_signature"" X, x0 r0 N% j. f4 y
                    }, {; O' I5 m4 v9 w) z) Z1 L5 J
                            "type": "data",9 F6 g- V& Z6 G& {
                            "value": "67512f9250f559699e32c72c8af29096b1556af145f6ecc0c306e6acc88bbfaa": w; `  k" T3 Q  C9 D6 z
                    }]1 b) k: d2 u( C
            }]+ W8 n3 w  `& V
    }. E4 j+ I& c3 ^+ u  x% y+ J& r  I0 d
    }
    : r- r( W6 W; Z7 ^# n; J# n9 R* b请求submit-transaction接口:; r# |& w- f* I$ }
    1 Y7 m: {3 Q$ ~- K0 h
    请求参数:
    4 ]9 H  w' b# Z4 q" G  I( Z. P1 X {0 C4 b* ~" b3 c: _, _
    "raw_transaction": "0701dfd5c8d505020160015e560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0989fe3020001160014adb6632c5b10c6d5b6f97b8d1250f6e409e11c01630240c7004022db674ff2961b540d4edab846d550429ae9a92311ba375a4f452331422961fdcde3bf79631755dd12df409e24a849158d4aeab919cab81520fb7d1e02204f089176a5bca95ec9227b8a87dfec947c59453805bf46d3f5a18f8032255b5a0161015f560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd9cc5b191f3190101160014dcfd9b78c24260823e318153665d511d6c4ecb1b6302406b75ef5a9decfa31d4f5ae06e0fb14ca507ba4a03715874d1d831516945121573b9b858e4d7527d209c1f89f74e0aa4c4e38afd098cbadaff31b9107167099012067512f9250f559699e32c72c8af29096b1556af145f6ecc0c306e6acc88bbfaa03013dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0ebbcde02011600147a9baebd37dba3f14960624ed8e6ca3cc9d5f73800013e608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cdb8c4b191f31901160014f0370fdf7a7bec7b34cc62fd5291071a3dc3d9b0000147608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd6401246a2277656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c00"
    - g6 B& Y, p- ~+ @. L# y$ w  }
    6 j! z* L) E% [0 U1 y响应参数:
    8 s- v/ s/ ~$ y) {9 ?  ] {1 T  o4 C7 h# @) J' M, p: ~( w
    "status": "success",9 Q, N. \* c* P$ t& ?: F
    "data": {& |# R- O# g8 X2 B' y% z8 g
        "tx_id": "5ef27b930646d468bbb436d3406972ff201aa63702518f777e31dd6a2147dddc"
    2 p  ~' q, P" ~: `0 Y1 r  }
    ! _' S' }( I3 b- Y6 \2 T5 H}
    , p. e7 [* a1 _4 Z8 n9 U) A
    6 B& R8 Y2 g6 m1 \- Y+ K' Y用上面返回的tx_id去比原的浏览器中去查看交易详情,就可以查看到我们上传的数据9 W  B1 h& O" `8 s" V
    & ^: H, w. A" h1 Q( \: o) V
    参考代码:
    0 u* g. z5 J: O. R, qpackage main! c8 T$ w- ?7 c7 g4 T
    import (
    2 y6 F, O- Z; E  L" w"bytes"
    " f9 ~7 P) `$ s6 r4 b"encoding/json"
    # k3 _/ A. P+ Y, C/ C"fmt"
    . d% B2 _% d0 u7 h* b! g/ t3 q"io/ioutil"
    ( i: ?- }# C$ Z2 \: I7 T' d) s" k"net/http"
    ! [( P5 y: k8 W+ E)
    ' x% b% C# `' R//build-transaction params
    ( n$ Y' j) z+ y2 ]* L: g' M//https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction; B$ ]4 ]! B# F* m0 i" v
    type BytomAccount struct {) Y6 x  }9 g/ M6 J0 {6 `# p# P; j4 c
    AccountId string `json:"account_id"`4 U* m) ?; N5 e/ v$ b# Y) X
    Amount    int    `json:"amount"`; W  N, x% r* c: g! L- l; [
    AssetId   string `json:"asset_id"`
    % N8 |: c1 @* l# L, A" d//Arbitrary string `json:"arbitrary"`( ]- u( K; G8 j8 e$ n3 g5 ?
    Type string `json:"type"`
    $ q& A. }2 A" }3 c  e}
    5 s3 g8 q5 Z( g& ?. ]0 m5 n: Ytype BytomAccount1 struct {" Z; C) W0 R) }8 j5 t
    AccountId string `json:"account_id"`4 X) a8 G5 H+ W, m
    Amount    int    `json:"amount"`
    + [1 {. ~* U' }/ m* ]AssetId   string `json:"asset_id"`
    $ E( U' `  q$ c( e" [) I- LArbitrary string `json:"arbitrary"`8 P  s9 v; `8 E6 K/ ?2 T( h
    Type      string `json:"type"`5 v- @( l( l3 D0 U/ Y
    }& t( C+ \3 g! A6 D4 _
    type BaseTransaction struct{}
    : S! w% N7 ^8 E( K" v* }type TransactionParams struct {
    ! |  x& j7 n4 OBaseTransaction *BaseTransaction `json:"base_transaction"`
    & J! w9 C7 Y5 N5 f, yActions         []interface{}    `json:"actions"`' j+ o# ^0 ?" o4 `1 d, u' [, q
    Ttl             int              `json:"ttl"`
    ; ]) c2 ~- {! |/ z! [0 fTimeRange       int              `json:"time_range"`
    3 d: ?: `4 Y$ m}3 [" G2 K, p, T
    //sign-transaction params9 O  q4 Z2 x- G" C# E8 T
    //https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction( S# e& ]. f/ x* F& m  Y1 g4 ]# z
    type Transaction struct {$ w" [; c2 |# l. P& w3 _
    }7 i1 }. A7 Y' S8 N
    type SignParams struct {
    ' P3 X9 g5 Q3 Y0 ]. ?1 k" PPassword    string      `json:"password"`$ x! i" ^; n, U( u7 O$ D
    Transaction Transaction `json:"transaction"`0 B; Z) L2 m( Q$ ]" I( i+ c
    }; H- @! R9 `& g  `& k
    //submit-transaction! t- Z# s, U( j' F" J
    //https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction
    - K# e8 K7 o$ otype SubmitParams struct {1 }' v; F6 f; }; ~) I" _
    RawTransaction string `json:"raw_transaction"`
    0 q. |$ c1 X% p6 _0 C}, K, U, o& b7 x. p5 s
    type SubmitResponse struct {
    , n# h3 k: u9 N0 o+ w' V8 j1 uTxId string `json:"tx_id"`: j3 B; u- |# l, ~3 ]' A: A- {
    }
    8 A9 a' R& F3 y) Y+ b( f( S0 w, w. B' ofunc main() {" w0 u/ T0 Q5 P  a7 t
    account1, account2, account3 := BytomAccount{}, BytomAccount{}, BytomAccount1{}6 H! f$ R! n$ j
    account1.AccountId = "0KTCS3R5G0A02"' @+ V4 V  [0 U
    account1.Amount = 100000007 W. \5 K) ]: Y/ U2 x
    account1.AssetId = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
    - t8 Z0 O8 @, S+ _. @5 caccount1.Type = "spend_account"7 L& d+ X, b- X3 A( \4 t
    account2.AccountId = "0KTCS3R5G0A02"
    : w* i7 A4 T( f, \account2.Amount = 100
    8 G. e+ A4 v; \9 Iaccount2.AssetId = "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd"3 [4 g+ ?5 W$ f* @
    account2.Type = "spend_account"
    " x# S3 D9 c; m' Taccount3.AccountId = "0KTCS3R5G0A02"
    ( x& c! q4 E# t2 E. maccount3.Amount = 1008 C9 o0 }, f: f1 }
    account3.AssetId = "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd"5 q  f, \: B6 {- S% O' B5 j- L5 O6 Q! t
    account3.Arbitrary = "77656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c"- f( h: z  E+ n% }, s* r* x6 W
    account3.Type = "retire"& k( j. ~; p' Q* x% S* Z) H
    //var array9 c" ]1 |$ H' a& C( G/ {! j$ M
    var actions []interface{}
    9 F% I0 i% P' w. c  y//append three params( M  {( R- ?" E( {
    array_actions := append(actions, account1, account2, account3)
    . p! T1 @2 Z$ i  F9 c+ x5 T, b- u8 Ltransaction_params := &TransactionParams{}% s$ K  x( @$ ?4 i) K7 I
    transaction_params.Actions = array_actions
    " b4 h* Q# F) N1 H9 |" Ztransaction_params.Ttl = 0
    0 p# ?9 }2 Q- Ztransaction_params.TimeRange = 1521625823
    9 C1 e* Z) D$ K) @. J//本地测试网节点. x; a+ [5 h( M2 a6 ~& Y, V
    //build-transaction1 }$ I" O, `6 \' k& S: r# ], S
    port := "http://127.0.0.1:9888/build-transaction"/ @9 |  J0 Q( x3 V# x) F
    value, err := SendTransactionRetire(transaction_params, port)1 o1 _7 W1 T9 t. r- E; Z3 y
    if err != nil {
    1 y+ e+ G3 k2 ]7 k' G% w4 Q        fmt.Println("err:", err)) s% C* l* y" T% Y4 f
    }- _8 v1 ]# m9 C' h) W' V: X- }* D1 q
    fmt.Println("build-transaction接口返回的参数:", value)0 e. q8 f$ X1 `# O  {4 u% @
    //sign-transaction
    * D% A. q- D; l' ?/ t! x# `% d, c9 _5 @//...........
    # V; n) S- r+ N" x0 Q* a2 r//submit-transaction
    " ?1 \. g, x- W1 x//...........
    0 i" Y& t& q. D% X}5 D0 O: h1 N, v; `9 h
    //send post request7 d4 }9 u. B! u: h9 p
    func SendTransactionRetire(params *TransactionParams, port   string) (v interface{}, err error) {
    , j; {2 y  H3 a( R6 W6 \' _% m//以本地测试网节点连接
    : P, M% C$ n7 H6 }4 nParamsStr, err := json.Marshal(params)
    - W4 Y+ e0 H/ w9 L/ A! j5 @if err != nil {  R  O9 B* Y" u: w7 Y/ M
            return nil, err
    - q" y& r/ F2 C+ U- X0 z$ A" M# ?$ r3 w}$ H% T- c8 a" v  N8 R% G
    jsonStr := bytes.NewBuffer(ParamsStr)
    . m( i3 K/ h6 r  O+ L8 y$ ifmt.Println(jsonStr)
    - @2 B1 }+ i) g' S3 V6 Kreq, err := http.NewRequest("POST", port, jsonStr)
    7 g, ~8 l4 _1 i2 ^7 C2 h% M3 creq.Header.Set("Content-Type", "application/json")
    9 Y& q+ I* s9 s! R$ d( Ureq.Header.Add("Accept", "application/json")3 |2 M3 |# K' @# R5 Z
    client := &http.Client{}
    ' [% e+ h: i5 e/ U! I! p6 b& dresp, err := client.Do(req)( ]) Y9 s8 f0 v4 x3 N
    if err != nil {* x0 ^* O/ l- r4 Q3 r
            panic(err)( B7 e. G4 H0 C" N% U& I$ T1 ^
    }
    ( p" O+ s1 N! p/ k3 m: ddefer resp.Body.Close()
    : M1 \  D' z+ |6 h, Qvar bodyBytes []byte
    / D0 h2 n* U7 s# ]1 D  O9 hif resp.StatusCode == 200 {
    ! _- N: o% b) E/ Y  r0 Z        bodyBytes, err = ioutil.ReadAll(resp.Body)! v6 {$ l( ^# X- p: L$ s
            if err != nil {
    6 i& w/ h! C! A                return nil, err
    7 O- L, h0 S9 S9 r4 \6 a        }" b6 q% i3 @  |& R- d- x3 E
    }  ]6 p; e6 ^: {7 P, G$ D: G, {
    return string(bodyBytes), nil
    , ^% G1 d, }% X( a}
    7 b# k6 x' a6 {' S上面的代码只是build-transaction一个步骤,另外sign-transaction和submit-transaction请求需要自己去组织参数进行请求。请求完submit-transaction 获得返回的交易hash,去区块链浏览器上查看自己的上链信息,区块链浏览器地址:http://52.82.46.157:8082/。
    1 T4 T8 ?" W, ~# A: J好了,通过以上的4个步骤,我们就可以借助比原链实现信息上链。如果你有什么疑问或者不明白,请在我们的社区联系我们,https://github.com/Bytom/bytom。
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    wzls3146 小学生
    • 粉丝

      0

    • 关注

      0

    • 主题

      1