Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

wzls3146
333 0 0
很多了解比原链的都知道,比原链是专注信息和数字资产在链上交互和流转的公链项目,信息上链不是比原链核心能力,所以并没有在钱包端做一个功能入口,但是比原链提供了相关的接口可以将一些信息写到链上去。: r5 y8 t0 I1 q  x6 U6 z
那如何实现信息上链呢?使用特殊的Retire操作,这个操作可以进行销毁资产的操作,但因为其可以附带信息,所以就可以实现信息上链的功能。) o; D$ ?; ?0 x7 w
请往下看,也用postman请求演示,然后用golang写了一个接口的demo, 在用golang代码实现之前,我们先要做一些准备工作。6 |: ^8 q6 U* I
  • 首先确保自己在本地已经搭建好了比原的节点,如果你还没有搭建好节点,请参考开发文档:https://docs.bytom.io/mydoc_build_environment.cn.html
  • 确保自己账户是有足够BTM测试币,如果没有可以去比原链水龙头领取BTM测试币,领取地址:" a* q, H' n$ c0 s3 A, F

    $ }8 a# [$ m6 Q/ ]2 o2 N( }) b3 G" _8 Chttp://test.blockmeta.com/faucet.php
    - H: Y7 j! T' Q+ n$ r* \. g# _
  • 发行自己的资产,参考:https://bbs.8btc.com/forum.php?mod=viewthread&tid=242940&extra=
  • 信息上链的本质就是其实就是创建并发送一笔交易,我们都知道通过api发起交易主要有三个步骤,先 build → sign → submit,分别对应的api是 build-transaction、sign-transaction、submit-transaction。用postman请求过程如下:3 X2 d% S0 C$ F9 G3 \" T
    ; o. O9 R2 W; a) Q, \$ z! Y
    请求build-transaction接口:
    1 r5 W! K- C' |
    5 e: T% R( y$ _% s$ l# i& i请求参数:
    # R4 R+ K# T( l; z  o% V0 A3 V: N{. }2 k, A# E( S$ `: q
    "base_transaction": null,  O6 Q' j- B  r( |
    "actions": [{* ~& ^7 E5 \# _' Z1 W
            "account_id": "0KTCS3R5G0A02",
    . F4 L2 c/ K7 I) M0 p4 z0 n# a9 }        "amount": 10000000,% ^. t( F  d" `2 `- J1 N) n
            "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",* I' P1 c, j0 e6 b8 a* [
            "type": "spend_account", ~) D" K2 F" u, O: Q$ N% E( S, Q- b% Y
    }, {
    0 C8 s$ B2 R8 H2 Q8 @* p( q        "account_id": "0KTCS3R5G0A02",! e" a* l# M! p8 H* a
            "amount": 100,
    6 B4 N# R9 s+ U  w6 k$ N4 b/ S        "asset_id": "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd",
    0 {! g% M9 `) X9 `6 i        "type": "spend_account"
    . B7 u" I6 x' _1 d! t}, {1 b/ k. ~1 ], p# g. P4 d
            "account_id": "0KTCS3R5G0A02",0 ^3 R6 p$ s5 `
            "amount": 100,
    ) [0 U- |' v8 g* }! e; `* w  h# f  C# R+ {        "asset_id": "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd",- p" f0 s& `! `# R/ C. o. u/ c! N
            "arbitrary": "77656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c",- V7 S, z. L3 ^: [
            "type": "retire"
    5 F8 @* h9 ^, e}],/ ~9 ?1 R5 T: p4 a  k# B
    "ttl": 0,
      C" U5 @! b- \/ _. l7 N"time_range": 1521625823$ E5 o2 Q9 A" @7 J! y4 y
    }' R2 G5 i0 t/ p6 ]: ~% R
    请求sign-transaction接口:
    . ^* ~3 d" X1 ~$ c1 ^; m1 a0 O0 v. h" }; j+ g" J* k
    请求参数:
    6 A! s' L3 d' V{% w* k# i! o' J  k+ @- `& V
    "password": "huangxinglong123",8 p/ l( V" y! \$ b5 C' K
    "transaction": {
    . m3 ?  v/ G' `8 N! W' B        "allow_additional_actions": false,/ ?6 w' S% B& d8 `- i. t4 t
            "local": true,3 p/ K  g0 l& @) _
            "raw_transaction": "0701dfd5c8d505020160015e560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0989fe3020001160014adb6632c5b10c6d5b6f97b8d1250f6e409e11c0101000161015f560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd9cc5b191f3190101160014dcfd9b78c24260823e318153665d511d6c4ecb1b010003013dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0ebbcde02011600147a9baebd37dba3f14960624ed8e6ca3cc9d5f73800013e608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cdb8c4b191f31901160014f0370fdf7a7bec7b34cc62fd5291071a3dc3d9b0000147608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd6401246a2277656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c00",
    / a$ }  B* G& j& _        "signing_instructions": [{- R* b% X9 b: T4 U
                    "position": 0,
    ; i6 ]2 }$ R1 {: _, P- p                "witness_components": [{: k& y( O8 j; y- k+ X6 B
                            "keys": [{
    4 E! ?" K) B* S- P' h! K                                "derivation_path": [
    * T2 D8 S/ c. @8 `5 F( T( |  f( A                                        "0000002c",
    9 |' l3 R9 e, E+ S& E                                        "00000099",0 G/ W5 u; c: P$ `3 ^6 s  P- B: k
                                            "0100000000000000",
    + s% g' s3 g& h2 E7 L                                        "0100000000000000",6 u: ~! X: e8 B9 N; |
                                            "4600000000000000"6 Y) L$ S6 S' B# n8 S. V* D
                                    ],
    ( N0 e( a0 C: F' m! Z) U2 B                                "xpub": "1c03161a08a4dbb7df153815a28f733fec1ac7579f954c4834e5ce9f0ad8deb260ecb2066a8623b69aa936f5798f4dcb9572bc476f2c8171953ce054d58a759f"
    & T0 i& T: f1 r; p5 S! L                        }],
    % i3 |# R/ s; W                        "quorum": 1,, ~$ S- h2 \4 P9 z! I
                            "signatures": null,
    9 w) ?# e% }5 i3 h; W+ e                        "type": "raw_tx_signature"
    4 c6 }: G$ ^5 G6 A                }, {( N9 G( ]" M/ Z
                            "type": "data",
    ' ^6 B/ D; H0 _# s/ V6 ^                        "value": "4f089176a5bca95ec9227b8a87dfec947c59453805bf46d3f5a18f8032255b5a"- W/ M; c# x3 d5 V' [* W+ m
                    }]8 |( Z7 L' X% }9 y7 ~6 c
            }, {) a) `* Y; j5 c7 d  g, W9 z5 g
                    "position": 1,7 [$ o' e/ ?: s' M
                    "witness_components": [{/ L1 }' o9 N* X
                            "keys": [{
    4 K) Z2 {1 {/ @: N7 j  L                                "derivation_path": [* J. N( A  @& i
                                            "0000002c",% w5 W* v$ c0 `
                                            "00000099",  Y3 G1 |% n% `- U+ C% @
                                            "0100000000000000",
    3 y: h( Q/ i/ g$ X7 E2 \1 F& |' j                                        "0100000000000000",; N7 F1 P% S) \$ w+ S
                                            "4700000000000000"
    0 p# `8 @' {! {                                ],* x! n# L( `: y7 N, c8 t( |
                                    "xpub": "1c03161a08a4dbb7df153815a28f733fec1ac7579f954c4834e5ce9f0ad8deb260ecb2066a8623b69aa936f5798f4dcb9572bc476f2c8171953ce054d58a759f"
    9 P' V$ _" @& l                        }],
    9 _. h# n( o$ a( S0 c5 j! G3 u7 S( |                        "quorum": 1,
    8 g0 J- K. ], Z$ k" }1 L6 z3 {" _                        "signatures": null,; e9 L, y2 `+ s$ D; O; V
                            "type": "raw_tx_signature"' j7 E: f0 Y, O
                    }, {
    " s+ ]4 |9 q! z! ]                        "type": "data",
    ; m" @! j( A* i                        "value": "67512f9250f559699e32c72c8af29096b1556af145f6ecc0c306e6acc88bbfaa"7 e1 X1 i5 C( B5 G" C
                    }]- F: h. ^9 N3 t8 c, ~7 F, k: R; P
            }]) p! Q; {4 @( \4 N5 I5 ^0 y6 P% U
    }
    / Y7 F, u8 G* P& j# n# V: Y}
    $ R% }' N0 n, K- q# p- V, [请求submit-transaction接口:
    6 f2 A- y. {8 w- I
    $ [1 c: ^- _) V0 ^7 N! C请求参数:
    $ p, Z& L  g) r {0 M+ V7 P% y( E) B6 k
    "raw_transaction": "0701dfd5c8d505020160015e560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0989fe3020001160014adb6632c5b10c6d5b6f97b8d1250f6e409e11c01630240c7004022db674ff2961b540d4edab846d550429ae9a92311ba375a4f452331422961fdcde3bf79631755dd12df409e24a849158d4aeab919cab81520fb7d1e02204f089176a5bca95ec9227b8a87dfec947c59453805bf46d3f5a18f8032255b5a0161015f560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd9cc5b191f3190101160014dcfd9b78c24260823e318153665d511d6c4ecb1b6302406b75ef5a9decfa31d4f5ae06e0fb14ca507ba4a03715874d1d831516945121573b9b858e4d7527d209c1f89f74e0aa4c4e38afd098cbadaff31b9107167099012067512f9250f559699e32c72c8af29096b1556af145f6ecc0c306e6acc88bbfaa03013dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0ebbcde02011600147a9baebd37dba3f14960624ed8e6ca3cc9d5f73800013e608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cdb8c4b191f31901160014f0370fdf7a7bec7b34cc62fd5291071a3dc3d9b0000147608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd6401246a2277656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c00"
    ; e, i% U8 m; _% b/ D: Y5 V  }2 N+ O( d% M) r+ t) P3 R. Y
    响应参数:- N. Q. F( f0 C$ `
    {9 }& q2 f7 A/ q" Y, C) [
    "status": "success",* I. O9 J9 B3 @0 F6 h
    "data": {
    % h& w1 S/ B4 ?6 G/ S. t    "tx_id": "5ef27b930646d468bbb436d3406972ff201aa63702518f777e31dd6a2147dddc"
    ' X/ q3 f4 {( l" P  }3 s4 b+ U7 c; |  F
    }6 _: R2 u. p6 G* [$ I' f

    5 d8 O1 L( M* I$ [0 n) B5 r6 n2 N# D用上面返回的tx_id去比原的浏览器中去查看交易详情,就可以查看到我们上传的数据$ l: e. o: Q' {# i7 u. ~5 I( g

    4 a! h7 s: M# K1 U3 l参考代码:
    1 z( [+ n! k9 Apackage main
    2 w% A" u! {; B8 l% O+ N: w+ ~import (
    % P  ?& D* n$ l$ |0 a"bytes"9 j7 s5 n) |" f5 _. e$ b3 B, E
    "encoding/json". Q1 R0 @: V- |5 M9 |; R
    "fmt"% Y- G" ~! Q9 g( Z- b
    "io/ioutil"
    & E) B) W/ K6 r8 y' |! q"net/http"
    ' G$ {- i4 w( T  `4 w)
    $ l7 T- Z  L0 c) ]! B  z//build-transaction params" X# E) @+ ?0 q* A( [3 K3 K' d
    //https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction2 ]' r+ g. F: x$ M
    type BytomAccount struct {
    ) Q, D, W. Z, B0 D( _8 mAccountId string `json:"account_id"`
    1 J' n  v4 P. C' c% iAmount    int    `json:"amount"`
    2 s3 y9 x2 {: h* H7 E, ]AssetId   string `json:"asset_id"`9 N' e: L- k: e% o. U( _
    //Arbitrary string `json:"arbitrary"`
    ( o- v8 J' H! `5 B9 H4 u" kType string `json:"type"`
    $ c$ I8 t5 w) G2 `) p}
      ?: f0 i" O! utype BytomAccount1 struct {
    5 K+ p' i" {2 E* W" y+ g2 fAccountId string `json:"account_id"`
    4 H/ _* H2 |) a( Z/ R2 lAmount    int    `json:"amount"`% {7 T" y  d3 a% C: |, c# l! o. p
    AssetId   string `json:"asset_id"`: J" O# P3 y" q: E2 G, V5 e; f8 ]
    Arbitrary string `json:"arbitrary"`1 H" u# T3 \; C! c! w" H3 S
    Type      string `json:"type"`8 ~- Z/ B# R# \' D2 u. }. U, u% A
    }- y7 h8 C. G# P2 v& v
    type BaseTransaction struct{}
    ( n' p) T& _2 L# n- q9 y! Mtype TransactionParams struct {6 o4 v+ R. G  Q- E& o  ^
    BaseTransaction *BaseTransaction `json:"base_transaction"`% F6 U2 i9 h( o: {7 b7 w( c" u- K
    Actions         []interface{}    `json:"actions"`) [+ E! E  N. x+ N: N5 j
    Ttl             int              `json:"ttl"`, u- h1 ~- f8 P  P8 l
    TimeRange       int              `json:"time_range"`
    0 G7 l5 Y* L1 d}
    6 R1 \; |3 J$ u: F//sign-transaction params
    # v. E5 @& u5 v3 U//https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction# H" u# u* T7 [/ o% y$ ?
    type Transaction struct {
    8 |% V6 M" z% s) ?' c2 N  I9 r}
    ( O( f3 Y# W6 Ptype SignParams struct {& {  m0 \5 D) F& q
    Password    string      `json:"password"`3 A4 q9 ^$ ~, m  d: l; X* l
    Transaction Transaction `json:"transaction"`
    $ ~: o+ w: n/ N( f}% Q3 p( t1 p; O1 J% @3 V; q8 `
    //submit-transaction
    . o7 P$ v2 [/ L9 ~  {1 O//https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction
    ; W- c  Z+ [* |% B: {type SubmitParams struct {$ R) W8 V. G3 h
    RawTransaction string `json:"raw_transaction"`
    6 I) o; [! ~# @$ z# ?# k}6 \. b5 v5 P2 {
    type SubmitResponse struct {
    9 c' {3 _3 w$ b9 qTxId string `json:"tx_id"`" s0 n/ |7 U- h
    }- R% H7 N1 Y0 K: Z. i
    func main() {
    1 w$ t8 s/ a2 O% k, Laccount1, account2, account3 := BytomAccount{}, BytomAccount{}, BytomAccount1{}
    ) U) C/ M. k7 T+ w' P' Vaccount1.AccountId = "0KTCS3R5G0A02"# t2 ]5 |- I. _2 P
    account1.Amount = 100000004 h  Q" S2 t- k7 w1 F1 Y# w0 ~
    account1.AssetId = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"- v. P% Z4 [+ w$ G4 L' Z% L
    account1.Type = "spend_account"& P0 [  U0 m. R
    account2.AccountId = "0KTCS3R5G0A02"+ z, P2 H* @- b, H% C
    account2.Amount = 1004 V; T0 i/ f, n
    account2.AssetId = "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd"
    + o6 r+ d% r/ q1 M7 qaccount2.Type = "spend_account"7 I3 |2 W4 H: F2 A& p- n# U4 q9 k$ m: ?! t
    account3.AccountId = "0KTCS3R5G0A02"
    . e2 Y/ o# B8 _5 Yaccount3.Amount = 100- @5 f7 P+ C. I' |* F) a
    account3.AssetId = "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd"
    , X! K# w" @6 N. X4 R) Uaccount3.Arbitrary = "77656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c"
    9 L  G* [2 d) e! c4 `/ ~" h( y$ kaccount3.Type = "retire"
    4 k  M) `9 b3 s! l6 {: G6 W$ C5 ]//var array4 w6 h  r7 g/ r7 r- J  {! Z
    var actions []interface{}
    $ a# ~. }% G- ]" V: g: d& Q' D//append three params
    ; {6 N8 s2 k- h4 _: \& C1 b% P# [7 darray_actions := append(actions, account1, account2, account3)
    " j7 V; a: u, C0 A# R4 Btransaction_params := &TransactionParams{}
      o6 H) F  Y9 L0 mtransaction_params.Actions = array_actions: w# l1 Y. C4 }3 @
    transaction_params.Ttl = 0
    # j2 q) h3 {0 u- xtransaction_params.TimeRange = 15216258232 ~* K9 h- [/ H& @1 s; B' K" |( I
    //本地测试网节点
    7 F4 L! w# M4 o: w  p+ g//build-transaction
    8 p1 w1 X9 N$ M8 h+ iport := "http://127.0.0.1:9888/build-transaction"  z7 _4 @2 I* U! F
    value, err := SendTransactionRetire(transaction_params, port)
    . [( H3 o9 _7 }( C' bif err != nil {4 p- f7 X4 P0 D4 C$ l3 T
            fmt.Println("err:", err)
    5 K1 A$ G/ s6 }, C1 M}1 C% ]- o3 ^8 ], u
    fmt.Println("build-transaction接口返回的参数:", value)
    0 w) k6 |, l" n) |9 m3 o/ T% C//sign-transaction
    ! }: p+ {; f* f6 I//...........0 e% Y# P+ Y0 l8 w7 U
    //submit-transaction) w( D% A' G4 h
    //...........
    6 I* c8 P: C: I! ]: }- j! t4 v6 B}
    & r; [- t8 B# e; b( G//send post request
    4 g: W1 ?7 h* ffunc SendTransactionRetire(params *TransactionParams, port   string) (v interface{}, err error) {
    $ o  E  T( J7 t" G//以本地测试网节点连接/ h: B5 E+ f7 N0 L! N0 G! P
    ParamsStr, err := json.Marshal(params)
    9 x& h6 T- n7 U. L* L* A/ yif err != nil {
    / z/ {9 }1 l2 f+ U( K0 o4 X; v        return nil, err2 B/ x0 f/ m% M5 {) s" F+ V/ R
    }
    ' p8 [8 m; ^+ k" h- ?. ]- XjsonStr := bytes.NewBuffer(ParamsStr)
    : W+ U' {2 M* |- T  ~0 J; W& dfmt.Println(jsonStr)* h* l* \  h# p. q2 I- A8 H
    req, err := http.NewRequest("POST", port, jsonStr)0 y& I9 c" Q+ |" _. N" M6 G4 h
    req.Header.Set("Content-Type", "application/json")
    % I: ]# B0 q3 U% I( `5 n& preq.Header.Add("Accept", "application/json")
    9 o- Y6 a$ ^4 L. _) z! ]- |client := &http.Client{}2 A/ Y* i1 p3 f$ X
    resp, err := client.Do(req)1 \6 @- l9 ~. l- t3 c( x8 {4 z
    if err != nil {
    ) S# `4 ^4 ^, s: H        panic(err)1 O5 C! V3 ^& W, [( H5 M2 G: n. H- W$ p
    }
    1 [+ Z- D% r' k' v$ |6 |defer resp.Body.Close()
    0 \: T" U" N  Q, D+ X0 ~! o( F1 |( Ovar bodyBytes []byte
    6 P9 R1 S* H* u' a4 A' Pif resp.StatusCode == 200 {  }) t  T9 [8 `& p
            bodyBytes, err = ioutil.ReadAll(resp.Body); b8 Y" Q; @7 R0 Z7 N
            if err != nil {
    " s0 Q8 N8 k8 u                return nil, err
    ' d* L/ X2 [5 D- M) `, F        }
    " I' g$ _0 g. ~}
    8 e# b0 H( j9 x% hreturn string(bodyBytes), nil7 S7 U& x7 K9 ?  q
    }
    5 j" D+ Q3 b3 o& F& V5 C& }上面的代码只是build-transaction一个步骤,另外sign-transaction和submit-transaction请求需要自己去组织参数进行请求。请求完submit-transaction 获得返回的交易hash,去区块链浏览器上查看自己的上链信息,区块链浏览器地址:http://52.82.46.157:8082/。
    ) M$ L- X  A8 ?% C3 E+ i好了,通过以上的4个步骤,我们就可以借助比原链实现信息上链。如果你有什么疑问或者不明白,请在我们的社区联系我们,https://github.com/Bytom/bytom。
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    wzls3146 小学生
    • 粉丝

      0

    • 关注

      0

    • 主题

      1