Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
私有测试网络
' @2 Q% T8 v, p* C( \; k* {! D8 X+ [6 D4 E# Q
    NEOLux提供了一些方便的方法,可以用于将你的游戏连接到官方的测试网或者是主网。) j+ z" g2 r- ~. C
" j$ A, @6 ?8 F$ L4 {
    但在本教程中,我们会搭建自己的私有网络。这个过车是非常简单的,一旦你克服了最初的障碍(我会引导你),你会发现这比使用测试网络更加简单。例如,尽管填写用于测试的GAS或者Tokens的申请表格可能不是世界上最困难的任务,但我发现就这样一点点小摩擦,往往会扼杀我继续的热情和动力。
8 z. G- I. ~' }# `
# h: P( s9 X' V! S) L7 t  h    你也可以在本地运行你自己的私有网络,不过在本教程中,我们将设置自己的服务器。这会使得团队工作或者构建工作这类事情更加简单直接。我将使用DigitalOcean。因为根据我的经验,他们具有良好的性价比。
, ?( ?' j+ T2 `- u; H5 a/ R* ~& Z$ e" D- y
    免责声明:我不是一个后端/服务器开发者,我猜“中等”水平的人应该会喜欢使用命令行工具。对于那些知道自己在做什么的人来说,这些内容应该很容易。如果你了解Linux和Docker的话,可以直接从DockerHub安装NEOPrivateNet并使用DockerCompose运行NEOSCAN。对于其他那些或多或少是我这种水平的人来说,接下来的内容应该还是相当简单直接的。6 D$ S3 H3 H$ Z7 }9 ?8 u& k) I% {
; L/ ^: ~, Q7 a6 y
    如果你还没有DigitalOcean账户的话,就去创建一个。然后使用以下选项创建一个Droplet。
2 f2 _5 j2 o) C) N7 W) r- w( o* Q& o
    使用16.X或者18.X版本的Ubuntu
  M; y( \( A, \+ T0 f5 C1 Q9 d5 o! F8 f8 s2 s  j! V+ l4 T
    使用中配应该就足够了–你可以在配置中自行尝试,并在评论中告诉我你的试验的结果
. f+ F! Z* M5 C1 _9 c9 n0 a4 q* u. N' N+ s2 p8 y( A: }
    SSH登入到你新建的Droplet并安装docker。如果你按照DigitalOcean提供的指南进行操作的话,这个过程将非常简单:https://www.digitalocean.com/com ... ker-on-ubuntu-18-04
. X. w5 z' r, c
2 V2 T1 }5 K3 x% ]! k  t% e    注意:在执行最开始的一步,向系统添加官方Docker库的GPG键这步操作时,我遇到了点小问题。我只是简单地跑了两次命令,然后一切都很顺利。7 _& V; ~0 T7 [: Y" j6 s" ?3 s7 i2 G

4 D; k' |: c. e, G, S    然后安装docker组件。同样地,安装说明非常的简单。只需要确保你看的是针对Linux系统的说明就行。
( @* N/ L% `& A
; Y) j$ O3 }/ C# l- J; `8 d    安装私有网络和NEOSCAN2 Q' ^2 k3 s# c& u

9 X' J$ J! j7 g# b+ D) [& k/ w5 h    运行和安装我们自己的私有网络,这是最为困难的一步,好在CityofZion的人帮我们很好的做到了这一点。你可以点击这个链接查看他们的全部说明指导。同样地,SSH登录到你的Droplet,基本上我们只需要输入几个命令就行:
0 ~  R6 U  Y0 \$ v! C+ P7 [+ M, u" X
0 F9 `) Z1 x1 n& }1 Y: k    首先,从hub上下载docker镜像:1 V9 U+ d3 x5 ~2 }& x) N/ J8 M
2 y: ]# Y& H# P) i
    dockerpullcityofzion/neo-privatenet( ^5 W8 K7 \# G9 C
* K8 @% E+ j( V/ ~  L2 ~% @
    …下载NEOSCAN…$ R8 O  m( T# y3 g
9 c- W, u/ _! {) j6 d2 U
    wgethttps://raw.githubusercontent.co ... /docker-compose.yml
) \- T+ y7 C; w3 f) Z
$ E! ]! d1 C7 `9 s    …并运行privnet…1 j7 H5 C' n% j( |- x( z
6 ~- J3 K1 c; K! F; v4 E
    docker-compose-fdocker-compose-neoscan.ymlup7 Y7 Z+ Y/ [2 v8 L

3 k: b. K& ~( i8 |  m! A    让它运行起来,然后转到http:your-droplet-ip-address:4000查看NEOSCAN的运行情况:. i1 f" }# M& O/ L. u' e

4 {4 f& R  Z6 C$ K7 A+ L    回到Unity
$ S  P/ }! p8 L' j' k5 z
) r" B& K' y4 @" ^" M, A    我不想在本教程中深入探讨自己的开发风格,不过我要做的一件事就是将UniRx插件导入Unity中。UniRx是对.NETReactiveExtensions的重新实现,它针对Unity做了优化处理,而且能很好地兼容iOSIL2CPP。不必过于复杂的实现,它可以简化一些管理NEO和UI的代码。8 _+ c% n9 g1 g! i- b7 ]
% s* d  P. R& A0 C: {& [* z' P! }
    在资产(Assets)–>脚本(Scripts)下创建另一个名为NEOManager的脚本,并复制+粘贴以下代码:' e' M+ E6 Q$ J% i; f

$ B% ?, n( |* w. S, w    usingSystem.Collections;- s- Z4 v8 i0 u3 }
( s+ M# b  {+ Y# w+ n3 f
    usingUnityEngine;
  m7 r) Y+ S( y7 e% i# O) L& O; b, B8 [
9 B* i( d* l1 V    usingSystem;
# k, @+ e; g$ ]8 P: @" z# D+ l# `, f* B
    usingUniRx;
. o- E( u/ C. y# z7 w; j
: }0 n) R# o1 K1 K4 ?    usingNeo.Lux.Core;9 B% I; M; Q5 J3 J. H6 t& H

7 y, C4 e5 d' q& ~, n8 R    usingNeo.Lux.Cryptography;
& ?% F2 g4 n5 c4 [8 I& s' Y
  z/ S* i0 _3 v) u0 l    usingUnityEngine.UI;) Q" r# w: Y- j4 ^. p
# U3 S6 ~+ E3 ?' E6 T3 O( {
    publicclassNEOManager:MonoBehaviour
& M9 ?& a( m! d' X3 K; F0 c+ h" w9 m. H* `5 ]( Z
    {
2 f$ T* T+ u( m7 ?! I" F2 q4 x7 R+ T$ w0 |( l
    publicNeoAPIAPI;
$ d) a8 D) _+ X; F+ h- A. J+ @1 o0 R! T6 {  b4 o
    [SerializeField]privatestringRpcIP;9 }0 G! p' J; n, e& Q5 {

3 m8 E9 O! t" M! X) k0 @    publicconststringAssetSymbol="GAS";
3 h0 Q7 Z/ e5 |. k4 D- y! X  f& s, N3 i
    [HideInInspector]
. V* G. c' i1 H, s8 K7 T7 F" T# ~
8 @# n  \$ B3 ^8 E    publicKeyPairReactivePropertyPlayerKeyPair=newKeyPairReactiveProperty();
( N& E; I# ~' o+ r- f6 L) ~  C3 H6 R# t7 F* B+ K
    [SerializeField]privateTextaddressText;5 T& @1 ]. P& Z
! J4 |/ Y; {8 Z! l+ `
    [SerializeField]privateTextbalanceText;1 f4 P& v3 e1 M5 ?4 s6 ]  O) A
5 \4 s$ r2 _$ |8 [
    publicDecimalGASBalance;; R( u8 M" `6 H( G0 x8 m

8 f9 H$ ~! e  u% L0 d& w: p    privatevoidOnEnable()) T$ c" y0 V+ L$ A  W

9 ^5 p8 @* n; F  @* g1 u4 b    {/ b" n. W8 _# z, ~2 P" Z

: u, |* g5 T1 l! c5 d    PlayerKeyPair.Value=KeyPair.FromWIF("KxDgvEKzgSBPPfuVfw67oPQBSjidEiqTHURKSDL1R7yGaGYAeYnr");
0 H& o* c) ?$ I* S9 |" v$ ?* k1 A, s% P; n
    #ifUNITY_EDITOR
) |6 S9 F2 t8 w: T" ?# O. F, ?9 C# Q( f/ ~/ h/ W4 T6 r7 c
    //this.API=newLocalRPCNode(30333,"http://localhost");) D7 ~' B/ n* A

2 ?4 C* W  Z0 h4 m2 d: `8 t4 t    this.API=newCustomRPC(30333,4000,"http://"+RpcIP);
; A* u0 a# @1 T0 a: c( ~
) [/ ]5 Q3 Q$ l- n  I+ L    #else( i6 [! |% e/ @) u4 t0 V: Q, ^

' @) L- f& m( A  p5 ^    //this.API=NeoRPC.ForTestNet();
! t  A  F  r( S1 F. l) M& H( o: M! s; z
    this.API=newCustomRPC(30333,4000,"http://"+RpcIP);
+ A! F2 i, D$ L0 g9 _- b
7 \$ v3 m1 |' M$ V9 L; n  k    #endif3 {: ^3 ?, w6 S  P! h

7 E3 S6 y, ^+ @9 b( Z    this.PlayerKeyPair.DistinctUntilChanged().Where(kp=>kp!=null).Subscribe(keyPair=>/ v  k4 b& g) l) G, ]/ q# L
4 q( a  L6 T% X. M$ @5 g, U
    {
+ X8 N" m6 L5 v' Z! T& m
) d' N  C: u8 d. s  d/ N    this.addressText.text="Address:"+keyPair.address;9 ~/ r+ j' H$ `  c" t0 P7 v
$ W. a2 g4 J8 q8 W% L. q" P' }  }
    this.balanceText.text="Balance:Pleasewait,syncingbalance...";
) s2 A- v, B: N+ a! \/ w6 U* T
! H2 \3 b+ u5 {' B( q# B    StartCoroutine(SyncBalance());. r0 Z7 T" M  U

8 X. T  S/ f( Y8 b6 V' f7 W    }).AddTo(this);
6 h2 u4 K; r1 q# N! i9 V- s8 F! F  B) _8 E: m
    }+ P+ ~) W- @& j
9 Q: @/ |1 c8 `- _, H
    privateIEnumeratorSyncBalance()2 L- n0 q; s: T+ Z5 l
0 j- x  C( a% s/ i
    {3 u9 E" _5 ~  }7 x
, v2 E) P) `6 U
    yieldreturnnull;  K2 }; {3 H) E7 m8 [" q8 B

# g4 A9 d5 C6 u) Q6 K6 N* F9 s    varbalances=this.API.GetAssetBalancesOf(this.PlayerKeyPair.Value);; m( L( |" k) T  k+ q- Q
3 I% u% W; J& X7 a3 H! l# Z
    this.GASBalance=balances.ContainsKey(AssetSymbol)?balances[AssetSymbol]:0;
0 e; I' |, K3 c0 V* o
" G; f5 L/ X. e- a' @! z" _    this.balanceText.text="Balance:"+GASBalance.Value.ToString()+""+AssetSymbol;
1 m. k0 L1 S: d% d7 u5 ~8 |/ u; Y4 R: R
    }2 T+ s4 v2 s- N" Q9 {$ e

- O' N$ l( ~0 F5 [0 Z3 h; @    }
8 O. [$ X6 i! j* h+ _9 j
$ j5 h2 q  J5 ?    [Serializable]
- x& J: o6 `- Z1 I3 J; P- ]& d
) }4 z$ }, v' a; g% k) |    publicclassKeyPairReactiveProperty:ReactiveProperty
5 ]2 }& x* W& K+ i- y, r2 n0 r& r$ l: O6 l' b
    {( l( `& e0 g0 ^9 U9 k* b

" y* c9 U8 |7 I    publicKeyPairReactiveProperty(){}
0 ^6 T( y% K$ n  n. n/ X8 \/ u$ ]1 j! _0 }0 J- E" [/ M
    publicKeyPairReactiveProperty(KeyPairinitialValue):base(initialValue){}2 Z* O  P2 N5 d6 V/ B* i

# h2 [+ `6 p" i8 W    }6 I3 a: G3 V: u$ g

% x  x5 y: x* T1 q    保存脚本然后返回主场景。创建一个空的游戏对象(GameObject),将其命名为NEO,然后创建一个该NEO对象的空的游戏子对象(childGameObject),并将其命名为NEOManager,并将NEOManager脚本添加到这个NEO对象中。在检查器(inspector)中的RpcIP字段旁边输入你的Droplet的IP地址。
+ T# j; T  _& m2 U" t( P. v. |, R! s; ?
    接下来,我们将创建一些UI元素并将它们连接到检查器中,这样在连接到主网的时候,我们就可以看到余额的更新。1 _: t8 y% x8 r' I( z, ~

0 t, |6 y/ P, t' A! E    创建UI画布并向其中添加两个子文本元素,然后单击并将它们的引用拖动到NEOManager的“(AddressText)”和“(BalanceText)”字段。
! l" c! A5 ^- {* P! d3 h6 h9 B# h4 V' u0 e* n) m
    单击播放(Play)按钮然后查看地址和余额的更新情况。
! [' f! ~& v/ Y, q! I8 e
- b" E2 A) g0 P  ]+ L' Q( O, q    我们当前使用的是在安装私有网络时自动生成的测试账号。在下一部分中,我们会进行一些设置,以便我们的玩家可以输入他们自己的私钥然后开始与NEO区块链进行交互。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

往事随风760 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1