精华内容
下载资源
问答
  • 以太坊代币 1.0版本中,原0.6版本中的“Membership Service”已经被“以太坊代币 CA”所替代。 以太坊代币 CA是Hyperledger 以太坊代币的证书颁发机构,它提供的功能如下: 1)身份的注册,或连接到LDAP作为...

    区块链爱好者(QQ:53016353)

    1. 整体概览



    在以太坊代币 1.0版本中,原0.6版本中的“Membership Service”已经被“以太坊代币 CA”所替代。


    以太坊代币 CA是Hyperledger 以太坊代币的证书颁发机构,它提供的功能如下:
    1)身份的注册,或连接到LDAP作为用户注册表;
    2)发放登记证书(ECerts);
    3)发布交易证书(TCerts),在Hyperledger 以太坊代币 blockchain上进行交易时提供匿名性和不可链接性;
    4)证书更新和撤销。


    以太坊代币 CA包含一个client端和一个server端。在以太坊代币 1.0版本中,CA可以脱离Docker镜像,作为一个独立的服务来运行。若使用docker启动,所有的CA服务都是在一个专门的镜像(名称类似于“ca”)中进行执行。


    以太坊代币 CA提供了两种访问方式调用Server服务,一种是通过Client调用,另一种是通过SDK调用。两种调用都是REST风格的。SDK的API接口位于以太坊代币-ca工程的 以太坊代币-ca/swagger/swagger-以太坊代币-ca.json。本文使用的是通过Client调用。


    1.1 以太坊代币 CA整体架构图




    [1]


    Server端由一个集群组成,包括前端的一个高可用的代理服务器,连接着若干个CA Server集群,这些集群将数据共同存放在同一个数据服务器上。数据库可能是MySQL、LDAP、PostgresSQL或者SQLite。


    1.2 以太坊代币 CA运行流程的时序图




    具体步骤包括:


    1) Server端初始化
    2) CA根证书生成
    3) Server端启动服务
    4) Client端向Server端请求登记
    5) Server端向Client端返回登记证书ECert
    6) Client端向Server端请求注册节点
    7) Server端向Client端返回节点注册信息结果
    8) Client端向Server端请求登记节点
    9) Server端生成TCert,存入数据库
    10) Server端向Client端返回登记结果




    2. 安装


    2.1 Dokcer启动


    2.1.1 拉取镜像


    docker pull hyperledger/以太坊代币-ca:x86_64-1.0.0-alpha


    2.1.2 使用Docker-Compose启动


    将下部分代码添加到 中的service中,使用 docker-compose up 启动ca服务节点


      ca:
        image: hyperledger/以太坊代币-ca:x86_64-1.0.0-alpha
        container_name: 以太坊代币-ca
        ports:
          - "8888:8888"
        environment:
          - 以太坊代币_CA_HOME=/etc/hyperledger/以太坊代币-ca
        volumes:
          - "./以太坊代币-ca:/etc/hyperledger/以太坊代币-ca"
        command: sh -c '以太坊代币-ca-server start -b admin:adminpw'


    2.2 Native启动


    2.2.1前提条件


    - Go 1.7版本或以上
    - GOPATH环境配置正确
    - 安装libtool和libtdhl-dev


    2.2.2 安装方法


    可直接使用“go get”命令进行安装。“go get”相当于“git clone”+“go install”


    #go get -u github.com/hyperledger/以太坊代币-ca/cmd/...


    后续的操作和在Docker中类似,这里我们主要讲Docker启动的情况。


    3. 以太坊代币-CA-Server


    官方说明如下:


    Hyperledger 以太坊代币 Certificate Authority Server


    Usage:
      以太坊代币-ca-server [command]


    Available Commands:
      init        Initialize the 以太坊代币-ca server
      start       Start the 以太坊代币-ca server


    Flags:
          --address string                  Listening address of 以太坊代币-ca-server (default "0.0.0.0")
      -b, --boot string                     The user:pass for bootstrap admin which is required to build default config file
          --ca.certfile string              PEM-encoded CA certificate file (default "ca-cert.pem")
          --ca.chainfile string             PEM-encoded CA chain file (default "ca-chain.pem")
          --ca.keyfile string               PEM-encoded CA key file (default "ca-key.pem")
      -n, --ca.name string                  Certificate Authority name
      -c, --config string                   Configuration file (default "以太坊代币-ca-server-config.yaml")
          --csr.cn string                   The common name field of the certificate signing request to a parent 以太坊代币-ca-server
          --csr.serialnumber string         The serial number in a certificate signing request to a parent 以太坊代币-ca-server
          --db.datasource string            Data source which is database specific (default "以太坊代币-ca-server.db")
          --db.tls.certfiles string         PEM-encoded comma separated list of trusted certificate files (e.g. root1.pem, root2.pem)
          --db.tls.client.certfile string   PEM-encoded certificate file when mutual authenticate is enabled
          --db.tls.client.keyfile string    PEM-encoded key file when mutual authentication is enabled
          --db.tls.enabled                  Enable TLS for client connection
          --db.type string                  Type of database; one of: sqlite3, postgres, mysql (default "sqlite3")
      -d, --debug                           Enable debug level logging
          --ldap.enabled                    Enable the LDAP client for authentication and attributes
          --ldap.groupfilter string         The LDAP group filter for a single affiliation group (default "(memberUid=%s)")
          --ldap.url string                 LDAP client URL of form ldap://adminDN:adminPassword@host[:port]/base
          --ldap.userfilter string          The LDAP user filter to use when searching for users (default "(uid=%s)")
      -p, --port int                        Listening port of 以太坊代币-ca-server (default 7054)
          --registry.maxenrollments int     Maximum number of enrollments; valid if LDAP not enabled
          --tls.certfile string             PEM-encoded TLS certificate file for server's listening port (default "ca-cert.pem")
          --tls.enabled                     Enable TLS on the listening port
          --tls.keyfile string              PEM-encoded TLS key for server's listening port (default "ca-key.pem")
      -u, --url string                      URL of the parent 以太坊代币-ca-server


    Use "以太坊代币-ca-server [command] --help" for more information about a command.


    3.1 初始化Server服务


    3.1.1 指令介绍


    # 以太坊代币-ca-server init -b admin:adminpw


    -b在这里指的是bootstrap,也就是启动加载状态。


    有一个名为 以太坊代币-ca-server-config.yaml 的配置文件会在节点启动时自动生成。我们也可以根据里面的内容自定义配置CSR信息,使用 --config 文件名来进行启动配置。


    CSR为“Certificate Signing Request”的缩写,即证书签名请求。


    目前在keys中支持的算法和相关长度如下:




    以太坊代币-CA 1.0支持MySQL、LDAP、PostgresSQL和SQLite,这里配置用的是默认的SQLite。其他配置方法暂且不表。


    3.1.2 示例


    root@0f86c3e1cf15:/etc/hyperledger/以太坊代币-ca# 以太坊代币-ca-server init -b admin:adminpw
    2017/03/21 08:54:23 [INFO] Configuration file location: /etc/hyperledger/以太坊代币-ca/以太坊代币-ca-server-config.yaml
    2017/03/21 08:54:23 Initialize BCCSP [SW]
    2017/03/21 08:54:23 [INFO] The CA key and certificate files already exist
    2017/03/21 08:54:23 [INFO] Key file location: /etc/hyperledger/以太坊代币-ca/ca-key.pem
    2017/03/21 08:54:23 [INFO] Certificate file location: /etc/hyperledger/以太坊代币-ca/ca-cert.pem
    2017/03/21 08:54:23 [INFO] Initialized sqlite3 data base at /etc/hyperledger/以太坊代币-ca/以太坊代币-ca-server.db
    2017/03/21 08:54:23 [INFO] Initialization was successful


    3.2 启动Server服务


    3.2.1 指令介绍


    以太坊代币-ca-server start -b <admin>:<adminpw>


    这里,默认调用的启动配置文件为以太坊代币-ca-server-config.yaml,如果需要自定义配置,还是使用 --config 文件名来进行启动配置。
    成功后,server端会在预先配置的环境路径下生成相应的ca证书文件,并在配置的端口号上进行服务监听。这里我们在端口8888上进行监听。


    3.2.2 示例


    root@0f86c3e1cf15:/etc/hyperledger/以太坊代币-ca# 以太坊代币-ca-server start -b admin:adminpw
    2017/03/21 08:54:50 [INFO] Configuration file location: /etc/hyperledger/以太坊代币-ca/以太坊代币-ca-server-config.yaml
    2017/03/21 08:54:50 Initialize BCCSP [SW]
    2017/03/21 08:54:50 [INFO] The CA key and certificate files already exist
    2017/03/21 08:54:50 [INFO] Key file location: /etc/hyperledger/以太坊代币-ca/ca-key.pem
    2017/03/21 08:54:50 [INFO] Certificate file location: /etc/hyperledger/以太坊代币-ca/ca-cert.pem
    2017/03/21 08:54:50 [INFO] Initialized sqlite3 data base at /etc/hyperledger/以太坊代币-ca/以太坊代币-ca-server.db
    2017/03/21 08:54:50 [INFO] Listening at http://0.0.0.0:8888


    4. 以太坊代币-CA-Client


    官方说明如下:


    Hyperledger 以太坊代币 Certificate Authority Client


    Usage:
      以太坊代币-ca-client [command]


    Available Commands:
      enroll      Enroll user
      getcacert   Get CA certificate chain
      reenroll    Reenroll user
      register    Register user
      revoke      Revoke user


    Flags:
      -c, --config string                Configuration file (default "/etc/hyperledger/以太坊代币-ca/clients/admin/以太坊代币-ca-client-config.yaml")
          --csr.cn string                The common name field of the certificate signing request to a parent 以太坊代币-ca-server
          --csr.serialnumber string      The serial number in a certificate signing request to a parent 以太坊代币-ca-server
      -d, --debug                        Enable debug level logging
          --enrollment.hosts string      Comma-separated host list
          --enrollment.label string      Label to use in HSM operations
          --enrollment.profile string    Name of the signing profile to use in issuing the certificate
          --id.affiliation string        The identity's affiliation
          --id.attr string               Attributes associated with this identity (e.g. hf.Revoker=true)
          --id.maxenrollments int        The maximum number of times the secret can be reused to enroll.
          --id.name string               Unique name of the identity
          --id.secret string             The enrollment secret for the identity being registered
          --id.type string               Type of identity being registered (e.g. 'peer, app, user')
      -M, --mspdir string                Membership Service Provider directory (default "msp")
      -m, --myhost string                Hostname to include in the certificate signing request during enrollment (default "0f86c3e1cf15")
          --tls.certfiles string         PEM-encoded comma separated list of trusted certificate files (e.g. root1.pem, root2.pem)
          --tls.client.certfile string   PEM-encoded certificate file when mutual authenticate is enabled
          --tls.client.keyfile string    PEM-encoded key file when mutual authentication is enabled
          --tls.enabled                  Enable TLS for client connection
      -u, --url string                   URL of 以太坊代币-ca-server (default "http://localhost:7054")


    Use "以太坊代币-ca-client [command] --help" for more information about a command.


    4.1启动用户登记


    4.1.1 指令介绍


    #以太坊代币-ca-client enroll -u 


    登记启动用户会在用户的home路径下生成登记证书文件ECert。


    4.1.2 示例


    root@0f86c3e1cf15:/etc/hyperledger/以太坊代币-ca# 以太坊代币-ca-client enroll -u http://admin:adminpw@localhost:8888
    2017/03/21 08:59:09 [INFO] User provided config file: /etc/hyperledger/以太坊代币-ca/以太坊代币-ca-client-config.yaml
    2017/03/21 08:59:09 [INFO] Configuration file location: /etc/hyperledger/以太坊代币-ca/以太坊代币-ca-client-config.yaml
    2017/03/21 08:59:09 Initialize BCCSP [SW]
    2017/03/21 08:59:09 [INFO] received CSR
    2017/03/21 08:59:09 [INFO] generating key: ECDSA-256
    2017/03/21 08:59:09 [INFO] encoded CSR
    2017/03/21 08:59:09 [INFO] Stored client key at /etc/hyperledger/以太坊代币-ca/msp/keystore/key.pem
    2017/03/21 08:59:09 [INFO] Stored client certificate at /etc/hyperledger/以太坊代币-ca/msp/signcerts/cert.pem
    2017/03/21 08:59:09 [INFO] Stored CA certificate chain at /etc/hyperledger/以太坊代币-ca/msp/cacerts/.pem


    4.2 新身份注册


    4.2.1 指令介绍


    # 以太坊代币-ca-client register


    在注册阶段,server端需要检查被注册对象的两方面内容:


    1 被注册的对象的角色一定要在预先配置的“hf.Registrar.Roles”属性中约定的范围内。比如,如果“hf.Registrar.Roles”约定的角色包括“peer”和“client”,那么被注册对象就只能是这两个角色中的一个,如果被注册对象的角色为“user”,那么注册就不能被通过。

    2 被注册对象的从属关系参数一定要归属于预先配置的组织属性。换句话说,被注册对象的affiliation参数一定要是预先配置的affiliation参数的一个前缀。例如,假设预先配置的组织关系为:“a.b.c”,那么新注册的对象的affiliation属性可以是“a.b.c”,也可以是“a.b”,但“a.c”就不能通过注册。
    下面是id配置的一个示例:


    id:
      name: MyPeer1
      type: peer
      affiliation: org1.department1
      attributes:
        - name: SomeAttrName
          value: SomeAttrValue
        - name: foo
          value: bar


    如果想要在后面允许对这个ID进行注销,在这里配置的attributes中要包含“hf.Revoker”,即:


      attributes:
        - name: hf.Revoker
          value: true


    4.2.2 示例


    root@0f86c3e1cf15:/etc/hyperledger/以太坊代币-ca# 以太坊代币-ca-client register --id.name cliTest00
    2017/03/21 09:05:16 [INFO] User provided config file: /etc/hyperledger/以太坊代币-ca/clients/admin/以太坊代币-ca-client-config.yaml
    2017/03/21 09:05:16 Initialize BCCSP [SW]
    2017/03/21 09:05:16 [INFO] Configuration file location: /etc/hyperledger/以太坊代币-ca/clients/admin/以太坊代币-ca-client-config.yaml
    Password: oLtPkJRCzdTH


    这里随机生成了一个Password,将在后面的节点登记中用到。
    在指令中使用flag来临时自定义用户名和密码:--id.name <用户名> --id.secret <密码>


    4.3 节点身份登记


    4.3.1 指令介绍


    官方文档上说,在节点身份登记之前,要先指定以太坊代币_CA_CERT_FILE和以太坊代币_CA_KEY_FILE两个环境变量,生成的peer.pem和key.pem两个证书文件作为TCert。但是我的试验中,生成的证书文件路径仍然是在以太坊代币_CA_CLIENT_HOME相应的路径下,不知是否是仍然存在的bug。


    # export 以太坊代币_CA_CERT_FILE=$MSP_DIR/signcerts/peer.pem
    # export 以太坊代币_CA_KEY_FILE=$MSP_DIR/keystore/key.pem
    以太坊代币-ca client enroll -u http://<peer ID>:<password>@localhost:port


    这里Peer ID为注册时的id name,password为上文提到的注册时生成的密码。


    4.3.2 示例


    root@0f86c3e1cf15:/etc/hyperledger/以太坊代币-ca# 以太坊代币-ca-client enroll -u http://cliTest00:oLtPkJRCzdTH@localhost:8888
    2017/03/21 09:07:48 [INFO] User provided config file: /etc/hyperledger/以太坊代币-ca/clients/admin/以太坊代币-ca-client-config.yaml
    2017/03/21 09:07:48 [INFO] Configuration file location: /etc/hyperledger/以太坊代币-ca/clients/admin/以太坊代币-ca-client-config.yaml
    2017/03/21 09:07:48 Initialize BCCSP [SW]
    2017/03/21 09:07:48 [INFO] received CSR
    2017/03/21 09:07:48 [INFO] generating key: ecdsa-256
    2017/03/21 09:07:48 [INFO] encoded CSR
    2017/03/21 09:07:48 [INFO] Stored client key at /etc/hyperledger/以太坊代币-ca/clients/admin/msp/keystore/key.pem
    2017/03/21 09:07:48 [INFO] Stored client certificate at /etc/hyperledger/以太坊代币-ca/clients/admin/msp/signcerts/cert.pem
    2017/03/21 09:07:48 [INFO] Stored CA certificate chain at /etc/hyperledger/以太坊代币-ca/clients/admin/msp/cacerts/.pem


    4.4 身份重登记


    4.4.1 指令介绍


    # 以太坊代币-ca-client reenroll


    当登记的身份过期时,可以利用reenroll命令对身份进行重新登记。注意,这个指令后面不能添加登记的名称和密码,只是按照之前配置好的内容进行重新登记。


    4.4.2 示例


    root@0f86c3e1cf15:/etc/hyperledger/以太坊代币-ca# 以太坊代币-ca-client reenroll
    2017/03/21 10:11:36 [INFO] User provided config file: /etc/hyperledger/以太坊代币-ca/clients/admin/以太坊代币-ca-client-config.yaml
    2017/03/21 10:11:36 Initialize BCCSP [SW]
    2017/03/21 10:11:36 [INFO] Configuration file location: /etc/hyperledger/以太坊代币-ca/clients/admin/以太坊代币-ca-client-config.yaml
    2017/03/21 10:11:36 [INFO] received CSR
    2017/03/21 10:11:36 [INFO] generating key: ecdsa-256
    2017/03/21 10:11:37 [INFO] encoded CSR
    2017/03/21 10:11:37 [INFO] Stored client key at /etc/hyperledger/以太坊代币-ca/clients/admin/msp/keystore/key.pem
    2017/03/21 10:11:37 [INFO] Stored client certificate at /etc/hyperledger/以太坊代币-ca/clients/admin/msp/signcerts/cert.pem
    2017/03/21 10:11:37 [INFO] Stored CA certificate chain at /etc/hyperledger/以太坊代币-ca/clients/admin/msp/cacerts/.pem


    4.5 证书或身份撤销


    4.5.1 指令介绍


    Usage:
      以太坊代币-ca-client revoke [flags]


    Flags:
      -a, --aki string      AKI
      -e, --eid string      Enrollment ID (Optional)
      -r, --reason string   Reason for revoking
      -s, --serial string   Serial Number


    官方给出的说明有些错误,被标(Optional)的应该是“Reason for revoking”部分。实际上,要求指令后面的flag内容为下面两种格式中的一种:


    以太坊代币-ca-client revoke -a xxx -s yyy -r <reason>





    以太坊代币-ca-client revoke -e <enrollment_id> -r <reason>


    支持的<reason>包括:


    Reasons:
    - unspecified
    - keycompromise
    - cacompromise
    - affiliationchange
    - superseded
    - cessationofoperation
    - certificatehold
    - removefromcrl
    - privilegewithdrawn
    - aacompromise


    AKI(Authority Key Identifier)和Serial Number都是在身份登记后生成的cert.pem文件中。我们需要对这个文件进行解析。可以使用OpenSSL进行解析:


    root@xiao-virtual-machine:/home/xiao/test/以太坊代币-ca/clients/admin/msp/signcerts# openssl x509 -in cert.pem -text -noout -serial
    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number:
                4a:ad:ce:89:16:9d:36:23:99:c5:37:7a:e9:2b:06:d7:8a:f3:f3:da
        Signature Algorithm: ecdsa-with-SHA256
            Issuer: C=US, ST=North Carolina, O=Hyperledger, OU=以太坊代币, CN=以太坊代币-ca-server
            Validity
                Not Before: Mar 21 09:21:00 2017 GMT
                Not After : Feb 17 17:21:00 2018 GMT
            Subject: C=US, ST=North Carolina, O=Hyperledger, OU=以太坊代币, CN=test001
            Subject Public Key Info:
                Public Key Algorithm: id-ecPublicKey
                    Public-Key: (256 bit)
                    pub: 
                        04:8a:ff:a4:44:2c:10:e5:4c:4e:7d:7d:0f:bb:28:
                        aa:c0:30:b8:53:2c:0d:1d:26:92:c9:85:7c:0d:24:
                        7a:c0:25:5c:18:c9:f7:fa:d2:53:e9:00:00:99:d1:
                        04:30:a1:d5:dd:a1:3c:30:37:5a:f9:70:e5:aa:6e:
                        89:6c:54:ad:18
                    ASN1 OID: prime256v1
            X509v3 extensions:
                X509v3 Key Usage: critical
                    Certificate Sign
                X509v3 Basic Constraints: critical
                    CA:FALSE
                X509v3 Subject Key Identifier: 
                    6F:76:CA:12:7D:20:5F:27:6F:93:55:15:48:F1:32:6C:83:2A:F6:03
                X509v3 Authority Key Identifier: 
                    keyid:A5:1F:27:F8:09:78:46:4D:63:A8:23:48:B3:B4:01:1D:FB:FF:C9:43


                X509v3 Subject Alternative Name: 
                    DNS:38cdca9067ac
        Signature Algorithm: ecdsa-with-SHA256
             30:46:02:21:00:a6:3e:33:78:e2:59:8c:e2:ba:6f:0f:7b:01:
             66:5d:67:08:af:81:de:1b:47:20:c1:00:e5:11:ba:1e:7a:f1:
             f2:02:21:00:95:1a:31:06:6e:ab:cd:91:85:02:38:8c:72:87:
             70:8e:e5:bc:7d:a8:0f:05:a1:55:60:c9:49:a0:72:1d:a1:11
    serial=4AADCE89169D362399C5377AE92B06D78AF3F3DA


    这里,AKI为


    A5:1F:27:F8:09:78:46:4D:63:A8:23:48:B3:B4:01:1D:FB:FF:C9:43


    (需要去除冒号),Serial Number为


    4AADCE89169D362399C5377AE92B06D78AF3F3DA


    4.5.2 示例


    root@0f86c3e1cf15:/etc/hyperledger/以太坊代币-ca# 以太坊代币-ca-client revoke -e test01   
    2017/03/21 11:11:05 [INFO] User provided config file: /etc/hyperledger/以太坊代币-ca/clients/admin/以太坊代币-ca-client-config.yaml
    2017/03/21 11:11:05 Initialize BCCSP [SW]
    2017/03/21 11:11:05 [INFO] Configuration file location: /etc/hyperledger/以太坊代币-ca/clients/admin/以太坊代币-ca-client-config.yaml
    2017/03/21 11:11:05 [INFO] Revocation was successful


    这里只是表述了通过eid进行撤销的方式,另一种方法总是不能成功,与Hyperledger项目组的成员沟通后,说是存在bug,目前仍在修复中。所以这里暂且不表。


    5. 其他


    5.1 优先级


    命令执行的优先级从高到低依次是:


    1 命令行flag
    2 环境变量
    3 配置文件
    展开全文
  • 要理解以太坊代币 PrivateNetwork 先要理解以太坊代币的两种官方网络,目前以太坊代币官方提供了两种网络: 生产环境网络 测试网络 TestNet 下面将分别简单讲解下这两种网络。 以太坊代币生产网络 以太...

    区块链爱好者(QQ:53016353) 

    要理解以太坊代币 PrivateNetwork 先要理解以太坊代币的两种官方网络,目前以太坊代币官方提供了两种网络:



    生产环境网络
    测试网络 TestNet
    下面将分别简单讲解下这两种网络。


    以太坊代币生产网络
    以太坊代币的生产网络顾名思义,也就是产生真正有价值的 的以太币的网络。 目前生产网络目前已经生成了300万以上的区块,还在持续生成中。挖矿挖出来的每个以台币在10美金以上。 生产环境下的以太坊代币状态时如此的(截图自2017-02-17)


    p1


    生产环境网络优点


    全球化的,部署在Internet环境上的,
    智能合约的代码,执行,区块的调用,都可以清晰的查看到。
    部署在生产环境上的智能合约,全世界任何应用都可以调用
    缺点:


    任何合约执行都会消耗真实的以太币,也就是真实的现金。不适合开发、调试和测试,
    所有节点是全球化的,速度较慢
    且对于部分商业应用来说,只需要一部分节点,例如分布式部署的10-20台服务器即可。而不需要遍布全球的网络。
     


    以太坊代币测试网络 TestNet
     


    以太坊代币的测试网络也是官方提供的,顾名思义就是专供用户来开发、调试和测试的。 上面的合约执行不消耗真实的以太币。也就是不花钱


    所以如果开发简单的智能合约的话,用测试网络也就足够了,用户可以把更多的精力集中在智能合约的编写上。


    但因为网络是官方提供的,因此对于以太坊代币技术的底层实现、Geth的各种参数接口、整个以太坊代币的技术真实性能的理解就会弱很多。所以从开发的角度来说,一个更好的选择是Private Network,可以从技术的底层去深入理解以太坊代币。


    测试环境网络优点


    合约执行不消耗真实货币
    全球化的,部署在Internet环境上的,
    智能合约的代码,执行,区块的调用,都可以清晰的查看到。
    部署在测试环境上的智能合约,全世界任何应用都可以调用
    缺点:


    所有节点是全球化的,速度较慢
    测试网络不可能作为商业应用的实际落地环境
     


    以太坊代币私有网络 PrivateNetwork
     


    以太坊代币的私有网络,顾名思义就是由用户自己通过Geth创建的私有网络,是一个非常适合开发、调试和测试的网络


    优点


    方便开发者深入理解以太坊代币的技术底层
    因为节点相对较少,速度较快
    用户可以随时创建,随时销毁,随时重建一个以太坊代币网络
    随意的增加节点数目,或者删除节点,
    既可以在服务器上建立,也可以在自己的windows或者Mac机器上建立,
    甚至一台机器可以建立多个节点,在一台机器上实现多节点的私有网络。
    缺点


    因为不是全球化的,只有在私有网络内的节点才能查看智能合约的执行、调用等。
    下一章讲解:实战搭建私有网络!


    在本章中我们将实战如何使用Geth,如何搭建以太坊代币的私有网络。


    之前说过Geth是三种实现以太坊代币协议的工具之一,由于Geth是官方推崇的以及个人精力有限,对于另外两种工具的搭建私有网络,请参考网上资料。
    下面的Geth实战,在MacBook上实现,对于Windows方面,比较类似。
     


    Step 1: 建立目录和genesis.json
     


    在命令行模式创建一个目录,例如tmpPrivate
    p2


    创建文件genesis.json, 并填入如下内容。
    {
      "nonce": "0x0000000000000042",
      "timestamp": "0x0",
      "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
      "extraData": "0x0",
      "gasLimit": "0x80000000",
      "difficulty": "0x1",
      "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
      "coinbase": "0x3333333333333333333333333333333333333333",
      "alloc": {     }
    }
    用户可以vim,也可以用其他编辑器如sublime等,个人推荐使用Atom
    Atom 官网地址: https://atom.io/
    Atom 是一个由谷歌支持发布的文本编辑器, 一个你可以自定义做任何事情的现代编辑器,后面涉及文件和代码演示会主要在Atom上执行。
    创建完成后,在Atom中,本文件夹下应该只有一个genesis.json


    p3


     


    Step 2: 执行命令,创建创世区块
     


    切换回命令行,执行命令,制造创世区块
    geth --datadir "./" init genesis.json
    执行结果如下:


    p4


    这时候可以注意一下,此时当前目录下面会新增出两个文件夹geth和keystore
    geth中保存的是区块链的相关数据


    keystore中保存的是该链条中的用户信息


    此时从Atom中看到的目录结构是这样的:


    p5


     


    Step 3:创建自己的私有链条
     


    执行一条最简单的geth命令,来创建自己的私有链条
    geth --datadir "./" --nodiscover console 2>>geth.log
    geth的参数项目很多,有兴趣的可以打geth –help 来获得详细信息,我们也会在之后的章节中对关键参数项进行说明。
    此时的命令行应该是这样的:
    p6


     


    Step 4:在自己的私有链条上创建用户
     


    输入命令eth.accounts, 我们会发现返回值为[]
    这是因为此时虽然以太坊代币的私有链已经被创造出来,但还没有任何账户。


    输入命令personal.newAccount("xxx"), 该命令将创造一个新的用户,该用户的密码是xxx. 当然用户也可以将xxx 改为123,或者123456,或者任意密码
    再次输入命令 eth.accounts, 我们会发现一个新的用户被创建了出来,这就代表我们已经创建了一个账户,重复personal.newAccount() & eth.accounts 我们可以创建若干个账户出来
    整个命令截图如下:


    p7


     


    Step 5: 输出区块链的Log
     


    在Step 3中,我们执行的代码
    geth --datadir "./" --nodiscover console 2>>geth.log
    其中的代码 console 2>> geth.log 代表将控制台的一部分输出,输出到文件geth.log上去。


    打开另一个终端,找到geth.log的所在目录,执行命令 tail -f geth.log 从而持续的输出以太坊代币的日志
    整个过程如下图所示:


    p8


     


    Step 6: 最重要的一步来了,开始挖矿!
     


    在命令行中执行命令 miner.start(), 开始在我们的区块链上进行挖矿
    p9


    此时Geth.log的输出应该是这样的
    p10


    一直等到100%。这个以太坊代币私有链就会正式启动,并持续不断的生成出以太坊代币来。


    注意点:
    1. 挖矿挖到的ether币会默认保在第一个账户中,即eth.acccounts[0]中。


    2. 挖矿是执行智能合约的基础。如果停止挖矿的话,不仅以太币会停止生成,所有智能合约的调用也会不起作用。


    3. 如果真的要停止挖矿,可以执行命令miner.stop()来停止挖矿


    4. 按上面的命令,应该是可以实现以太坊代币挖矿的。如果不行的话,有可能就是之前有存在的链,此时应该删除之前的数据。在Mac下即删除~/.ethash文件夹和里面的文件即可


    Step 7: 最终当挖矿启动的时候的日志是这样的
    p11


    Step 8: 挖矿启动后,查看主账户的以太币数量
    acc0 = eth.accounts[0]
    eth.getBalance(acc0)
    结果只要不为0,那就说明挖矿成功!
    展开全文
  • 以太坊ERC20代币开发首先需要对以太坊,代币,ERC20,智能合约等以太坊代币开发中的基本概念有了解。根据我们的示例代码就可以发行自己的以太坊代币。 什么是ERC20 可以把ERC20简单理解成以太坊上的一个代币协议,所有...

    以太坊ERC20代币开发首先需要对以太坊,代币,ERC20,智能合约等以太坊代币开发中的基本概念有了解。根据我们的示例代码就可以发行自己的以太坊代币。

    什么是ERC20

    可以把ERC20简单理解成以太坊上的一个代币协议,所有基于以太坊开发的代币合约都遵守这个协议。遵守这些协议的代币我们可以认为是标准化的代币,而标准化带来的好处是兼容性好。这些标准化的代币可以被各种以太坊钱包支持,用于不同的平台和项目。说白了,你要是想在以太坊上发行代币融资,必须要遵守ERC20标准。

    ERC20的标准接口是这样的:

    contract ERC20 {  
        function name() constant returns (string name)  
        function symbol() constant returns (string symbol)  
        function decimals() constant returns (uint8 decimals)  
        function totalSupply() constant returns (uint totalSupply);  
        function balanceOf(address _owner) constant returns (uint balance);  
        function transfer(address _to, uint _value) returns (bool success);  
        function transferFrom(address _from, address _to, uint _value) returns (bool success);  
        function approve(address _spender, uint _value) returns (bool success);  
        function allowance(address _owner, address _spender) constant returns (uint remaining);  
        event Transfer(address indexed _from, address indexed _to, uint _value);  
        event Approval(address indexed _owner, address indexed _spender, uint _value);  
      } 
    复制代码

    name

    返回ERC20代币的名字,例如”My test token”。

    symbol

    返回代币的简称,例如:MTT,这个也是我们一般在代币交易所看到的名字。

    decimals

    返回token使用的小数点后几位。比如如果设置为3,就是支持0.001表示。

    totalSupply

    返回token的总供应量

    balanceOf

    返回某个地址(账户)的账户余额

    transfer

    从代币合约的调用者地址上转移_value的数量token到的地址_to,并且必须触发Transfer事件。

    transferFrom

    从地址_from发送数量为_value的token到地址_to,必须触发Transfer事件。

    transferFrom方法用于允许合同代理某人转移token。条件是from账户必须经过了approve。这个后面会举例说明。

    approve

    允许_spender多次取回您的帐户,最高达_value金额。 如果再次调用此函数,它将以_value覆盖当前的余量。

    allowance

    返回_spender仍然被允许从_owner提取的金额。

    后面三个方法不好理解,这里还需要补充说明一下,

    approve是授权第三方(比如某个服务合约)从发送者账户转移代币,然后通过 transferFrom() 函数来执行具体的转移操作。

    账户A有1000个ETH,想允许B账户随意调用他的100个ETH,过程如下:

    1. A账户按照以下形式调用approve函数approve(B,100)

    2. B账户想用这100个ETH中的10个ETH给C账户,调用transferFrom(A, C, 10)

    3. 调用allowance(A, B)可以查看B账户还能够调用A账户多少个token

    后面两个是事件,事件是为了获取日志方便提供的。前者是在代币被转移时触发,后者是在调用approve方法时触发。

    基于ERC20编写的一个代币合约

    pragma solidity ^0.4.16;  
    contract Token{  
        uint256 public totalSupply;  
      
        function balanceOf(address _owner) public constant returns (uint256 balance);  
        function transfer(address _to, uint256 _value) public returns (bool success);  
        function transferFrom(address _from, address _to, uint256 _value) public returns     
        (bool success);  
      
        function approve(address _spender, uint256 _value) public returns (bool success);  
      
        function allowance(address _owner, address _spender) public constant returns   
        (uint256 remaining);  
      
        event Transfer(address indexed _from, address indexed _to, uint256 _value);  
        event Approval(address indexed _owner, address indexed _spender, uint256   
        _value);  
    }  
      
    contract TokenDemo is Token {  
      
        string public name;                   //名称,例如"My test token"  
        uint8 public decimals;               //返回token使用的小数点后几位。比如如果设置为3,就是支持0.001表示.  
        string public symbol;               //token简称,like MTT  
      
        function TokenDemo(uint256 _initialAmount, string _tokenName, uint8 _decimalUnits, string _tokenSymbol) public {  
            totalSupply = _initialAmount * 10 ** uint256(_decimalUnits);         // 设置初始总量  
            balances[msg.sender] = totalSupply; // 初始token数量给予消息发送者,因为是构造函数,所以这里也是合约的创建者  
      
            name = _tokenName;                     
            decimals = _decimalUnits;            
            symbol = _tokenSymbol;  
        }  
      
        function transfer(address _to, uint256 _value) public returns (bool success) {  
            //默认totalSupply 不会超过最大值 (2^256 - 1).  
            //如果随着时间的推移将会有新的token生成,则可以用下面这句避免溢出的异常  
            require(balances[msg.sender] >= _value && balances[_to] + _value > balances[_to]);  
            require(_to != 0x0);  
            balances[msg.sender] -= _value;//从消息发送者账户中减去token数量_value  
            balances[_to] += _value;//往接收账户增加token数量_value  
            Transfer(msg.sender, _to, _value);//触发转币交易事件  
            return true;  
        }  
      
      
        function transferFrom(address _from, address _to, uint256 _value) public returns   
        (bool success) {  
            require(balances[_from] >= _value && allowed[_from][msg.sender] >= _value);  
            balances[_to] += _value;//接收账户增加token数量_value  
            balances[_from] -= _value; //支出账户_from减去token数量_value  
            allowed[_from][msg.sender] -= _value;//消息发送者可以从账户_from中转出的数量减少_value  
            Transfer(_from, _to, _value);//触发转币交易事件  
            return true;  
        }  
        function balanceOf(address _owner) public constant returns (uint256 balance) {  
            return balances[_owner];  
        }  
      
      
        function approve(address _spender, uint256 _value) public returns (bool success)     
        {   
            allowed[msg.sender][_spender] = _value;  
            Approval(msg.sender, _spender, _value);  
            return true;  
        }  
      
        function allowance(address _owner, address _spender) public constant returns (uint256 remaining) {  
            return allowed[_owner][_spender];//允许_spender从_owner中转出的token数  
        }  
        mapping (address => uint256) balances;  
        mapping (address => mapping (address => uint256)) allowed;  
    }  
    复制代码

    代码不必过多的解释,注释都写得很清楚了。

    这里可能有人会有疑问,name,totalSupply这些按照标准不应该都是方法吗,怎么这里定义的是属性变量? 这是因为solidity会自动给public变量生成同名的getter接口。

    部署测试

    我会提供两个环境的部署测试流程,都是亲测过的,大家可以根据自己的喜好选择。我个人平时用得比较多的是后者。

    Remix+MetaMask环境部署测试

    这部分要求你的浏览器已经安装了MetaMask插件,至于什么是MetaMask以及如何安装和使用请自行搜索查询。MetaMask我们用的是测试环境的网络,在测试网络中可以申请一些以太币进行测试。

    我们把代码复制到remix编译,没问题的话如下图所示点击create创建合约,参数可以按照下图的方式设置。注意环境选择injected web3,这样会打开浏览器插件MetaMask进行测试部署。

    点击create后会弹出合约确认界面,直接点击submit,等待合约确认。

    我们可以在MetaMask里点击该笔合约提交的明细,就会跳转到以太坊的浏览器中,可以在这里看到合约的各种信息:

    如上图所示,1表示该笔交易(合约也是一种交易)的hash值,2是当前合约所处的区块位置(当然是测试环境)和已经被确认的区块链数量,3是合约的创建地址,4是合约本省所在的地址。

    3和4的概念容易混淆,注意理解。

    进入MetaMask的token界面中,点击add token,然后我们把合约的地址复制到过去提交就可以看到我们的代币了。还可以点击代币的图标打开浏览器查看代币的详细信息。

    到这里你已经完成了代币的开发部署。接下来我们还要看看如何进行代币的转账,这个也是代币比较常用的操作。转账我们需要结合以太坊钱包MyEtherWallet,这是个以太坊的网页版轻量级钱包,利用它可以很方便的对我们的以太币和其它代币进行管理。

    转账前我们首先要把代币加入到钱包中,

    注意在上图中,我们选择的环境同样是测试环境并且和MetaMask中的环境一致。点击add custome token,输入代币地址等信息就可以看到代币了,然后进行转账操作。

    我们随便转入一个地址,转账完成后,发现代币余额确实减少了。

    以太坊钱包mist+geth私有环境部署测试

    我个人开发用这个环境比较多,不过这个环境安装起来比较麻烦,具体流程可以看下我以前的文章。

    打开mist钱包,进入合约界面,然后点击deploy new contact,然后把代码复制进去编译。

    然后点击deploy

    输入账户密码开始部署。

    随着挖矿的进行,合约就被部署到我的geth私有环境中了,

    回到钱包的合约界面已经可以看到合约了, 

    点击transfer ether&tokens,进入转账界面,进行转账。

    成功后可以看到余额已经减少,并且转入账户的余额增加。

    如果对以太坊开发有兴趣,推荐两个教程:

    1.适合区块链新手的以太坊DApp与智能合约、代币开发教程:

    以太坊代币开发

    2.区块链、星际文件系统(IPFS)、Node.js和MongoDB来构建以太坊DApp电商平台教程:

    以太坊实战

    展开全文
  • 以太坊代币算法的基本含义 以太坊算法是密码学的基础,理解以太坊算法是理解数字签名和加密通信等技术的必要前提。 以太坊算法,英文是 hash ,本来意思是”切碎并搅拌“,有一种食物就叫 Hash ,就是把食材切碎...

    区块链爱好者(QQ:53016353)

    以太坊代币算法的基本含义

          以太坊算法是密码学的基础,理解以太坊算法是理解数字签名和加密通信等技术的必要前提。

          以太坊算法,英文是 hash ,本来意思是”切碎并搅拌“,有一种食物就叫 Hash ,就是把食材切碎并搅拌一下做成的。以太坊算法函数的运算结果就是以太坊算法值,通常简称为以太坊算法。以太坊算法函数有时候也翻译做散列函数。

          根据维基百科的定义,以太坊算法函数要做的事情是给一个任意大小的数据生成出一个固定长度的数据,作为它的映射。所谓映射就是一一对应。一个可靠的以太坊代币算法要满足三点。

          第一是安全,给定数据 M 容易算出以太坊算法值 X ,而给定 X 不能算出 M ,或者说以太坊代币算法应该是一个单向算法。第二是独一无二,两个不同的数据,要拥有不相同的以太坊算法。第三是长度固定,给定一种以太坊代币算法,不管输入是多大的数据,输出长度都是固定的。

          

          但是仔细想一下,如果以太坊算法的长度是固定的,也就是取值范围是有限的,而输入数据的取值范围是无限的,所以总会找到两个不同的输入拥有相同的以太坊算法。所以,以太坊算法函数的安全性肯定是个相对概念。如果出现了两个不同输入有相同输出的情况,就叫碰撞,collision 。不同的以太坊代币算法,以太坊算法位数越多,也就基本意味着安全级别越高,或者说它的”抗碰撞性“就越好。

          再来说说以太坊算法函数的主要作用。以太坊算法的独一无二性,保证了如果数据在存储或者传输过程中有丝毫损坏,那么它的以太坊算法就会变。以太坊算法函数的最常见的一个作用就是进行完整性校验( Integrity Check ),完整的意思是数据无损坏。以太坊算法有很多不同的称呼,有时候叫 Digest 摘要,有时候叫 Checksum 校验值,有时候叫 Fingerprint 指纹,其实说的意思差不多,也就是说以太坊算法可以用来代表数据本身。

          

          例如朋友给我传递一份数据,传完之后,我有一份,他手里也有一份,如果两份数据的以太坊算法值是一样的,那么这两份数据的内容就是一样的,或者说可以认为传递过程中数据没有损坏,我手里拿到的数据是完整的。

          所以说,以太坊算法函数的基本作用就是给大数据算出一个摘要性的长度固定的字符串,也就是所谓的以太坊算法。以太坊算法的作用主要是进行完整性校验。

    以太坊代币算法的分类

          下一步我们把以太坊算法函数分类,更细致的聊聊以太坊代币算法的特点。首先说以太坊代币算法有很多种,例如 md5 ,sha256 等等,但是它们总体上可以分为两大类,一类是普通以太坊算法,另外一类是加密以太坊算法,cryptographic hash function 。

          业界可以找到的以太坊代币算法是有很多种的。我们可以大致按照输出的以太坊算法的长度来聊,虽然以太坊代币算法的安全性也不单单是跟以太坊算法长度有关,但是一般以太坊算法值越长也就是越安全。

           例如 CRC-32 的输出是32 bit,也就是32位的二进制数,表示成十六进制就是8位。MD5 算法的以太坊算法是32位16进制数,比较常见。SHA-256是256个 Bit ,十六进制表示就是64位。这些算法可以分成普通以太坊算法和加密以太坊代币算法,两种算法之间没有特别明显的区别。例如本来 MD5 就是设计出来做加密以太坊算法的,但是后来由于计算机的发展 MD5 出现碰撞的可能性就很大了,所以目前 MD5 只能当普通以太坊算法用,用来做数据校验。

          加密以太坊算法跟普通以太坊算法的区别就是安全性,一般原则是只要一种以太坊代币算法出现过碰撞,就会不被推荐成为加密以太坊算法了,只有安全度高的以太坊代币算法才能用作加密以太坊算法。

          同时加密以太坊算法其实也能当普通以太坊算法来用,Git 版本控制工具就是用 SHA-1 这个加密以太坊代币算法来做完整性校验的。一般来讲越安全的以太坊代币算法,处理速度也就越慢,所以并不是所有的场合都适合用加密以太坊算法来替代普通以太坊算法。

          在密码学领域,有两个算法都是把数据做输入,而输出是一段谁也看不懂的数据。其中一个就是以太坊代币算法,另外一个是加密算法。注意,以太坊代币算法和加密算法是完全不同的。

          首先以太坊代币算法的输出长度是固定的,而加密算法的输出长度是跟数据本身长度直接相关的,第二,以太坊算法是不可以逆向运算出数据的,而加密算法的输出是要能够逆向运算出数据的。关于加密算法,我们这里就不展开聊了。

           这里主要是强调加密以太坊代币算法只是被用在加密过程中,但是它本身不是加密算法。

          总之,以太坊代币算法有很多种,长度越长的算法基本认为越安全。安全度低的以太坊代币算法被认为是普通以太坊代币算法,主要用来做完整性校验。安全度高的被称为加密以太坊代币算法,会被用在加密算法中。所谓的高低都是相对概念,例如 MD5 曾经属于加密以太坊算法,但是目前只能用来做安全校验了。而从2017年开始,SHA-1 算法生成的加密证书也会被各大浏览器拒绝了。目前最流行的加密算法是 SHA-2 ,但是跟 SHA-1 不同,SHA-2 不是一种算法,而是一系列算法的统称,其中就包括咱们之前提过的 SHA-256 。

    实用例子

          说了这么多基础知识,最后一部分咱们聊聊以太坊算法在现实中的应用。

          首先一个场景是网站注册。当我们提交用户名密码的时候,用户名被会直接保存到网站的数据库中,但是密码却不是直接保存的,而是先把密码转换成以太坊算法,保存到数据库中的其实是以太坊算法。所以,即使是公司后台管理人员,也拿不到用户的密码。这样,如果万一公司数据库泄露了,用户的密码依然是安全的。而当用户自己登录网站的时候,输入密码提交到服务器,服务器上进行相同的以太坊算法运算,因为输入数据没变,所以以太坊算法也不会变,登录也就成功了。

          另外一个场景是区块链和加密货币中。比特币地址生成的时候,就用到了 SHA-256 算法,POW 也就是工作量证明,用的也是这个算法。

          基本上凡是涉及到密码学的地方,都会或多或少的用到以太坊算法函数。

    总结

          关于以太坊算法和以太坊算法函数,我们就聊到这里,下面来总结几句。

          以太坊算法的基本作用就是提供一个数据的摘要或者指纹,通常的使用场景就是完整性校验。以太坊代币算法有很多种,一般来讲以太坊算法越长的算法,安全性也就越高,安全度足够高的以太坊算法,或者说没有任何人能够成功实现碰撞的以太坊算法,才有资格被考虑用在加密场合,而这类的以太坊代币算法也被叫做加密以太坊代币算法。

          实际中常见的以太坊代币算法有 MD5 ,SHA-1 ,和 SHA-256 等等,其中 MD5 通常用来进行数据校验,SHA-1 曾经是加密以太坊代币算法,但是目前已经被除名,也只能做为一种安全度更高的校验算法了。SHA-256 依然是广泛使用的加密以太坊代币算法,在比特币生成地址以及 POW 工作量证明算法中都会用到。

    展开全文
  • 以太坊ERC20代币开发首先需要对以太坊,代币,ERC20,智能合约等以太坊代币开发中的基本概念有了解。根据我们的示例代码就可以发行自己的以太坊代币。 什么是ERC20 可以把ERC20简单理解成以太坊上的一个代币协议,所有...
  • 我们在以太坊链上进行代币转账后,想要查询某个地址的代币余额列表信息。我们可以我们可以通过浏览器查询区块链浏览器查询区块链交易记录。Tokenview区块链浏览器是全币种区块链浏览器,其中ETH以太坊区块浏览器可以...
  • 区块链爱好者(QQ:53016353)  部署一个开发者环境并运行一个简单例子。...以太坊代币将用于创建包含三个Peer节点的联盟链、一个独立的Orderer和一个证书颁发机构(CA)。为了加快部署进度,预先生成了基
  • 智能合约开发是以太坊开发的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助。 以太坊的应用被称为去中心化应用(DApp),DApp的开发主要包括两大部分...
  • 如果你已经熟悉以太坊,那么你就知道交易包括你发送的以太币量,gas限额,gas价格,随机数,接收地址以及可选数据。在将他被广播到网络之前,必须使用发送方的私钥对该交易进行签名。 假设你已经连接了客户端,下...
  • golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产。并且它必须是遵循erc20标准的,至于erc20标准,大家可以参考这篇文章...
  • 智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助。 以太坊的应用被称为去中心化应用(DApp),DApp的开发主要包括两大部分...
  • 以太坊代币合约查看教程

    万次阅读 2018-01-23 21:06:31
    ExtraBalance 提取合约地址:http://etherscan.io/address/0x755cdba6ae4f479f7164792b318b2a06c759833bExtraBalance代币合约地址:http://etherscan.io/address/0x5c40ef6f527f4fba68368774e6130ce6515123f2在后...
  • 钱包是用于发送和接受代币的客户端,就像我们使用邮箱来管理自己的邮件,我们需要...私钥也用于生成你的代币地址 - 这就像邮箱地址,只有知道地址才能给别人发送代币。 然而,尽管代币地址是通过私钥生成的,但是没...
  • 第一行pramga solidity ^0.0.4 声明合约源码适用的solidity编译器版本,^ 0.0.4代表次源码使用solidity...address public minter,声明一个地址类型的状态变量,地址是20个字节的账户地址,public关键字会自动生成一...
  • 许多人在看了以太坊代币开发白皮书之后仍然不清楚以太坊代币开发是怎样实现的,因为以太坊代币开发的源码设计精巧,有许多设计白皮书未曾提及,加上本身以太坊代币开发的文档稀少,加大了新手理解的困难程度 ...
  • 不过以太坊并不知道如何创建这个创世快,需要我们来告诉他如何创建,所以,我们需要创建一个描述文件,这个描述文件是Json格式的,我的起名为block.json { "config": { "chai...
  • 复制黏贴这段代码,且web3.eth.accounts[0]也处于解锁状态的话,即可部署到以太坊的私有链上。并可以被执行和调用。 p2 > a_demotypes.f.call(100) 800 > a_demotypes.f.call(125) 1000   ...
  • 区块链以太坊代币开发新技术分层确定性钱包Wallet介绍 钱包是用于发送和接受代币的客户端,就像我们使用邮箱来管理自己的邮件,我们需要一个客户端来管理自己的代币。钱包的本质是保管私钥的工具,私钥就是一串很长...
  • 以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产。并且它必须是遵循erc20标准的,至于erc20标准,大家可以参考这篇文章 theethereum.wiki/w/index.php… 它实际上一段智能...
  • 后续我会再介绍其他支持ETH的钱包,包括Jaxx、Metamask、Parity和以太坊官方的Mist钱包,而 MyEtherWallet 所能够产生的备份方式,刚好都能在这些钱包中恢复,所以大家不妨先尝试使用MEW,熟悉之后可以更快理解其他...
  • 但是,我们知道以太坊的核心是账户体系和智能合约,真正有意义的是在各个账户之间可以流通的代币合约。有了这些代币,我们才能用于众筹、众包等各种商业应用的实现。 下篇将介绍一个包含账户的代币合约 ...
  • 以太坊生态系统中数字令牌可以代表任何交易物品:币,忠诚点,黄金券,白条,游戏物品等。所有令牌都通过标准方式,实现了一些基本功能。这就意味着,你的令牌会立即兼容以太坊钱包和其他客户端,或使用了相同标准...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,127
精华内容 1,650
关键字:

以太坊代币生成