Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
私有测试网络
" |! A3 n  Z) h  ~- Q: Q9 M$ w0 |9 S
    NEOLux提供了一些方便的方法,可以用于将你的游戏连接到官方的测试网或者是主网。
; M, W3 {7 J' n" @) D* \8 t% K' q$ Y5 l8 f1 n
    但在本教程中,我们会搭建自己的私有网络。这个过车是非常简单的,一旦你克服了最初的障碍(我会引导你),你会发现这比使用测试网络更加简单。例如,尽管填写用于测试的GAS或者Tokens的申请表格可能不是世界上最困难的任务,但我发现就这样一点点小摩擦,往往会扼杀我继续的热情和动力。6 K9 p+ M5 W0 g! J$ k$ O
! ~6 T+ z* ^- U; p+ E
    你也可以在本地运行你自己的私有网络,不过在本教程中,我们将设置自己的服务器。这会使得团队工作或者构建工作这类事情更加简单直接。我将使用DigitalOcean。因为根据我的经验,他们具有良好的性价比。
9 g: Q0 V8 R0 i$ M9 K/ h1 H, q. A, W5 B0 h& [. C
    免责声明:我不是一个后端/服务器开发者,我猜“中等”水平的人应该会喜欢使用命令行工具。对于那些知道自己在做什么的人来说,这些内容应该很容易。如果你了解Linux和Docker的话,可以直接从DockerHub安装NEOPrivateNet并使用DockerCompose运行NEOSCAN。对于其他那些或多或少是我这种水平的人来说,接下来的内容应该还是相当简单直接的。
7 H4 D2 o/ E6 @/ [& @3 K6 y5 K2 q8 L2 G! e- ?2 g
    如果你还没有DigitalOcean账户的话,就去创建一个。然后使用以下选项创建一个Droplet。7 G4 U. R3 R7 q& t
; y) U7 Q3 D, m* y5 {2 u
    使用16.X或者18.X版本的Ubuntu
. p; s. u6 x8 u1 H5 f7 _4 F  @6 [
    使用中配应该就足够了–你可以在配置中自行尝试,并在评论中告诉我你的试验的结果
& P7 K; J9 a: G  R6 {5 H( \+ ?) l) o! [2 c) I& a7 o- \0 G! E. N
    SSH登入到你新建的Droplet并安装docker。如果你按照DigitalOcean提供的指南进行操作的话,这个过程将非常简单:https://www.digitalocean.com/com ... ker-on-ubuntu-18-04
6 H' I7 Z7 D' I$ i/ I* e* g3 l; l$ {( B6 x
    注意:在执行最开始的一步,向系统添加官方Docker库的GPG键这步操作时,我遇到了点小问题。我只是简单地跑了两次命令,然后一切都很顺利。& b, g$ d' }" P. U0 Z
3 n" I# K! x5 k; S. J2 m/ X
    然后安装docker组件。同样地,安装说明非常的简单。只需要确保你看的是针对Linux系统的说明就行。8 e. t) t' |; R% o/ E8 O. T
# g. s2 e, O1 S, s  _
    安装私有网络和NEOSCAN
) V5 y! q; [! i
/ E* X' [; v1 B! U    运行和安装我们自己的私有网络,这是最为困难的一步,好在CityofZion的人帮我们很好的做到了这一点。你可以点击这个链接查看他们的全部说明指导。同样地,SSH登录到你的Droplet,基本上我们只需要输入几个命令就行:9 [/ n3 \( X) j- O+ w
+ P  O, h* H3 f! s+ c& S
    首先,从hub上下载docker镜像:  g! h; P1 r( {! e
' o/ u8 c' A- h! k8 H
    dockerpullcityofzion/neo-privatenet
% L! M5 x% T/ S- l- L& B! ^, f+ U* U- \5 j
    …下载NEOSCAN…' J+ I$ L# ~6 o4 \+ ]# P

# z  [: M0 q( i$ ~4 S: C    wgethttps://raw.githubusercontent.co ... /docker-compose.yml2 v7 Q& E' e$ z! B/ u5 G

2 f6 r+ d( B& \+ p) G    …并运行privnet…
: q8 i- Q7 ~8 ]( q! K$ X) E; d, Q' Z6 J  g4 C4 O
    docker-compose-fdocker-compose-neoscan.ymlup9 A6 E% s1 ?! y$ z8 {9 z, L
( C1 \4 i2 p5 [% ]
    让它运行起来,然后转到http:your-droplet-ip-address:4000查看NEOSCAN的运行情况:0 H8 W3 F6 w5 _( G2 `
  q+ I) y+ L0 z2 \
    回到Unity* }% u. f1 Z1 S) K, }: v7 j0 P) O0 F

1 p# B& e( O4 M1 W' z    我不想在本教程中深入探讨自己的开发风格,不过我要做的一件事就是将UniRx插件导入Unity中。UniRx是对.NETReactiveExtensions的重新实现,它针对Unity做了优化处理,而且能很好地兼容iOSIL2CPP。不必过于复杂的实现,它可以简化一些管理NEO和UI的代码。
- n5 u$ P7 X6 C4 h
1 h( o$ I! C& E( P  p2 y    在资产(Assets)–>脚本(Scripts)下创建另一个名为NEOManager的脚本,并复制+粘贴以下代码:& q. v- H# G& X# [7 `4 s
5 `7 q3 C- J# [; O
    usingSystem.Collections;8 T  k0 }% t' Z7 L
' r% c8 w3 Y4 |+ r
    usingUnityEngine;1 Y+ [, N0 c6 A

' l9 O& S$ z# ~    usingSystem;
1 `( q1 ~6 L+ p3 C4 N" T4 y1 P# F. m2 \' z5 }) R
    usingUniRx;
6 R6 ?4 X0 _/ Z, m) p% m) [
% d  G  _- V* Y    usingNeo.Lux.Core;
' B( d* {, g. Y; i/ x, N' x# {2 h, c  W% y8 \3 o) D' B5 u
    usingNeo.Lux.Cryptography;
% z, v7 S5 ?2 W5 N1 i6 _+ W, ^+ {
& [' }( j' j) q    usingUnityEngine.UI;8 |! s; I# C1 [
" p9 j' W3 R  I
    publicclassNEOManager:MonoBehaviour% e; j% T# b: x# h
7 T: Y" G; x( y. q" L
    {. P% o- b7 I8 a% S* K  X+ C

4 o" N' H, w1 K$ j    publicNeoAPIAPI;
! U3 T) [, g# N2 _" [  Z5 d! h
8 F1 S& s' J, ^* i: S. |; t    [SerializeField]privatestringRpcIP;
( A: b$ Q+ j4 f% T* g
$ I3 ~. C* ~! O7 L    publicconststringAssetSymbol="GAS";/ Q: O9 b; E6 F- i, U- S0 G0 Q7 N: z. D

9 o& _& ~! @  Y, K4 `  p2 U& s    [HideInInspector]
: _% n6 {" C. {  I0 r8 h* l+ Q8 p7 q) A4 u
    publicKeyPairReactivePropertyPlayerKeyPair=newKeyPairReactiveProperty();
0 C$ T/ e1 t; l+ C( g2 e* W; X. X2 h2 ~
    [SerializeField]privateTextaddressText;% Q: k+ \& Z5 D: Q7 {1 o
% R8 D; `, r) ?  [' [5 m& A- c
    [SerializeField]privateTextbalanceText;
. W. }3 B5 U% l1 }+ b
0 A- K% f( X& O    publicDecimalGASBalance;2 `: H5 ~9 I0 O% |: M* y
3 o4 D( I( A$ N& M2 D6 R
    privatevoidOnEnable()
! C+ I. x- ^3 ?* Z# v* }# K# I) r- z; Y* W$ Q5 B
    {
, d; `+ w: |; c$ h* m6 L6 w2 ~4 H% O2 q# _
    PlayerKeyPair.Value=KeyPair.FromWIF("KxDgvEKzgSBPPfuVfw67oPQBSjidEiqTHURKSDL1R7yGaGYAeYnr");
/ ]. G5 ]9 Y: E9 K. [$ T* ?+ n
; S' S: K/ _) b5 U, q7 |# a; C# D  Y    #ifUNITY_EDITOR
% i+ y! ^* I( J- M
" h# H8 N# x3 M    //this.API=newLocalRPCNode(30333,"http://localhost");
9 u$ h( s+ F9 b5 ?& W: k+ c
$ K) B/ s5 l3 M& x5 v; P    this.API=newCustomRPC(30333,4000,"http://"+RpcIP);6 \  l3 A+ K8 r" x. o

- A9 g: Z; M' c0 o) A7 P' K! A    #else
+ m3 M* }$ \* E( p$ _+ V) @' `  A. c. @" q9 p
    //this.API=NeoRPC.ForTestNet();- B) k) A% M/ s% T: P
# g( k* ^8 K4 r# `% h3 q& z
    this.API=newCustomRPC(30333,4000,"http://"+RpcIP);  h( D' X/ Z9 h
# y! C9 P9 _' z$ u' c
    #endif
2 ^+ x( R- @0 S# H& G! [  |+ i; e- e& I
    this.PlayerKeyPair.DistinctUntilChanged().Where(kp=>kp!=null).Subscribe(keyPair=>8 {" `  A5 {5 I9 Y$ w
8 H3 ^1 p0 |, V' B! i2 j
    {) U% c/ a# y& f1 ?8 Q

( }/ F: I( t& X* y. p; m$ o    this.addressText.text="Address:"+keyPair.address;% K- V' U  i' J

/ o7 o" s5 ]3 u9 V. h$ {# k7 B    this.balanceText.text="Balance:Pleasewait,syncingbalance...";
& N% ?, M* W2 B8 F$ M" U5 x1 y' I# z# c* d( L5 r; |
    StartCoroutine(SyncBalance());0 D9 B: }  }. q5 {1 z6 l# H0 Q
; M9 w/ E1 n; @0 Y5 ]
    }).AddTo(this);7 m4 S. E# D" Q5 n# O

5 e, O, _! @2 G. M+ M% T; _    }3 c& i( G/ _+ m0 C( z; V! f

1 r5 W: G' n: F/ R4 Q& L3 k5 J    privateIEnumeratorSyncBalance(), F3 V) o$ T- Y9 n
! W- I' z' w+ K/ I( `% |
    {
/ v& }9 ~: D, a1 @' f6 ^5 p+ ?' @6 U2 V5 G( ~7 A
    yieldreturnnull;% f/ D* H$ n0 D3 S. V$ }9 S4 V" E9 ~

1 w/ ?% j& O. h: H% `! i    varbalances=this.API.GetAssetBalancesOf(this.PlayerKeyPair.Value);8 i9 E; o5 g0 ^- @: E+ a4 @
/ Z1 _% Q) G" p
    this.GASBalance=balances.ContainsKey(AssetSymbol)?balances[AssetSymbol]:0;
7 [) ^) k2 p+ E) G* y3 n3 j
7 ^4 j& ?( X* H# e7 B& N  Y1 K2 Z- \    this.balanceText.text="Balance:"+GASBalance.Value.ToString()+""+AssetSymbol;% {1 T! T! {7 ?  ]8 L
0 n) }7 m7 Q, e. Z" N
    }! K7 ^0 R; U! b

0 W2 y. _* r: `* f. l( p8 S    }
. n& L0 y* Z- x( ~
# j* \; K4 q$ ~% _6 M" H6 d; _5 o    [Serializable]
5 X5 R5 |1 x' E" I4 i8 w
2 S. ^# T; z( Y2 Q    publicclassKeyPairReactiveProperty:ReactiveProperty1 W! u5 n  T# w- }: u

. y/ M, }& \+ T    {# z+ L: Z. j4 r9 E' J9 X4 {' N& ^- U
# q6 T! Y) @6 m" l4 i+ o  J3 [
    publicKeyPairReactiveProperty(){}. W( N% {) _  p' q

/ ~) F" U# p8 s4 R2 N    publicKeyPairReactiveProperty(KeyPairinitialValue):base(initialValue){}! Q/ n3 p: }) v% _/ [5 t, m+ G
) W. u) o- {5 u2 C6 u$ H
    }
1 a( e0 U) r. k1 V3 y( ~7 D+ t& v
% f5 F' C( c5 p* t8 Z    保存脚本然后返回主场景。创建一个空的游戏对象(GameObject),将其命名为NEO,然后创建一个该NEO对象的空的游戏子对象(childGameObject),并将其命名为NEOManager,并将NEOManager脚本添加到这个NEO对象中。在检查器(inspector)中的RpcIP字段旁边输入你的Droplet的IP地址。9 D& i; V6 U7 q9 D
0 l" t$ _% U, R1 P; U
    接下来,我们将创建一些UI元素并将它们连接到检查器中,这样在连接到主网的时候,我们就可以看到余额的更新。" \3 Y; K, [5 Z0 @+ m. Z

3 S6 f+ U5 ~+ Q' F; q- r3 `; {    创建UI画布并向其中添加两个子文本元素,然后单击并将它们的引用拖动到NEOManager的“(AddressText)”和“(BalanceText)”字段。" K+ @! K% n4 _2 t$ z4 q  U* p

/ ^2 X$ C! M/ U; |: M" R/ c+ n    单击播放(Play)按钮然后查看地址和余额的更新情况。5 P! R% {  O0 x# _; c$ t( W: e
  W5 ]1 _, z4 o, h2 R8 u5 P, U2 P" q
    我们当前使用的是在安装私有网络时自动生成的测试账号。在下一部分中,我们会进行一些设置,以便我们的玩家可以输入他们自己的私钥然后开始与NEO区块链进行交互。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

往事随风760 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1