区块链交流吧 关注:2,730贴子:22,070

开发数字货币交易所的方法

只看楼主收藏回复

区块链是什么 有什么特点 可用在那些行业 我前文中已经说了 大家可以去看看链接, 下面我给大家介绍一下搭建数字货币交易所需要什么步骤需要准备什么再分享一些源码给大家, 基本概念源码仅供参考大家有什么不懂的可以问我 区块链数字货币交易所搭建方面的有需要随时可以问我,当然搭建一个去中心化的主链数字货币交易所不是那些简单,首先需要牌照但是国内的牌照现在已经停止注册几千元的区块链牌照现在已经几十万,而且是线下交易如果没有熟人别人也不会转给你牌照,日本美国的牌照很难拿,这不是钱的事情日本拿个牌照要花几千万元人民币,而且至少要排队半年甚至几年时间时间成本太长,但是区块链技术发展到现在已经到3.0了很快就要应用到实体行业方面了相信大家也等不了几年,言归正传搭建数字货币交易所不光需要牌照开发技术,主链技术和侧链技术也不一样 还要会弄钱包.区块链浏览器.交易平台系统.场内场外.上币落地app.项目白皮书.对接主流交易所.跨境支付.货币发行系统.主链开发.基金会发起.海内外货币牌照等一系列技术,会一个技术和会全套技术是有区别的,国内能够做主链开发的也很少,看下面我先说一下从钱包到客户端


IP属地:北京1楼2018-04-09 18:26回复
    1. 管理账户信息的代码包accounts
    在以太坊源代码的accounts代码包中,呈现账户地址的最小结构体叫Account{},它的主要成员就是一个common.Address类型变量;管理Account的接口类叫Wallet,类如其名,<Wallet>声明了诸如缓存Account对象及解析Account对象等操作,管理多个<Wallet>对象的结构体叫Manager,这些类型的UML关系如下图所示:


    IP属地:北京3楼2018-04-09 18:26
    回复
      我明天再讲


      IP属地:北京6楼2018-04-09 18:29
      回复


        IP属地:北京13楼2018-04-10 10:41
        回复
          在accounts代码包内部的各种结构体/接口中,accounts.Manager在相互调用关系上无疑是处于顶端的,它本身是公共类,向外暴露包括查询单个Account,返回单个或多个Wallet对象,订阅Wallet更新事件等方法。在其内部它维持一个Wallet列表,通过每个Wallet实现类持有一组Account账户对象,并通过一个event.Feed成员变量来管理所有向它订阅Wallet更新事件的需求。
          Manager订阅Wallet的更新事件
          着重介绍一下这里的订阅(subscribe)操作,Manager的Subscribe()函数定义如下:
          [plain] view plain copy
          1. // /accounts/manager.go
          2. func (am *Manager) Subscribe(sink chan<- WallletEvent) event.Subscription {
          3. return am.feed.Subscribe(sink)
          4. }
          首先注意这个Subscribe()函数是让外部调用对象 向该Manager作订阅的操作,事实上该Manager本身也是通过相同的订阅机制去获知新添的Wallet对象,它的成员变量updates就是该Manager本身得到所订阅事件的通道。其次,Manager.Subscribe()函数只有一个chan参数,由于golang语言中channel机制的强大,订阅操作仅仅需要一个chan对象就足够了,真是简单之极,根本不必知道背后是谁发起了订阅。尽管如此,这里依然值得思考的是,究竟是什么对象向Manager发起了订阅呢?其实,向某个Manager对象订阅Wallet更新事件的,正是另外一个Manager对象,也就是<Backend>的实现类。
          得出以上这个结论,是很有意义的。后面可以了解到,accounts.Manager主要作为eth.Ethereum(或者les.Ethereum)的一个成员存在,而这个eth.Ethereum是以太坊客户端程序中最主要的部分,它以服务的形式提供几乎所有以太坊系统运行所需的功能,所以一个以太坊客户端可视为一个accounts.Manager的存在,那么真相就是,所有以太坊客户端之间在通过accouts.Manager相互订阅Wallet更新事件。
          除Manager之外,这里其他几个重要的结构体还包括:
          · event.Feed{}:它可以管理一对多的订阅模式,每个调用者提供一个chan对象,用以发送所订阅的内容。Feed{}处理的订阅内容是类型泛化的,而每一个Feed{}对象,在其生命周期内,只能处理一种类型的订阅内容,即向chan对象发送的value。Feed.Subscribe()方法返回<Subscription>接口的实现体feedSub{},Feed.Subscribe()帮助Manager实现了<Backend>所声明的方法Subscribe()。在Feed结构体内部,CaseList被用来管理所有订阅者发过来的chan对象。
          · accounts.Account{}:它的成员除了一个common.Address类型,即20bytes长的地址变量外,还有一个可选成员URL,可以是网址,也可以是本地存储的路径+文件全名。在以网址形式存在时,URL.Scheme就是网络协议名,而作为本地存储文件时,URL.Scheme是字符串常量"keystore"。
          · accounts.<Wallet>:它很像一般意义上的“钱包”,其管理的多个Account,恰似个人用户在现实中拥有的多个银行账户,每个Account上的Ether余额,可从数据库(core.state.StateDB)中查询。<Wallet>接口声明的函数中,尤其需要注意的是SignXXX(),其中SignTx()是对一个Transaction(tx)对象进行数字签名,SignHash()是对一个Hash值进行数字签名,由于任何一个对象(只要可序列化)可以作Hash运算,所以这里SignHash()其实是针对任何一个对象,尤其是Block区块作数字签名。


          IP属地:北京14楼2018-04-10 10:42
          回复
            <Wallet>是接口类型,它的实现体包括软件钱包(keystore.keystoreWallet)和硬件钱包(usbwallet.wallet),注意这里的硬件钱包是有实物的。<Wallet>之下的代码体系对于外部都不是公共的,所有向外暴露的“钱包”对象以及相关更新事件,都是以<Wallet>形式存在。
            软件实现的Wallet - keystore
            软件实现Wallet主要通过本地存储文件的方式来管理账户地址。同时,<Wallet>对象需要对交易或区块对象提供数字签名,这需要用到椭圆曲线数字签名(ECDSA)中的公钥+密钥,而每个公钥也是某个账户地址(Address)的来源,所以我们也需要本地存储ECDSA的公钥密钥信息。以太坊中这个通过本地存储文件的方案实现accounts.<Wallet>功能的机制被成为keystore。
            <Wallet>的软件钱包实现的相关代码都处于/accounts/keystore/路径下,这组代码的主要UML关系如下图:


            IP属地:北京15楼2018-04-10 10:42
            回复


              IP属地:北京16楼2018-04-10 10:43
              回复
                keystoreWallet{}:它是accounts.<Wallet>的实现类,它有一个Account对象,用来表示自身的地址,并通过Account.URL()方法,来实现上层接口<Wallet>.URL()方法;另外有一个KeyStore{}对象,这是这组代码中的核心类。
                KeyStore{}:它为keystoreWallet结构体提供所有与Account相关的实质性的数据和操作。KeyStore{}内部有两个作数据缓存用的成员:
                · accountCache类型的成员cache,是所有待查找的地址信息(Account{}类型)集合;
                · map[Address]unlocked{}形式的成员unlocked,由于unlocked{}结构体仅仅简单封装了Key{}对象(Key{}中显式含有数字签名公钥密钥对),所以map[]中可通过Address变量查找到该地址对应的原始公钥以及密钥。
                另外,KeyStore{}中有一个<keyStore>接口类型的成员storage,用来对存储在本地文件中的公钥信息Key做操作。
                Unlocked{}:公钥密钥数据类Key{}的封装类,其内部成员除了Key{}之外,还提供了一个chan类型变量abort,它会在KeyStore对于公钥密钥信息的管理机制中发挥作用。
                Key{}:存放数字签名公钥密钥的数据类,其内部显式存储了一个ecdsa.PrivateKey{}类型的成员变量,前文介绍过,Golang原生代码包中的ecdsa.PrivateKey{}中含有PublicKey{}类型的成员。而Key{}中同时携带Address类型成员变量,也可以避免公钥向地址类型转化的操作重复发生。
                <keyStore>:这个接口类型声明了操作Key的函数,注意它与KeyStore{}在名字上仅有一个字母大小写的差异。
                keyStorePassphrase{}:<keyStore>接口的实现类,它实现了以Web3 Secret Storage加密方法为公钥密钥信息进行加密管理。
                accountCache{}:在内存中缓存keystore中某个已知路径下所有Account对象,可提供由Address类型查找到对应Account对象的操作。
                fileCache{}:keystore中可观察到的文件的缓存,它可对某个路径下存放的文件进行扫描,分别返回新增文件,缺失文件,改动文件的集合。
                watcher{}:用来监测某个路径中存储的账户文件的变化,可以定时调用accountCache的方法对文件进行扫描。
                本地文件显式存储账户信息
                accountCache缓存的帐号信息,均来自于某个已知路径下存储的本地文件集合。每个文件都是JSON格式,以显式存放Address: {Address: "@Address"},所以accountCache在读取文件后,可以直接转化成Account{}对象,在代码中使用。这里以显式文件存储Address信息没有任何问题,既不用担心Address信息泄露造成危害(无法从Address反向解析出源头的ECDSA所用公钥),又可以方便代码调用。
                在使用中,watcher对象会维护一个定时器,不断的通知accountCache扫描某个给定的路径;accountCache会调用fileCache对象去扫描该路径下的文件,并根据fileCache返回的三种文件集合:新添文件、缺失文件、改动文件,在自身维护的Account集合中作相应操作。
                以本地加密文件存储公钥密钥
                Key{}通过ecdsa.PrivateKey对象从而同时携带ECDSA所用的公钥密钥,所以这里涉及到公钥密钥部分,都是针对Key对象做的操作。keystore机制中,在本地存储的是经过加密的Key对象的JSON格式,所用的加密方法被称为Web3 Secret Storage,其实现细节可在ethereum git wiki上找到。下图是该存储方式的简单示意图:


                IP属地:北京17楼2018-04-10 10:43
                收起回复


                  IP属地:北京18楼2018-04-10 10:43
                  回复


                    IP属地:北京20楼2018-04-10 10:44
                    回复
                      pkg accounts/usbwallet中 主要的结构包括wallet{}, Hub{}以及<driver>接口。
                      · wallet{}结构体实现了上层接口accounts.<Wallet>,向外提供accounts.<Wallet>的函数实现;
                      · <driver> 接口从命名就看得出来,它用来封装下层硬件实现钱包的代码。尽管严格来说,这个接口及其实现体跟一般意义上的"驱动程序"没什么关系。
                      · ledgerDriver{},trezorDriver{} 分别对应于两家供应商发布的硬件数字货币钱包,Ledger 和 Trezor 分别是品牌名。它们都可以支持包括以太币在内的多种数字货币。
                      · <Hub> 结构体,它实现了上层accounts.<Backend>接口,地位相当于account.Manager。从代码来看,所有硬件实现的<Wallet>部分,都会由这个Hub对象来管理。Hub{}向外以<Backend>接口的形式暴露,这样更上层的代码就不必区分下层钱包的具体实现是软件还是硬件了。
                      需要注意的是,在目前以太坊的主干代码中,硬件实现钱包有关数字签名部分,目前只能提供针对交易进行原生的数字签名功能,即仅仅<Wallet>.SignTx()函数可用,其他签名功能包括SignHash(),以及SignXXXWithPassphrase()均不支持,不知道其他分支代码是否有所不同。
                      2. Ethereum服务
                      在了解accounts代码包之后,我们就可以来看看以太坊源代码中最著名的类型,同时也是客户端程序中最核心的部分 - eth.Ethereum。能够以整个系统名命名的结构体类型,想必功能应该非常强大,下图是它的一个简单UML图:


                      IP属地:北京21楼2018-04-10 10:45
                      收起回复


                        IP属地:北京22楼2018-04-10 10:46
                        回复
                          上图中央就是eth.Ethereum类型,四周都是它的成员变量类型,我们来看看其中哪些是已经了解过的:
                          · ethdb.<Database> 是对应于core.state.StateDB{}的函数接口,有了<Database>接口类型的成员变量,可以在使用中调用StateDB{}
                          · consensus.<Engine> 是共识算法代码包向外暴露的函数接口,其实现包括基于PoW的Ethash算法,和基于PoA的Clique算法。
                          · accounts.Manager 是管理账户信息和数字签名公钥密钥信息的代码。
                          · miner.Miner 是挖掘新区块的代码,它可以管理挖掘新区块的整个流程,调用consensus.<Engine>完成新区块的授勋/认证,并向外广播 新区块事件。
                          · core.TxPool 是积累新交易(Transaction, tx)对象的代码,每个新挖掘区块,都需要从TxPool中监听Tx更新事件并获取新交易集合以组装成新区块。
                          · core.BlockChain 是管理整个区块链数据结构的结构体。
                          以上这些都是前文中都已经具体介绍过的代码部分,接着再来看看那些新的类型:
                          · node.<Service>,这是客户端程序用以对节点进行功能抽象的接口。每个客户端都把自身视为网络中的一个节点(node),这个节点向外所提供的所有功能,由<Service>接口来定义。
                          · <LesServer>:实现LES协议的函数接口,eth.<LesServer>其实是为了调用les.LesServer{}而专门创建的本地函数接口。
                          · EthApiBackend, 它是帮助Ethereum把各项功能以RPC 服务(service)的方式暴露出去的模块,外部调用方以API的方式调用这些功能/服务。
                          · ProtocolManager,用来管理p2p通信。以太坊内部把每个个体(peer)与其他个体群之间的通信协议称为一种基于p2p通信协议的新协议。考虑到eth.Ethereum提供功能的全面性,它也被称为全节点服务的通信协议。
                          · ProtocolManager的成员变量中,Fetcher用以接收其他个体发来的宣布挖掘出新区块的消息并决定向对方获取需要的部分,Downloader负责整个区块链结构的同步(下载)。
                          特别介绍下LES:Light Ethereum Subprotocol(LES) 是为轻量级客户端专门设计的子协议。相比于eth.Ethereum提供全节点服务的客户端,那些轻量级客户端不参与挖掘新区块,在与其他节点的通信中仅仅下载每个区快的头部(Block.Header),对于区块链的其他部分仅仅按需对部分同步。eth.Ehereum同时也支持LES,这样一个提供全节点服务的客户端就可以与其他轻量级客户端以相同的协议通信了。
                          对数字货币稍有了解的人应该都清楚p2p通信协议对于此类“去中心化”系统的重大意义。的确,把p2p通信协议称为以太坊系统的基石之一都不为过,从代码角度考虑, ProtocolManager及其代码族 也属于eth代码包的一部分,不过由于这部分代码比较复杂,会在下一篇文章中专门介绍这些通信协议的实现细节。
                          3.以太坊客户端程序
                          在了解eth.Ethereum这个核心服务之后,客户端执行程序也就呼之欲出了。首先有一个node.Node{}作为承载类似eth,Ethereum这样服务模块的容器:


                          IP属地:北京23楼2018-04-10 10:46
                          回复


                            IP属地:北京24楼2018-04-10 10:47
                            回复