Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

wzls3146
337 0 0
很多了解比原链的都知道,比原链是专注信息和数字资产在链上交互和流转的公链项目,信息上链不是比原链核心能力,所以并没有在钱包端做一个功能入口,但是比原链提供了相关的接口可以将一些信息写到链上去。
6 _+ ~  n5 b" x8 ^$ g8 U那如何实现信息上链呢?使用特殊的Retire操作,这个操作可以进行销毁资产的操作,但因为其可以附带信息,所以就可以实现信息上链的功能。  A, O5 F" q/ {% |0 f/ S7 L. a
请往下看,也用postman请求演示,然后用golang写了一个接口的demo, 在用golang代码实现之前,我们先要做一些准备工作。) I( r/ X4 r$ U" d/ x  ?& S
  • 首先确保自己在本地已经搭建好了比原的节点,如果你还没有搭建好节点,请参考开发文档:https://docs.bytom.io/mydoc_build_environment.cn.html
  • 确保自己账户是有足够BTM测试币,如果没有可以去比原链水龙头领取BTM测试币,领取地址:- l" K" d: W1 X& M' Q) ~% h
      ^4 y/ s$ G1 K2 f1 Y
    http://test.blockmeta.com/faucet.php1 [& u1 t* C4 J" |4 t
  • 发行自己的资产,参考:https://bbs.8btc.com/forum.php?mod=viewthread&tid=242940&extra=
  • 信息上链的本质就是其实就是创建并发送一笔交易,我们都知道通过api发起交易主要有三个步骤,先 build → sign → submit,分别对应的api是 build-transaction、sign-transaction、submit-transaction。用postman请求过程如下:
    # q& j! J5 \( t- F# ^. c6 `
    % V# K) ~: Q( d3 Z
    请求build-transaction接口:
    : G, `8 }9 E% ^5 x9 ^
    - y  Z  Q+ X2 g' r% L6 z% l请求参数:. {$ E+ G+ w& D/ p/ }; p% g
    {
    9 ~  J) V0 y' O5 M5 a& f9 y"base_transaction": null,
    / B1 D7 w( G6 v* g4 D+ X"actions": [{
    3 Z( f) e" G# r        "account_id": "0KTCS3R5G0A02",
    5 K# h& s# _- b7 ?3 ^/ h( s# B& ?        "amount": 10000000,5 X6 K4 q( A8 p# i9 N  Q
            "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
    & o1 B, E) Q( m5 x& B        "type": "spend_account"
    , p" D/ B+ r9 u! `) ^, k$ L( n}, {
    * m* s9 o) j* `/ S2 N        "account_id": "0KTCS3R5G0A02",
    % N7 Z5 w1 e4 B( u        "amount": 100,
    % U. i: g: s5 S7 o& ^9 D) F        "asset_id": "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd",2 m7 F2 q+ _9 h5 P2 o$ T% P# g2 l
            "type": "spend_account"# d6 `/ K9 l7 Q7 j  x5 j4 t+ `% G
    }, {
    + ~' p5 V+ F3 ?7 S& c        "account_id": "0KTCS3R5G0A02",
    . E& k; x* I# U        "amount": 100,
    6 o+ y8 E2 {% L( k* `5 k  k! |        "asset_id": "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd",
    9 d2 y$ a# s" v0 f2 F, v' ^        "arbitrary": "77656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c",, E0 W- C6 |" o: F8 }
            "type": "retire"3 ~) m, ^$ n# p. q9 j, Q2 g
    }],
      u. H2 ]4 u- V0 ~( _"ttl": 0,' `; z1 l7 Z; l
    "time_range": 1521625823
    % v+ k& d) Z" X  q4 l" S' C3 m}
    * U) r3 K/ Q1 N* n请求sign-transaction接口:
    9 ^" A& V6 v4 K5 |- m- h
    & [! o5 `: {3 H, O4 v请求参数:
    4 g9 S' [$ c, n3 H{
    ; k/ O- j# _+ _6 r5 ^! u& Z6 r"password": "huangxinglong123",
    1 j' r& R  ?0 ]8 Z. V9 u9 C1 r! ~4 h. i"transaction": {
    7 _/ R% v7 P" u* x        "allow_additional_actions": false,
    7 V/ G& n) s9 ]1 Q        "local": true,. O, S; x7 ?3 R. |0 O$ e  C( z2 K) ~
            "raw_transaction": "0701dfd5c8d505020160015e560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0989fe3020001160014adb6632c5b10c6d5b6f97b8d1250f6e409e11c0101000161015f560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd9cc5b191f3190101160014dcfd9b78c24260823e318153665d511d6c4ecb1b010003013dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0ebbcde02011600147a9baebd37dba3f14960624ed8e6ca3cc9d5f73800013e608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cdb8c4b191f31901160014f0370fdf7a7bec7b34cc62fd5291071a3dc3d9b0000147608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd6401246a2277656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c00",
    3 R  j2 d- I: N        "signing_instructions": [{0 c0 Y' R7 I  u* I% [
                    "position": 0,2 y& V6 e9 N* a8 V7 E
                    "witness_components": [{
    8 ~3 e4 Q* A' }                        "keys": [{, v4 Q( e3 L8 L8 Y' z; j0 {3 m: U
                                    "derivation_path": [
    : C% m  V# x, D                                        "0000002c",5 S( ?  C4 J4 e+ s- t; z
                                            "00000099",
    3 P  G9 u) ?& J/ a! F                                        "0100000000000000",
    2 T- b! O) k2 F5 X                                        "0100000000000000",
    + G3 G: V# s, I6 n7 }                                        "4600000000000000". ]/ i' Z/ T9 S1 t
                                    ],
    / ~9 h; Z2 R6 O: r& ?1 \/ Z                                "xpub": "1c03161a08a4dbb7df153815a28f733fec1ac7579f954c4834e5ce9f0ad8deb260ecb2066a8623b69aa936f5798f4dcb9572bc476f2c8171953ce054d58a759f"
    $ a+ P  P$ V0 P3 n                        }],
    8 E+ m% z/ K  h1 l( [; k6 g. _                        "quorum": 1,0 E9 \. l7 h! G3 f- {: A# ~9 ?* O
                            "signatures": null,
    # i: l1 d# y1 B! J9 A                        "type": "raw_tx_signature"
    # K' ~/ ?4 D5 z) U                }, {/ j% C& c& K' ^
                            "type": "data",5 f7 M: c, c0 t  S4 G, s
                            "value": "4f089176a5bca95ec9227b8a87dfec947c59453805bf46d3f5a18f8032255b5a": v& }! u0 ^1 I$ _
                    }]0 w  O7 t0 V/ [0 B+ J7 C
            }, {( l' u' g) E% s1 O% e
                    "position": 1,  a. T4 K% ^1 M% I% \* Z
                    "witness_components": [{
    3 E" d6 T) a& c" d4 |# ^8 m                        "keys": [{
    2 b8 j) w1 f. F. P0 n( D" y                                "derivation_path": [
      M7 `) o& B: b! c* {                                        "0000002c",
    2 W! `6 c/ c8 x& v8 g                                        "00000099"," `) ~5 X* W* h( q0 {: S; ~% d
                                            "0100000000000000",
    8 g) R9 @' o/ i                                        "0100000000000000",
    + w, R& G4 f) \3 W/ G                                        "4700000000000000"5 A3 f6 @- ]  ~) I5 }! J, \* W
                                    ],# a# v6 t/ T2 q$ x% d$ j! O8 B
                                    "xpub": "1c03161a08a4dbb7df153815a28f733fec1ac7579f954c4834e5ce9f0ad8deb260ecb2066a8623b69aa936f5798f4dcb9572bc476f2c8171953ce054d58a759f"
      c0 M3 [3 M" o5 ~  C& w2 f                        }],
    ' }4 Z6 i7 y/ [$ c! m+ A0 J; h                        "quorum": 1,; K2 p5 q+ F6 N0 J! m7 q
                            "signatures": null,; w& j. ]8 P; A  D7 X
                            "type": "raw_tx_signature"; \* k. c+ t  i$ }5 q
                    }, {
      J2 p' k" P% P6 t; q' ?/ [' I2 v                        "type": "data",+ f1 I% X% u. U: P  D4 A% B
                            "value": "67512f9250f559699e32c72c8af29096b1556af145f6ecc0c306e6acc88bbfaa"
    " E3 q( I" X/ ^                }]9 ?& z8 K0 ~* c6 E: d
            }]7 b1 M2 X" F2 F  d& X7 n7 i
    }
    * |* r" G* e! W& q# t  ]}4 H5 H4 r3 G- F& R+ b
    请求submit-transaction接口:
    2 v: s. i9 L( y  k  j+ }* X9 S0 I: K+ j. I! a+ z
    请求参数:
    . ]* i: V# C$ G1 M# R" z6 S# T1 P {" h$ O/ u7 _5 a0 q
    "raw_transaction": "0701dfd5c8d505020160015e560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0989fe3020001160014adb6632c5b10c6d5b6f97b8d1250f6e409e11c01630240c7004022db674ff2961b540d4edab846d550429ae9a92311ba375a4f452331422961fdcde3bf79631755dd12df409e24a849158d4aeab919cab81520fb7d1e02204f089176a5bca95ec9227b8a87dfec947c59453805bf46d3f5a18f8032255b5a0161015f560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd9cc5b191f3190101160014dcfd9b78c24260823e318153665d511d6c4ecb1b6302406b75ef5a9decfa31d4f5ae06e0fb14ca507ba4a03715874d1d831516945121573b9b858e4d7527d209c1f89f74e0aa4c4e38afd098cbadaff31b9107167099012067512f9250f559699e32c72c8af29096b1556af145f6ecc0c306e6acc88bbfaa03013dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0ebbcde02011600147a9baebd37dba3f14960624ed8e6ca3cc9d5f73800013e608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cdb8c4b191f31901160014f0370fdf7a7bec7b34cc62fd5291071a3dc3d9b0000147608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd6401246a2277656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c00"9 x1 }3 w5 r: u: V! s8 `
      }* {) A" p+ T0 ^0 m5 O6 N
    响应参数:
    * f5 ]& J, Z1 h3 O {
    . O: h7 F( O) N* ?"status": "success",
    - h0 U1 Q( B" D) ~% Q3 |"data": {! v$ t% J: M! _2 G/ s1 e
        "tx_id": "5ef27b930646d468bbb436d3406972ff201aa63702518f777e31dd6a2147dddc"
    & ?2 E' _  Q0 r- N0 L) x! C3 Q  }. T( s# x/ A2 u8 x/ t
    }- l9 h4 |4 n# B, \0 J: S) o  R
    ( l' e* l9 Y9 S5 Y- t9 P( I* H3 Y
    用上面返回的tx_id去比原的浏览器中去查看交易详情,就可以查看到我们上传的数据
    : D! `3 v; \4 D, r" P; I" K6 ~# ^$ Y% k, h/ t- E7 y
    参考代码:* T: s0 Q, w: F) }- J% i5 `
    package main) K/ I( ^( Z1 N0 [
    import (
    9 U  v- v7 F7 V% K7 o- ^! `"bytes"7 A' C) H; i9 e6 W8 y! r; b
    "encoding/json"
    1 t6 k9 E/ O; ~, k8 b6 l' {"fmt"
    , \& o& K+ [! m& H"io/ioutil"' s3 J% w8 M. e8 [+ t9 Z
    "net/http"$ ^0 j, S8 |& a$ `" S/ o5 \
    )
      ^& e+ B5 H% k5 r7 R, z4 l//build-transaction params" w8 S, Y, A& T% g' V/ }% t  q6 z
    //https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction# [" \4 l9 N  E% I
    type BytomAccount struct {0 H' p* \/ B+ e4 a! t. {
    AccountId string `json:"account_id"`- A8 b" X/ I2 \; Q- h
    Amount    int    `json:"amount"`
    7 P9 [+ M7 p' Z8 g: X  H5 WAssetId   string `json:"asset_id"`% D/ @  T3 u5 r' z. C
    //Arbitrary string `json:"arbitrary"`5 t5 m7 _! h# H$ C
    Type string `json:"type"`# W; s% a4 D$ h- M! \4 D9 V1 x7 ]
    }! t) s' X; z) j6 v
    type BytomAccount1 struct {
    , R, u/ o5 q: x7 bAccountId string `json:"account_id"`" ]5 ?4 c  f  _9 A3 {6 {
    Amount    int    `json:"amount"`1 c2 ~0 @6 x5 S: Z8 g& p
    AssetId   string `json:"asset_id"`- N% L4 M- T# [& H
    Arbitrary string `json:"arbitrary"`
    ) Y& ~0 o7 y9 d& G% T; lType      string `json:"type"`+ G( F5 }* t( H5 x7 X" {- B
    }
      v0 p% k4 @% X# Q( E5 h" gtype BaseTransaction struct{}1 v; }, _2 U; q' k5 e" L, B
    type TransactionParams struct {- x/ i/ j2 u2 ^8 Z
    BaseTransaction *BaseTransaction `json:"base_transaction"`7 A) j& I" ~; F/ g! G
    Actions         []interface{}    `json:"actions"`7 _/ E* N/ k# E- P3 o
    Ttl             int              `json:"ttl"`4 c" G" I0 H% \' v1 ]! b* @  N
    TimeRange       int              `json:"time_range"`
    9 n5 H8 V0 C: i& L9 N* z}' z7 n5 a0 s3 x1 ]8 |- G+ ~5 J
    //sign-transaction params
    8 F- X. L/ G# P7 M- K//https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction4 r: Y7 v- m! U. ]' _" ]+ G
    type Transaction struct {
    7 ?- v: r3 H1 E$ b: z  _+ }}6 h5 B# V, Y. B, t5 D# Y
    type SignParams struct {7 S9 v% o0 k) e% z' o
    Password    string      `json:"password"`
    3 I- ^& r; W0 A  o2 ~# o& @Transaction Transaction `json:"transaction"`
    ! ?2 y6 ?2 r8 F: p! \}/ u- C1 ~  a, [( T1 R
    //submit-transaction
    ( i; F! Q+ |/ T* x; j# F//https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction7 _2 \8 d0 \4 a! U
    type SubmitParams struct {
    ! e" V6 }: O' R, L2 y2 rRawTransaction string `json:"raw_transaction"`
    6 J6 M" r  s1 r/ I: ]- g( E}: W, i" K$ e* \; G' R" S: b
    type SubmitResponse struct {
    " Y+ w/ ]+ W1 ITxId string `json:"tx_id"`& i' H1 `) h  K9 `$ i4 y9 C4 L
    }# Y& n% ^1 c; Z1 b/ D0 O, L
    func main() {
    5 B6 H5 ]" p  p+ |; N7 N, }account1, account2, account3 := BytomAccount{}, BytomAccount{}, BytomAccount1{}: N9 s7 n% x/ s  y/ b4 w
    account1.AccountId = "0KTCS3R5G0A02"; \0 x3 @9 n( ?: H! |
    account1.Amount = 10000000
    + c! C) k+ J; J/ caccount1.AssetId = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"" @- O% J) E4 l6 x% }; \# f
    account1.Type = "spend_account"
    + c: j7 G3 z: Y$ `1 |( q# n6 Yaccount2.AccountId = "0KTCS3R5G0A02"
    / s" c& \. Y" r6 L! zaccount2.Amount = 100$ X% _0 c( q. A1 L& l4 B+ y
    account2.AssetId = "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd"
    ; b: p, c8 J6 R' Y( u9 ^account2.Type = "spend_account"
    * B2 g) c  L. U( z+ T9 kaccount3.AccountId = "0KTCS3R5G0A02"$ S8 j* W8 j. ^5 @6 Z$ \* x
    account3.Amount = 100
    , \( U. c/ r6 G* Z7 paccount3.AssetId = "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd"# Z* A0 ]. ]/ x3 W" ~  d/ J
    account3.Arbitrary = "77656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c"# I$ l( y/ W/ P% ?9 k
    account3.Type = "retire"8 b% |8 t7 z% j+ y$ A
    //var array
    $ h; P% i( N  S6 M  bvar actions []interface{}
    ( [4 E0 f) ~: n$ u2 @5 d$ n//append three params8 s+ ]* |8 t" j9 O& M
    array_actions := append(actions, account1, account2, account3)
    ' y; [* ~4 K$ w8 u' b* mtransaction_params := &TransactionParams{}* {; x: |$ X9 @) I( ^( G
    transaction_params.Actions = array_actions7 ~8 ^: S" j2 w9 Y3 j. {
    transaction_params.Ttl = 0
    % P/ [1 U6 V6 N% P9 b4 a! d8 Q& ^transaction_params.TimeRange = 1521625823
    6 U* Y* V- O" c( g. C$ R  i//本地测试网节点
    9 u0 `( z: P) Z2 e//build-transaction+ A8 [: X: M% h0 L6 Q- V; e3 E
    port := "http://127.0.0.1:9888/build-transaction"2 P0 X% i; K' L6 z5 T: p3 P" K% R3 y  g
    value, err := SendTransactionRetire(transaction_params, port)
    ' o0 p" K0 m& j( sif err != nil {0 _' G, Z# e+ N& k4 v3 A
            fmt.Println("err:", err)
    : o  M) w3 b, a& M4 i7 I}
    7 L( I. l- y' g0 Qfmt.Println("build-transaction接口返回的参数:", value)
    " e8 v4 j% o. {//sign-transaction$ Y. [; Q5 W9 W/ x. i
    //...........
    ; m2 c& ?9 m) e5 t- c//submit-transaction+ e' m$ K( O9 d: O4 i6 G) b
    //...........4 y" a, |! k% N& |# K
    }
    " D$ o. w/ H7 c& J//send post request
    + l" G7 e- m  Bfunc SendTransactionRetire(params *TransactionParams, port   string) (v interface{}, err error) {
    " x8 ?+ w+ [9 J% y$ V+ ~//以本地测试网节点连接
    6 F: C5 ?# _& H5 }1 kParamsStr, err := json.Marshal(params)
    - x' P+ d1 m: c( K) m$ l. x2 zif err != nil {
    " \( E, c8 s1 Y+ x        return nil, err: ^  J# ?0 d8 ~- b- Q2 M( F: `) h
    }
    1 S4 u" Q4 B. _2 \6 FjsonStr := bytes.NewBuffer(ParamsStr)
    2 q# Y8 Q) o9 N, c6 z0 _6 Xfmt.Println(jsonStr)
    0 U! B1 X% D* b, [) P1 f9 ireq, err := http.NewRequest("POST", port, jsonStr)9 A, @% @% H" B4 C
    req.Header.Set("Content-Type", "application/json")
    , Y7 W) |5 R9 M; Q. g( Ureq.Header.Add("Accept", "application/json")
    ) q5 i$ J* w7 [client := &http.Client{}4 m; `$ z% L  x0 t4 W4 }! \
    resp, err := client.Do(req)  L" t# M$ I: G- Z7 A# D( ?
    if err != nil {' \* x& f2 f, i: a) B4 h* q
            panic(err). ^$ ]7 \# B. Y- l# D2 R
    }( [% X5 P3 _1 t; L. \( n8 m0 C4 C! _  Y( Y
    defer resp.Body.Close()1 @6 l; i2 i1 z# ?0 {  U
    var bodyBytes []byte
    6 z  m# y9 l! C% r# F# T5 d! d- jif resp.StatusCode == 200 {1 F& P& t% }( @/ @8 E, M* R/ {1 e
            bodyBytes, err = ioutil.ReadAll(resp.Body)% E! d2 ]. j; h! o& |
            if err != nil {6 n/ r0 o+ {) W- i0 k1 C0 r! t
                    return nil, err% p( t5 W9 K- m) \: `  b( X
            }9 p$ y4 L2 ^: B% D% u5 Q# w  f
    }
      @7 q4 U7 ?( o0 `  f* q. ?7 ~return string(bodyBytes), nil# p" ^$ y. F3 l" J  {
    }+ o& v1 T8 Y* h& z# I
    上面的代码只是build-transaction一个步骤,另外sign-transaction和submit-transaction请求需要自己去组织参数进行请求。请求完submit-transaction 获得返回的交易hash,去区块链浏览器上查看自己的上链信息,区块链浏览器地址:http://52.82.46.157:8082/。+ c/ X2 j% E7 O% V/ ?8 R
    好了,通过以上的4个步骤,我们就可以借助比原链实现信息上链。如果你有什么疑问或者不明白,请在我们的社区联系我们,https://github.com/Bytom/bytom。
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    wzls3146 小学生
    • 粉丝

      0

    • 关注

      0

    • 主题

      1