Bytom-Kit开发辅助工具介绍

Bytom Kit是一款为了帮助开发者更简单地理解Bytom的开发辅助工具,集合了校验、标注、解码、测试水龙头等功能。 该工具用python语言封装了一套比原的API和7个工具方法,如果有开发需求可以在项目的readme.md文件中查看使用方法。项目源码地址:https://github.com/Bytom/byto... 。 下面具体看一下各个工具的使用方法: Key链接:https://blockmeta.com/tools/key Key页面显示了熵(Entropy)、助记词(Mnemonics)、随机数(Seed)、派生私钥(Root Expanded Private Key)、派生公钥(Root Expanded Public Key),以及一个私钥的二维码。这一功能可以创建新的私钥key。 Address链接: https://blockmeta.com/tools/a... 地址页面主要创建新地址,页面显示了派生公钥(Expanded Public Key),账户索引(Account Index)、地址索引(Address Index)、更改标记(Change)、网络(Network)、地址路径(Address Path)、智能合约(Control Program)、地址(Address)、以及一个私钥的二维码。这一页面可以创建一个新地址。 Sign地址: https://blockmeta.com/tools/sign 这个页面显示了派生私钥(Expanded Private Key)、消息(Message)、签名(Signature)。这一页面可以使用地址的密钥(私钥)对信息进行签名,输入私钥和信息内容,点击Sign Message可生成签名(Signature)。 Verify地址: https://blockmeta.com/tools/v... 在这一页面,你可以通过输入公钥(Expanded Private Key)、信息(Message)、签名(Signature),、消息、签名。点击Verify Signature,可返回验证结果。 地址 Submit Transaction链接: https://blockmeta.com/tools/txs 输入已经签名好的交易编码,点击Submit Transaction即可提交交易。 地址 Decode Raw Transaction链接: https://blockmeta.com/tools/d... 输入已经签名好的交易(Raw Transaction),点击Decode Transaction可解码交易为十六进制字符串为json对象。 Testnet Faucet链接: https://blockmeta.com/tools/f... 比原水龙头工具接口,开发者可以使用该工具接口领取比原测试Token。

April 26, 2019 · 1 min · jiezi

华为云首批通过可信区块链评测

华为云首批通过可信区块链评测 来源:互联网 近年来,区块链技术正在被各行各业所认可,具有“降成本、提效率、优化产业诚信环境”的作用。基于区块链系统,数据可以被有效地确权,通过“可信数字化”的数据上链过程,有效地保障数据的真实性,实事求是地为产业解决过往难以解决的问题,从“降成本”和“提效率”两个方面推动各行业的转型升级。 日前,在2019华为中国生态合作伙伴大会上,华为云就发布了区块链+政务、区块链+公司间交易、区块链+供应链物流、区块链+医疗四大区块链行业解决方案,致力于区块链平台建设及行业解决方案落地,降低行业使用区块链的技术门槛。 云的开放性和云资源的易获得性,决定了公有云平台是当前区块链创新的最佳载体。区块链是数字经济的使能技术,企业希望提升区块链创新的速度,区块链服务(Blockchain-as-a-service)便应运而生。依托于华为多年的硬核技术积累与服务实践经验,华为云区块链服务(BCS)以实际业务场景为抓手,基于华为云容器、安全等服务,提供了一种开放易用、灵活高效的通用型基础解决方案。 2018,由中国信息通信研究院(工信部电信研究院)主导,组织开展了历时四个月的“可信区块链产品评测”,围绕核心技术、应用支撑以及运维管理三个部分进行评估,希望从系统可靠性、安全性、稳定性、适配性以及可移植性等做一些具体的标准测试。 此次评测针对区块链产品功能,在核心技术、应用支撑、运维管理三个部分,覆盖19个测试项、95个测试点,从系统可靠性、安全性、稳定性、适配性以及可移植性等做具体的标准评测。期间,共有42家企业报名此次可信区块链功能测试,在19个测试项、95个测试点中,华为云都是一次性通过全部必选项目,并大部分通过可选项目,以及在快速拜占庭容错共识算法、国密加密机制支持、系统稳定性、数据私密性等关键领域表现尤为突出,成为首批通过可信区块链功能测试的企业。 根据测评结果,在可选项当中,华为云在私钥管理、密码技术支持、应用层稳定性、节点管理、可运维性等方面表现优异,这得益于华为公司30年来在ICT、企业业务领域的经验和积累,使得华为云在区块链系统能力的构建上有自己独到和精准的理解,从而,华为云BCS服务才能够在区块链可信的基础之上,真正成为安全、好用和易用的产品。 事实上,早在2016年,华为就开始积极参与Linux基金会旗下“超级账本”项目,该项目是区块链技术领域最具影响力的开源项目。并担任国际电信联盟标准化组织ITU-T,分布式账本焦点组(FG DLT)架构组和数据处理与管理焦点组(FG DPM)区块链组等职位。并在两个热度最高的子项目Fabric和STL中持续做出技术和代码贡献,同时被社区授予Maintainer职位,也是两个项目中唯一来自亚洲的Maintainer。作为Hyperledger会员,中国仅有的2个maintainer职位,华为云主导的区块链基准测试工具Caliper作为第一个工具项目被Hyperledger采纳。 2018年,华为成为金融区块链合作联盟成员,以及安永、SAP在区块链领域的合作伙伴。 2018年2月,华为云基于华为在分布式并行计算、PaaS、数据管理、安全加密等核心技术领域多年积累,首次对外发布了区块链服务BCS(Blockchain Service),面向企业及开发者提供高性能、高可用和高安全的公有云区块链技术服务。 2018年4月,《华为区块链白皮书》发布,对华为云区块链的核心技术、产业发展现状和典型应用场景以及历年来的研究成果展开思考与探索。 2018年8月,可信区块链推进计划BaaS(Blockchain as a Service)项目组成立,华为云区块链服务首席架构师张煜博士担任工信部信通院可信区块链联盟副理事长,BaaS项目组组长。BaaS项目组致力于共同探索和解决BaaS商业化过程中遇到的各种问题,为区块链在各个领域的应用落地提供高性能、高可靠、高安全、更易用的基础设施平台。 2018年10月,华为云正式商用的企业级区块链开放平台区块链服务BCS(Blockchain Service),是基于区块链技术和华为在分布式并行计算、数据管理、安全加密、容器等核心技术领域,多年积累基础上推出的云服务产品,帮助各行业、企业在华为云上快速、高效的搭建企业级区块链行业方案和应用。 2018年年底,在“首届中国物流与供应链产业区块链创新应用年会”上,华为云凭借在供应链区块链上的探索和实践,荣获“区块链创新应用十佳企业”。目前,已经有多家企业基于华为云区块链技术打造出自己的区块链物流系统。不仅如此,华为云区块链已经在供应链金融、数字版权、医疗数据共享等场景都完成了商用落地。如今,各行各业都在对区块链技术进行积极探索,华为云也凭借着硬核技术与服务能力逐步夯实自身影响力。华为云专注研究技术与应用场景落地,专注做区块链应用的使能者,致力于通过区块链技术帮助企业解决数据流转过程中的可信性难题,携手企业共建可信社会。想了解更多区块链技术,欢迎访问华为云学院(https://edu.huaweicloud.com/c...)

April 26, 2019 · 1 min · jiezi

以太坊创世区块与链配置载入分析

原文链接请大家前往深入浅出区块链主站, 获取最新内容。 创世区块作为第零个区块,其他区块直接或间接引用到创世区块。因此节点启动之初必须载入正确的创世区块信息,且不得任意修改。 以太坊允许通过创世配置文件来初始化创世区块,也可使用选择使用内置的多个网络环境的创世配置。默认使用以太坊主网创世配置。 创世配置文件如果你需要搭建以太坊私有链,那么了解创世配置是必须的,否则你大可不关心创世配置。下面是一份 JSON 格式的创世配置示例: { "config": { "chainId": 1, "homesteadBlock": 1150000, "daoForkBlock": 1920000, "daoForkSupport": true, "eip150Block": 2463000, "eip150Hash": "0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0", "eip155Block": 2675000, "eip158Block": 2675000, "byzantiumBlock": 4370000, "constantinopleBlock": 7280000, "petersburgBlock": 7280000, "ethash": {} }, "nonce": "0x42", "timestamp": "0x0", "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", "gasLimit": "0x1388", "difficulty": "0x400000000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x0000000000000000000000000000000000000000", "number": "0x0", "gasUsed": "0x0", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "alloc": { "000d836201318ec6899a67540690382780743280": { "balance": "0xad78ebc5ac6200000" }, "001762430ea9c3a26e5749afdb70da5f78ddbb8c": { "balance": "0xad78ebc5ac6200000" } }}根据配置用途可分为三大类: ...

April 25, 2019 · 3 min · jiezi

如何编写一个企业级区块链Hyperledger-Fabric开源框架

Convector(a.k.a Convector Smart Contracts)是为企业区块链框架构建的JavaScript开发框架。它增强了开发体验,同时帮助开发人员创建更强大,更安全的智能合约系统。它通过链代码和后端一直到前端,允许开发人员以库的形式重用相同的代码库。它基于模型/控制器模式,支持Hyperledger Fabric,并沿着Fabric精心设计的模式本地运行。 这篇博客文章介绍了该项目的历史,并重点介绍了沿途开发的挑战和解决方案。 当我们开始研究Tellus时,一切都开始了,Tellus是一个无代码交易设计师,用于在Hyperledger Fabric区块链上运行。那时我们有一堆Golang智能合约。 我们对开发者体验(DX)的第一印象并不是那么好。有两种方法:init和invoke,除了在invoke方法上放置if条件并使用其中一个参数指示调用的方法之外,没有其他方法可以添加新方法。所有参数都是位置传递的字符串,需要手动解析复杂参数,并且无法在本地测试它。 在项目开始时,Fabric 1.1增加了对Javascript链代码的支持。我们决定尝试一下,希望改善开发人员的体验。不幸的是,它遵循Golang链式代码中的相同模式,你仍然需要在日常逻辑中做一些肮脏的工作。我们一直在寻找更好的解决方案,并发现了一篇关于TheLedger的库的帖子,该文章在Typescript中制作Fabric链接代码,它真正改善了原始Javascript的内容。 在我们的智能合约从Golang迁移到Javascript期间出现了一种模式。大多数时候函数按以下顺序执行: 1.解析参数。2.做一些断言。3.执行更改。4.保存更改。这导致了关于项目计划的一个基本问题:智能合约是否应该快速迁移,或者应该花更多的时间来确定模式并使其足够灵活以适应多个业务案例。这一切都始于项目的./src/utils/。 /** @module @worldsibu/convector-examples-token */import * as yup from ‘yup’;import { ConvectorModel, ReadOnly, Required, Validate} from ‘@worldsibu/convector-core-model’;export class Token extends ConvectorModel { @ReadOnly() public readonly type = ‘io.worldsibu.examples.token’; @ReadOnly() @Required() @Validate(yup.object()) public balances: { [key: string]: number }; @ReadOnly() @Required() @Validate(yup.number().moreThan(0)) public totalSupply: number; @ReadOnly() @Required() @Validate(yup.string()) public name: string; @ReadOnly() @Required() @Validate(yup.string()) public symbol: string;}对流模型Fabric对区块链中存储的数据形状没有限制。你基本上有一个键值映射,其中两个都是字符串,这意味着你可以序列化和存储任何复杂的对象。我们拆开模型以在代码中重用它们。我们刚刚通过了所有必要的参数。 ...

April 25, 2019 · 1 min · jiezi

configtxyaml中文详解

configtx.yaml是Hyperledger Fabric区块链网络运维工具configtxgen用于生成通道创世块或通道交易的配置文件,configtx.yaml的内容直接决定了所生成的创世区块的内容。本文将给出configtx.yaml的详细中文说明。 如果需要快速掌握Fabric区块链的链码与应用开发,推荐访问汇智网的在线互动教程: Fabric区块链Java开发详解Fabric区块链NodeJS开发详解Capabilities / 通道能力配置Capabilities段用来定义fabric网络的能力。这是版本v1.0.0引入的一个新的配置段,当与版本v1.0.x的对等节点与排序节点混合组网时不可使用。 Capabilities段定义了fabric程序要加入网络所必须支持的特性。例如,如果添加了一个新的MSP类型,那么更新的程序可能会根据该类型识别并验证签名,但是老版本的程序就没有办法验证这些交易。这可能导致不同版本的fabric程序中维护的世界状态不一致。 因此,通过定义通道的能力,就明确了不满足该能力要求的fabric程序,将无法处理交易,除非升级到新的版本。对于v1.0.x的程序而言,如果在Capabilities段定义了任何能力,即使声明不需要支持这些能力,都会导致其有意崩溃。 Capabilities: # Global配置同时应用于排序节点和对等节点,并且必须被两种节点同时支持。 # 将该配置项设置为ture表明要求节点具备该能力 Global: &ChannelCapabilities V1_3: true # Orderer配置仅应用于排序节点,不需考虑对等节点的升级。将该配置项 # 设置为true表明要求排序节点具备该能力 Orderer: &OrdererCapabilities V1_1: true # Application配置仅应用于对等网络,不需考虑排序节点的升级。将该配置项 # 设置为true表明要求对等节点具备该能力 Application: &ApplicationCapabilities V1_3: trueOrganizations / 组织机构配置Organizations配置段用来定义组织机构实体,以便在后续配置中引用。例如,下面的配置文件中,定义了三个机构,可以分别使用ExampleCom、Org1ExampleCom和Org2ExampleCom引用其配置: Organizations: - &ExampleCom Name: ExampleCom ID: example.com AdminPrincipal: Role.ADMIN MSPDir: ./ordererOrganizations/example.com/msp Policies: Readers: Type: Signature Rule: OR('example.com.member') Writers: Type: Signature Rule: OR('example.com.member') Admins: Type: Signature Rule: OR('example.com.admin') Endorsement: Type: Signature Rule: OR('example.com.member') - &Org1ExampleCom Name: Org1ExampleCom ID: org1.example.com MSPDir: ./peerOrganizations/org1.example.com/msp AdminPrincipal: Role.ADMIN AnchorPeers: - Host: peer0.org1.example.com Port: 7051 Policies: Readers: Type: Signature Rule: OR('org1.example.com.member') Writers: Type: Signature Rule: OR('org1.example.com.member') Admins: Type: Signature Rule: OR('org1.example.com.admin') Endorsement: Type: Signature Rule: OR('org1.example.com.member') - &Org2ExampleCom Name: Org2ExampleCom ID: org2.example.com MSPDir: ./peerOrganizations/org2.example.com/msp AdminPrincipal: Role.ADMIN AnchorPeers: - Host: peer0.org2.example.com Port: 7051 Policies: Readers: Type: Signature Rule: OR('org2.example.com.member') Writers: Type: Signature Rule: OR('org2.example.com.member') Admins: Type: Signature Rule: OR('org2.example.com.admin') Endorsement: Type: Signature Rule: OR('org2.example.com.member')Orderer / 排序节点配置Orderer配置段用来定义要编码写入创世区块或通道交易的排序节点参数。 ...

April 25, 2019 · 4 min · jiezi

Ruff-Chain-双周报-4月13日4月26日

在过去的两周,RuffChain 主要工作集中在测试网络的代码审计方面,为了能更加顺利的上线主网,RuffChain 将对测试网络的所有代码进行细致严谨的安全审计,审计结束之后,将进行统一的修复与优化,确保未来上线主网安全且稳定。以下为本期完整双周报:RuffChain TestNet 版本审计范围: -RuffChain 公链的节点(Node) -RuffChain 公链的VM(Ruff VM) -RuffChin 公链的CLI Ruff FaceID 模组及终端产品即将交付客户测试 由 Ruff 研发的人脸识别系列产品目前已经完成产品的标准化功能及场景使用规范,后续即将安装到门禁及门锁厂商的设备中进行测试。 Ruff 人脸识别模组 Ruff FaceID RAF-M1 Ruff FaceID RAF-M1模组是一款基于物联网+机器学习技术的人脸识别模组产品,可实现快速、准确和安全的人脸识别认证。该模组具备通用的串口通讯接口,可便捷实现深度功能定制。 Ruff人脸识别智能门禁终端 Ruff FaceID RAF-G1 Ruff FaceID 智能门禁终端RAF-G1 系列产品是基于Ruff FaceID 模组开发的用于人脸识别的智能终端。终端利用AI芯片的神经网络计算能力,动态识别人脸,实现出入口人员的安全认证,有效管理人员进出。 社群访问地址 Website http://ruffchain.com/ https://ruff.io/ Official Blog https://ruffchain.com/blog/ Twitter https://twitter.com/Ruff_Chain Facebook https://www.facebook.com/Ruff... Telegram https://t.me/ruffchain https://t.me/ruffchainchinese

April 25, 2019 · 1 min · jiezi

btc测试网络搭建

下载/安装下载源码下载地址:https://github.com/bitcoin/bi...现成的安装包下载地址: https://bitcoin.org/zh_CN/dow... 安装安装目录 bitcoin-qt.exedaemon bitcoin-cli.exebitcoind.exebitcoin-tx.exe区块目录 blockschainstatetestnets 同步测试网络的时候会出现bitcoin.conf 配置文件基本命令启动testnet 连接测试网络server 接受 JSON-RPC 命令conf 指定配置文件datadir 指定数据文件夹# 图形界面BTC 启动.\bitcoin-qt.exe -testnet -server -conf='D:\data\bitcoin\bitcoin.conf' -datadir='D:\data\bitcoin'# 命令行版本 启动.\bitcoind -testnet -printtoconsole -conf='D:\data\bitcoin\bitcoin.conf' -datadir='D:\data\bitcoin'连接./bitcoin-cli -rpcconnect=127.0.0.1 -rpcuser=userrpc -rpcpassword=userpassword -rpcport=18332 getblockchaininfo

April 25, 2019 · 1 min · jiezi

台北Meet-Up圆满落幕丨DOS-Network下一代去中心化预言机服务网络

下一代去中心化预言机服务网络DOS Network台北Meet Up圆满落幕 2019年4月20日,由Grenade Lab,DOS Meetup携手共同联合举办的“DOS Netweork台北线下Meet Up”在台北的联合创业办公社People Squared圆满落幕。 本次Meetup以去中心化预言机DOS网络技术总监Eric作为嘉宾出席演讲,Eric提出预言机将能使区块链作为基础建设的功能变得更加齐全,形式将变得丰富多彩。当天吸引超过60位以上分别来自币、链圈的社群朋友共襄盛举。 DOS网络CTO──Eric担任台北站活动嘉宾暨讲师 活动开头,由DOS网络CTO Eric介绍DOS网络本身架构以及预言机在现实生活中的应用场景,范例。同时Eric介绍了最新的Droplock模型:随著DOS网络Beta版本的积极开发和不断完善,DOS网络团队正在探索启动DOS网络的方法。提出了一个名为「Droplock」的新模型,并希望向社区,对DOS感兴趣的开发人员,以及潜在的DOS beta测试人员和节点运行者分享和收集反馈。Droplock:一种启动权益质押网络的新模型https://mp.weixin.qq.com/s/ud... 到场的来宾们提出对于DOS架构、运行方式、算法等疑问 也有不少朋友认真的把ppt拍下做笔记 其中,Eric也精心设计了一个活动桥段,让大家了解节点运作的模式。被Eric抽中的工作组(来宾),需要模拟一次DOS网络平时搜集数据以及提交的过程。而活动下半场环节是由主办Grenade Lab所设计的Kahoot竞猜环节,Grenade Lab针对DOS网络项目本身设计了17题的题目,让台下的观众抢答。这个环节除了让大家更了解DOS项目本身之外,还能够比一比平常抢IEO的手速,当下气氛可以说是相当火爆。 被Eric抽中的工作组,猜拳选出一名提交者模拟节点运作 Kahoot环节,每个人都非常认真抢答,气氛非常火爆 目前各大公链上DApp的类别多为博弈,游戏,金融应用等,这些领域对于外界互联网数据的需求是存在的,然而按照区块链上的原则,数据是无法与互联网共同的。这时,就需要为区块链世界提供可信任,无窜改外部数据的预言机。去中心化的预言机是区块链行业基础设施,而DOS网络基于Layer2的架构将使去去中心化预言机有更好可扩展性,效率也不受限于公链性能。 本次DOS Meet Up台北站,现场来宾与讲者互动气氛良好,现场来宾也针对去中心化预言机技术和如何成为DOS节点提出许多问题,除了与会者获得DOS空投外,也能够参与游戏获得DOS令牌,活动圆满落幕! 特别感谢以下支持方(排名不分先后顺序) 主办:Grenade Lab & DOS Network 协办:Bitmax.io 台湾合作媒体:Zombit桑币笔记 / BitNews /0XMAG 战略媒体: 链闻/碳链价值/布洛克科技/星球日报/深链财经/猎云财经/Block123 支持媒体: 金色财经/小葱/杭链财经 如果你对DOS感兴趣,欢迎添加小助手dosnetwork001进入社区!

April 24, 2019 · 1 min · jiezi

DOS与原力协议齐心协力拓展分布式加密金融领域

各位亲爱的DOS Network的支持者和关注者,我们很高兴地宣布DOS Network与原力协议(The Force Protocol)正式建立长期战略合作伙伴关系,双方将在分布式加密金融服务领域展开合作。 原力协议是一个开放的区块链金融服务平台,可为不同公链生态系统的开发者搭建分布式加密金融应用提供服务,目前原力协议已基于以太访、EOS、比特币RSK网络等主流公链进行开发,将在不久的未来,对这些生态系统内的开发者,提供金融服务开发工具。 原力协议基于主流公链系统和底层跨链协议,通过对分布式金融业务流程的抽象和封装,以SDK及API的形式,用一站式解决方案赋能分布式加密金融应用开发。为跨平台资产流转、交易深度共享、跨链加密资产抵押的稳定币发行、通证债券发行、链上支付、交易清结算等金融需求提供解决方案。 原力协议在分布式金融生态里搭建分布式加密金融服务的通用开发平台,通过将分布式金融当中与具体场景相关的需求框架化、系统化,为分布式网络内的金融服务提供通信标准和开发框架,让加密资产可以在统一的框架内实现安全高效的价值互联互通。 DOS Network是一个支持多链的功能完全的(支持数据预言机和计算预言机)可扩展的去中心化预言机二层服务网络,它使去中心化应用能够以安全有效的方式通过去中心化的链下网络获取外部数据并执行复杂的计算,这将大大促进区块链上的应用发展。 DOS Network相较于一般预言机项目,有6大技术创新: 1、网络去中心化:设计完全符合区块链思想,可以避免单点故障问题,无需信任第三方独立机构; 2、实时可验证结果:数据结果可实时获取基本零延迟,并且通过密码学存储,可在链上验证数据正确性; 3、完美多链兼容:轻量级链上接口,密码学共识于链下完成,可服务所有主流公链; 4、极强的安全性:可验证的随机数引擎及加密签名技术,保证服务网络结果的可靠性; 5、高拓展性低成本:由多节点于链下完成可靠数据获取或复杂计算,高性能却降低链上开销; 6、正向奖励机制:服务网络中完成数据获取或计算任务的诚实节点将获得奖励激励。 在当前的区块链领域,分布式加密金融应用的一大瓶颈就在于交易速度低下和链外可信数据的采集。以抵押借贷场景举例,借贷双方需要根据抵押资产的市场价值决定抵押率和利率水平,而抵押物的价值也需要有链外的可信价格数据进行持续的更新,以保证抵押物托管合约及时执行平仓等操作。在可信的预言机网络产生之前,金融服务类DAPP的价格数据采集易受黑客攻击,易被数据提供方篡改,极大的影响了分布式加密金融服务的可信度,影响用户体验。但如果存在可信的链外数据采集机制,通过安全的数据通道传输相应的关键数据,则可以大大的提高交易安全性。这样一来,将极大的增强分布式加密金融服务应用场景的适应性和可信度,提高用户体验。 原力协议的开源开放发展战略,带动万亿级分布式加密金融服务市场的建立,诸多的分布式加密金融服务应用将大大丰富DOS Network的服务应用范围,探索DOS预言机服务网络更多应用可能性。 借助DOS Network的预言机网络强大的技术支持,原力协议能够拥有一个去中心化、安全、可信的数据通道,方便链外数据采集,大大的提升交易安全性。也将极大的增强其分布式加密金融服务应用场景的适应性和可信度,提高用户体验。为原力协议成为全球代表性分布式加密金融服务平台以及实现可支持大规模区块链商业应用的落地而助力。此次DOS Network与原力协议强强联手,双方将共同努力实现更多的区块链金融应用场景。 如果你对DOS感兴趣,欢迎添加小助手dosnetwork001进入社区!

April 24, 2019 · 1 min · jiezi

我们应该相信那些狂热的天才工程师么

先声明一下,一个人逻辑好,数学好,不代表这个人是理性的。理性的意思是一个人能正确的认识现实情况,从而设定合理的目标。我国现实案例一则 狂热工程师的特点不断的添加特性他们觉得比特币脚本太简陋了,于是发明图灵完整的EVM虚拟机。后来者觉得EVM太low了于是引入更加高级的WASM,还有更狂热的把lua脚本都塞进来。 用区块链解决一切问题觉得区块链能解决很多问题,所以一定要搞一个特别酷的通用平台,如果只是专注转账简直不好意思见人。 藐视专业相信自己比数学家更厉害,能发明安全的哈希算法。 藐视市场相信一个商品的价格可以由数学公式来决定,而不是市场。 专断口口声声说自己是去中心化系统,却可以发出指令封禁别人账户。被人诟病之后,以打破之前的承诺为代价,直接强行部署新规则。 不承认现实情况设计一个高速的layer2,example1, example2, example3,却无法为比特币实现onchain或者offchain服务。 滥用比喻他们将自己定义为区块链届的TCP/IP层 根本不酷炫的实用主义开发者是如何做的收敛比特币直到今天也不是图灵完整。但是通过扎实的开发工作,实现了若干次稳妥而扎实的进步,支持了闪电网络。 专注没有那么大的野心,直到今天,比特币和闪电网络依然是点对点电子现金系统。 谦逊不自己发明新算法,不使用未经验证的算法。 不忘初心比特币和闪电网络一直以来都从permissionless出发,保证资金安全的前提下尝试提高性能。 承认有些问题无法彻底解决比特币就是51%算力说了算,BFT就是2f+1说了算。坏人太多怎么办?先打倒坏人。 TCP/IP是牛逼专家闭门想出来么?这里有一个帖子很有意思,简单说结论: 在计算机科学发展的历史上,一直就存在着实用化和理论上更为先进这两个声音的不断争执。而每每都是那个取得比较合适的折衷并且能真正符合实际需要的那一方才能胜出。

April 24, 2019 · 1 min · jiezi

Filecoin源码仓库全解析第七章了解PoRep与PoSt并参与复制证明游戏

欢迎大家来到第七章,经过前章《【Filecoin源码仓库全解析】第六章:如何单机部署多节点集群及矿池设计思路》的介绍,我们分享了如何在单机部署多节点集群的知识以及矿池设计的一些思路。 我们将在本章介绍目前Filecoin工程实现中所采用的复制证明(PoRep)方式与时空证明(PoSt)方式,以及如何参与协议实验室发起的复制证明游戏(Replication-Game)。 一、Filecoin所设计的证明类型Filecoin是一个利用区块链技术来实现的去中心化存储系统,我们都知道,在一个区块链系统中,需要保证每个节点公平有序地按照规则自行运转,能抵制恶意攻击,确保整个体系的可信安全。 为此,Filecoin体系下也需要一个严谨的证明手段来确保矿工不会在没有存储数据的情况下谎称自己存储了用户的数据,需要矿工凭借他们的存储能力争夺出块资格。 Filecoin系统中的证明算法最初源于存储证明(PoS)、数据持有性证(PDP)和可检索证明(PoRet),后面逐渐迭代、增强约束条件,才完善为如今工程中所采用的复制证明(PoRep)与时空证明(PoSt),这里分别详细介绍一下它们的含义: 存储证明(Proof-of-Storage, PoS):为存储空间提供的证明机制。数据持有性证明(Provable Data Possession ,PDP):用户发送数据给矿工进行存储,矿工证明数据已经被自己存储,用户可以重复检查矿工是否还在存储自己的数据。可检索证明(Proof-of-Retrievability,PoRet):和PDP过程比较类似,证明矿工存储的数据是可以用来查询的。复制证明(Proof-of-Replication,PoRep):存储证明PoS的一个实际方案,用以证明数据被矿工独立地保存,可以防止女巫攻击,外源攻击和生成攻击。空间证明(Proof-of-Space,PoSpace):存储量的证明,PoSpace是PoW的一种,不同的是PoW使用的计算资源,而PoSpace使用的是存储资源。时空证明(Proof-of-Spacetime,PoSt):证明在一段时间内,矿工在自己的存储设备上实际的存储了特定的数据。如下图所示,这6种证明的定义并不是互斥独立的,PoS包括PDP, PoRet, PoRep, PoSpace;而PoRep和PoSt是PoSpace的两种实例,他们之间的定义相互有交叉: 复制证明和时空证明的实现方式决定了 Filecoin 矿机的配置。间接决定 Filecoin 系统的整体成本。Filecoin 提供了存储和数据下载服务两种服务,系统成本最终决定用户的使用成本。 如果复制证明和时空证明消耗的资源过多,那么会系统性的提升整个 Filecoin 成本,这会让 Filecoin 系统的价值大打折扣。 目前所开源的第一版go-filecoin0.1.x系列所采用的是ZigZagDrg和StackedDrg的VDF方式来作为PoRep的实现,官方对此认为仍有改进空间,协议实验室也为此设立了RFPs基金,专门研究该课题,而复制游戏的诞生也是为了更好地让社区爱好者提前参与测试和协助官方优化这个部分。 二、复制证明PoRep2.1 PoRep职能PoRep算法的职能是用来证明一个存储系统确实存储了某一份数据的拷贝,而且每一份拷贝使用不同的物理存储,并用来抵御去中心化系统中三种常见的攻击: 2.2 PoRep本质PoRep本质是一个加密时间长,解密时间短且证明与验证过程高效的算法, 这个过程在学术圈,被称为可验证时延加密(Verifiable Time-Delay Encoding Function): 如上图,我们假设这一加密算法的验证时长是一倍,解密时间大约2-5倍,挑战有效时间算作10倍,那么这一加密时间大约要1000倍才能在概率上达到99.9%的相对安全。 2.3 挑战及证明模型Filecoin证明机制的角色和过程可以抽象成如下,挑战者、证明者、检验者。他们可以是矿工、用户或者任何网络内其他角色。涉及的定义包括如下: 挑战(challenge):系统对矿工发起提问,可能是一个问题或者一系列问题,矿工正确的答复,则挑战成功,否则失败。证明者(prover):一般只矿工。向系统提供证明了完成系统发起的挑战。检验者(verifier):向矿工发起挑战(challenge)一方,来检测是否矿工完成了数据存储任务。数据(data):用户向矿工提交的需要存储或者矿工已经存储的数据。证明(proof):矿工完成挑战(challenge)时候的回答。 如上图,验证过程可以表述为: 验证者会按照一定的规则向矿工提起挑战,挑战是随机生成的,矿工不能提前获知。矿工作为证明者相应向检验者提交证明,证明的生成需要原始数据与随机挑战信息。证明生成后,证明者会交给验证者,并由验证者判定该证明是否有效,如果有效,则挑战成功。 2.4 可验证时延加密函数(VDF) 对于VDF,Filecoin最初受到了类似Cipher Block Chaining 分组块加密链的启发,从而改进和优化属于自己的VDF方式。 我们先看一下CBC的原理:大文件分块成 d1-d4… 除了c1初始化向量比较特殊,后续所有文件块编码都需要做XOR运算和AES加密,例如c2由c1与d2共同生成,以此类推。这样在编码过程就无法并行,从而速度变慢。 再看右边的过程,是对CBC算法的进一步优化,采用的深度鲁棒链(Depth Robust Chaining),在分块上使用了有向无环图来做,进一步压缩了解码验证的复杂度,也提高了随机性。 Filecoin目前工程上的实现是基于前面两个算法的改进版:ZigZagDRG算法 ,如下图所示: 原始数据data首先依次分成一个个小数据(d1-d5),每个小数据将被计算出一个散列值(32个字节),小数据本身也将散列值作为加密种子来进行编解码。这些小数据的散列值按照DRG(Depth Robust Graph)建立连接关系。 数据块的散列关系将构成Merkle Tree结构(类MySql数据库的索引使用B+树实现)。 这样是为了在进行挑战与检验的时候,无需针对所有数据块解码,即可以快速验证,也更好地抵御了攻击性。 例如:树根即为副本的哈希,系统或者用户随机发起挑战,位置d5,矿工只需计算d5到根节点root的路径,输出一个证明给发起挑战的验证节点。 至于VDF中每个数据块的单元加密,如下图所示,应用到了BLS12-381来进行单元编码与解码: (源码路径:https://github.com/filecoin-p...) BLS12-381是一种Zcash中所用的新型zk-SNARK 椭圆曲线的构造加密算法,隶属于Bellman库,由Rust语言所实现,它的特点是小巧易用,能快速验证。Bellman的目标是让普通程序员更加简单地使用zk-SNARKs。 ...

April 24, 2019 · 2 min · jiezi

Filecoin源码仓库全解析第六章如何单机部署多节点集群及矿池设计思路

欢迎大家来到第六章,经过前章《【Filecoin源码仓库全解析】第五章:检索市场及检索矿工》的介绍,无论从定位职能,还是从设计原理,还是从工程操作角度,我们应该对目前的Filecoin检索市场有了更加深入的了解。 我们将在本章介绍如何在一台机器上构建多节点的方案和未来矿池产品设计的一些思路。 如果自己学习进度ok,实践效果符合预期,应该很快也会给大家分享多机(不同配置,不同规格,不同区域)多节点部署的方案。 一、多节点的部署需求1.单机即可使用不同的角色职能我们在第三章、第四章和第五章中,分别模拟了三个角色:存储提供方(存储矿工),存储需求方(存储用户)以及检索用户,小编用了两台不同的机器来实验。其实,也可以通过单机完成所有测试。 2.对于配置比较高的机器,可增加资源利用率虽然节点客户端对机器性能、配置要求目前比较苛刻,但是对于一些不经常处于满负荷状态,具有更高性能的机器和服务器,还是可以通过部署单机多节点方案,来增加整机资源利用率。 3.复用公网IP相比于国外,公网IP是真的稀缺资源,目前看不到IPV6短时间内普及的希望... libp2p所需的mutiaddress可通过配置端口,多路复用... 4.研发复合型产品未来,随着Filecoin项目的不断成熟,和市场需求的不断演化,将诞生除了矿机之外的一系列复合型产品和工具型产品,为了把服务能力和边界扩大,需要统一的节点管理、控制方案,以及专门针对检索市场而设计的类CDN方案,存储市场的矿池方案等。 这些,都或多或少离不开多节点的部署运维工作。本文将介绍一种直接在单机上部署和管理多节点的方案。 二、创建新节点仓库假设已编译安装了最新版的go-filecoin客户端,可参考:Filecoin源码仓库全解析】第一章:搭建Filecoin测试节点 之后,通过指定不同的仓库路径--repodir,来创建新节点2: export FCRD=$HOME/.filecoin2go-filecoin init --genesisfile=http://user.kittyhawk.wtf:8020/genesis.car --repodir=$FCRD成功后,将生成与之前默认初始化文件夹.filecoin一样结构的的.filecoin2,如图所示: 三、修改新节点配置vim .filecoin2/config.json修改默认值,重新设置新节点2的api.address和swarm.address的监听端口: { "api": { "address": "/ip4/127.0.0.1/tcp/3455" ... }, ... "swarm": { "address": "/ip4/0.0.0.0/tcp/6011" }}四、节点互联在本机上,分别启动原节点1和新节点2: go-filecoin daemongo-filecoin daemon --repodir=$FCRD启动daemon后,我们也可以对比单机节点1和节点2的配置信息,如下所示,MultiAddress与PeerID一一对应,且按照不同端口配置已生成。 我们将原节点的multiaddress记录至临时变量NODE1_ADDR中, export NODE1_ADDR=$your_node1_multiaddress通过go-filecoin swarm connect $NODE1_ADDR --repodir=$FCRD,将新节点2与原节点1建立P2P连接。 成功后并通过go-filecoin swarm peers --repodir=$FCRD复查连接状态: 如图所示,我们在新节点2的Peer集群中,查询到了原节点1的multiaddress。 这样,一个初步的单机双节点集群就部署完毕了,以此类推,可以继续批量部署下去,直至机器资源满负荷运行。 之后,我们可以在单机上分别操作多节点,并设置不同角色进行前面几章所描述的测试过程了,有条件的朋友,也可以将这几章所描述的配置逻辑编写成Shell脚本或者加入程序控制来实现自动化。 五、Filecoin矿池设计思路5.1 矿池的概念矿池从一定意义上来说,是伴随时间和市场需求演化而来,更倾向于产品的一个定义。最初起源于比特币。 在比特币的体制下,全网平均每10分钟产出一个区块,每个区块包含50(现在是12.5,每四年左右奖励减半一次)个比特币,而一个区块只可能被某一个幸运儿挖走,直接拥有所有奖励,其他人则颗粒无收,挖到的概率与矿工投入的设备算力大小成正比。 这就注定了如果比特币挖矿参与人数庞大且分散到一定程度后,挖到比特币的概率将无限接近于零,跟中彩票差不多。 这时候,如果散户要参与,资源有限,只能投入一台矿机挖矿,按照概率,要5~10年才能开采到一个区块,这使比特币挖矿陷入尴尬境地,让普通人几乎没有参与的可能,并不利于比特币的发展。 因此,解决的方案是集众人之力,收益平摊的方式,这也是矿池产品的核心,举个例子: 假设100万人参与比特币挖矿,全网400P算力,其中90%的矿工为1P(1000T)以下的算力,如果投入一台1T矿机,将占全网算力的40万分之1,理论上平均每40万个10分钟能挖到一个区块,也就是7.6年才能挖到一个区块然后一次性拿到50(现在是12.5)个比特币。那么,假如我再找9个拥有1T算力矿机的矿工,达成协定,我们总共10个人,其中任何一个人挖到区块,都按照每人的算力占比来进行平分,那么我们就是一个整体,总共10T算力,那么平均0.76年即可挖到一个区块,然后算下来到我们手上的就是0.76年开采到5个比特币,如果组织100人、1000人、1万人甚至10万人呢?如果是10万人,那么平均40分钟就能挖到1个区块,作为团队的一份子,我的收入将会趋于稳定,且参与度显著提高。 5.2 矿池的意义降低了比特币等虚拟数字货币开采的难度,降低了开采门槛,真正实现了人人皆可参与的比特币挖矿理念。提高了产业化程度,促进了更稳定的区块链服务。更合理的商业模式,完善了虚拟数字货币行业的产品形态。5.3 Filecoin可能存在矿池产品吗?首先,在DevNetworkState监控面板上有三个关键参数我们需要了解: ProvenStorage:存储矿工已提交PoSt并得到系统验证的存储量。 StoragePower:表示存储有效率,即赢得挖掘下一个区块的可能性。 %of BlocksMined 已被挖掘出的区块全网占比 ...

April 24, 2019 · 1 min · jiezi

BMIP002协议介绍

比原BMIP002协议概述比原链技术社区最近提出了一套资产规范提议,该提议允许在issue类型的交易中实现标准资产token。该标准定义资产在链上的基本功能,以及发行人通过智能合约管理资产的规范。 功能资产是一种可以在区块链上发行的价值,给定资产的的所有单位都是可替代的。 每个资产都有全球唯一的资产ID,该资产ID来自发行程序和资产定义,发行程序通常定义一组可能的签名秘钥和阀值数量的签名,这些签名必需被提供以授权发布资产的新单元。 资产定义由提交给区块链的任意键值数据组成,提供所有参与者查看。 该标准为用户提供了一种发行资产的简单方法。它允许任何满足Bytom标准的token很容易被其他应用程序支持:比如钱包,区块链浏览器,到交易所。 一个例子是商家可以在很短的时间内在他们的商业应用中列出token。 规则资产定义以下规范使用标准均JSON模式的语法 语法介绍name定义的资产token名字symbol定义的资产decimals定义token使用的小数位数quorum定义必须交易签名以发出此token单位的可能签名密钥的阈值数。reissue定义标志是否可以多次发布资产description包括由任意键值数据组成的资产描述Issuance Program创建资产时,Bytom会自动创建具有智能合约的发行程序。发行人可以根据需要多次发布任意数量的单位。自定义发行计划可能会对何时,以及由谁发布新单位强制执行进一步的限制。 提示: 以下代码片段未在Equity0.1.1(或更高版本)中编写。我们建议没有限制的发行资产程序和至少2个签名秘钥 contract IssueAsset(publicKey1: PublicKey, publicKey2: PublicKey, publicKey3: PublicKey) locks valueAmount of valueAsset { clause spend(sig1: Signature, sig2: Signature) { verify checkTxMultiSig([publicKey1, publicKey2, publicKey3], [sig1, sig2]) unlock valueAmount of valueAsset } } Issuance Program will be inactive after certain block height by adding the limitHeight parameter. contract IssueAssetWithLimit(publicKey1: PublicKey, publicKey2: PublicKey, publicKey3: PublicKey, limitHeight: Integer) locks valueAmount of valueAsset { clause spend(sig1: Signature, sig2: Signature, limitHeight: Integer) { verify below(limitHeight) verify checkTxMultiSig([publicKey1, publicKey2, publicKey3], [sig1, sig2]) unlock valueAmount of valueAsset } }比原BMIP002协议在blockmeta中的展示通过上面对BMIP002协议的介绍,我们知道BMIP002协议本质是对发行在比原链上的资产的一个规范,那接下来我们介绍一下这套规范在blockmeta中的具体展示。 ...

April 23, 2019 · 1 min · jiezi

Java比特币开发教程:Java编程买卖比特币

方案一: 通过ExinCore API进行币币交易Exincore 提供了基于Mixin Network的币币交易API. 你可以支付USDT给ExinCore, ExinCore会以最低的价格,最优惠的交易费将你购买的比特币转给你, 每一币交易都是匿名的,并且可以在链上进行验证,交易的细节只有你与ExinCore知道! ExinCore 也不知道你是谁,它只知道你的UUID. 预备知识:你先需要创建一个机器人, 方法在 教程一. 安装依赖包正如教程一里我们介绍过的, 我们需要依赖 mixin-java-sdk, 你应该先安装过它了, 这儿我们再安装其它的软件包.下载地址: mvnrepositorybuild.gradle.kts的dependencies,加入如下依赖的包: implementation("com.google.guava:guava:27.0.1-jre") implementation("commons-codec:commons-codec:1.11") implementation("com.auth0:java-jwt:3.8.0") compile(files("libs/mixin-java-sdk.jar")) implementation("com.squareup.okhttp3:okhttp:3.12.1") implementation("com.squareup.okio:okio:2.2.2") implementation("com.google.code.gson:gson:2.8.5") implementation("org.bouncycastle:bcprov-jdk16:1.46") implementation("org.apache.commons:commons-csv:1.6") implementation("org.msgpack:msgpack-core:0.8.16") implementation("com.fasterxml.jackson.core:jackson-databind:2.9.8") implementation("com.fasterxml.jackson.core:jackson-core:2.9.8") implementation("org.jetbrains.kotlin:kotlin-stdlib:1.3.30")充币到 Mixin Network, 并读出它的余额.通过ExinCore API, 可以进行BTC, USDT, EOS, ETH 等等交易, 此处演示用 USDT购买BTC 或者 用BTC购买USDT。交易前,先检查一下钱包地址。完整的步骤如下: 检查比特币或USDT的余额,钱包地址。并记下钱包地址。从第三方交易所或者你的冷钱包中,将币充到上述钱包地址。再检查一下币的余额,看到帐与否。(比特币的到帐时间是5个块的高度,约100分钟)。比特币与USDT的充值地址是一样的。 private static final String BTC_ASSET_ID = "c6d0c728-2624-429b-8e0d-d9d19b6592fa"; private static final String EOS_ASSET_ID = "6cfe566e-4aad-470b-8c9a-2fd35b49c68d"; private static final String USDT_ASSET_ID = "815b0b1a-2764-3736-8faa-42d694fa620a"; MixinAPI mixinApiUser = generateAPI_FromCSV(); JsonObject asset = mixinApiUser.getAsset(BTC_ASSET_ID); System.out.println(asset); System.out.println("------------------------BTC------Information---------------------------"); System.out.println("The BTC wallet address is " + asset.get("public_key").getAsString()); System.out.println("The BTC wallet balance is " + asset.get("balance").getAsString()); System.out.println("-----------------------------------------------------------------------");查询ExinCore市场的价格信息如何来查询ExinCore市场的价格信息呢?你要先了解你交易的基础币是什么,如果你想买比特币,卖出USDT,那么基础货币就是USDT;如果你想买USDT,卖出比特币,那么基础货币就是比特币. ...

April 22, 2019 · 4 min · jiezi

Hyperledger Fabric Node.js如何使用基于通道的事件服务

本教程说明了基于通道的事件的使用。这些事件与现有事件类似,但是特定于单个通道。在设置侦听器时,客户端处理基于通道的事件有一些新选项。从v1.1开始,基于通道的事件是Hyperledger Fabric Node.js客户端的新功能。 有关Fabric入门的更多信息,请查看构建你的第一个网络或者手把手教你走进Hyperledger Fabric。 以下假设了解Fabric网络(orderers和peer)以及Node应用程序开发,包括使用Javascript Promise。 概述客户端应用程序可以使用Fabric Node.js客户端注册“侦听器”以在将块添加到通道分类帐时接收块。我们将这些称为“基于通道的事件”,它们允许客户端开始接收来自特定块编号的块,从而允许事件处理在可能已丢失的块上正常运行。Fabric Node.js客户端还可以通过处理传入的块并查找特定的交易或链代码事件来协助客户端应用程序。这允许客户端应用程序被通知交易完成或任意链代码事件,而不必在接收时执行多个查询或搜索块。 该服务允许任何用户接收“过滤的”块事件(换句话说,不包含敏感信息)。接收“未过滤”的块事件需要对通道进行读访问。默认行为是连接以接收过滤的块事件。要连接以接收未过滤的块事件,请调用connect(true)(参见下文)。 请注意,如果你注册块事件然后提交交易,则不应对包含交易的块进行任何假设。特别是,你不应该假设你的交易处于与注册到对等方基于通道的事件服务之后收到的第一个块事件关联的块中。相反,你可以只注册一个交易事件。 通道上的APInewChannelEventHub(peer):获取ChannelEventHub的新实例的Channel实例方法。getChannelEventHubsForOrg:获取基于组织的ChannelEventHubs列表。如果省略组织名称,则使用当前用户的当前组织。在v1.1中新增的ChannelEventHub和API:registerBlockEvent(eventCallBack,errorCallBack,options):注册块事件。unregisterBlockEvent(reg_num):删除块注册。registerTxEvent(tx_id,eventCallBack,errorCallBack,options):注册特定的交易事件。unregisterTxEvent(tx_id):删除特定的交易注册。registerChaincodeEvent(ccid,eventCallBack,errorCallBack,options):注册链代码事件。unregisterChaincodeEvent(cc_handle):删除链代码事件注册。connect(full_block):使客户端通道事件中心与基于结构通道的事件服务连接。必须在您的ChannelEventHub实例接收事件之前进行此调用。当基于通道的事件中心与服务连接时,它将请求接收块或过滤的块。如果省略full_block参数,则默认为false,并且将请求过滤的块。调用connect()后,无法更改接收块或已过滤的块。disconnect():使客户端通道事件路由关闭与基于结构网络通道的事件服务的连接,并使用已注册的errorCallBacks通知所有当前通道事件注册的关闭。节点参数获取ChannelEventHub的新实例时必须包含此参数。使用连接配置文件时,该值可以是Peer实例或节点的名称,请参阅如何使用公共网络配置文件。 eventCallback参数 必须包含此参数。这是当此通道接收新块时,在侦听特定交易或链代码事件时要通知的回调函数。 errorCallback参数 这是一个可选参数。这是在此通道事件路由关闭时要通知的回调函数。关闭可能是由结构网络错误,网络连接问题或通过调用disconnect()方法引起的。 options参数 这是一个可选参数。此参数将包含以下可选属性: {integer} startBlock(可选):此选项设置为事件检查的起始块号。包含时,将要求对等方基于通道的事件服务开始从此块编号发送块。这也是如何恢复监听或重放添加到分类帐的遗漏块。默认值是分类帐上最后一个块的编号。replay事件可能会混淆其他事件监听器;因此,当使用startBlock和endBlock时,ChannelEventHub上只允许一个侦听器。当排除此参数时(因为它将正常),将要求事件服务开始从分类帐上的最后一个块发送块。{integer} endBlock(可选):此选项设置为事件检查的结束块编号。当包含时,将要求对等方的基于通道的事件服务在交付此块后停止发送块。这是如何重播添加到分类帐的遗漏块。如果未包含startBlock,则endBlock必须等于或大于当前通道块高度。replay事件可能会混淆其他事件监听器;因此,当使用startBlock和endBlock时,ChannelEventHub上只允许一个侦听器。{boolean} unregister(可选):此选项设置指示在看到事件时应删除(取消注册)注册。当应用程序使用超时仅等待指定的时间来查看交易时,超时处理应包括交易事件侦听器的手动“取消注册”,以避免意外调用事件回调。对于不同类型的事件侦听器,此设置的默认值是不同的。对于块侦听器,将end_block设置为选项时,默认值为true。对于交易侦听器,默认值为true。对于链码侦听器,默认值为false,因为匹配过滤器可能适用于许多交易。{boolean} disconnect(可选):此选项设置指示ChannelEventHub实例在看到事件后自动断开自身与对等方基于通道的事件服务的连接。除非设置了endBlock,否则默认值为false,那么它将为true。获取基于通道的事件路由Fabric Node.js客户端Channel对象中添加了新方法,以简化ChannelEventHub对象的设置。使用以下命令获取将设置为与对等方基于通道的事件服务一起使用的ChannelEventHub实例。ChannelEventHub实例将使用对等实例正在使用的所有相同端点配置设置,例如tls证书以及主机和端口地址。 使用连接配置文件(请参阅参考资料)时,可以使用节点的名称来获取新的通道事件路由。 var channel_event_hub = channel.newChannelEventHub('peer0.org1.example.com');以下是在使用连接配置文件时如何获取通道事件路由列表的示例。以下内容将根据连接配置文件的当前活动客户端client部分中定义的当前组织获取列表。组织中定义的将eventSource设置为true的对象将添加到列表中。 var channel_event_hubs = channel.getChannelEventHubsForOrg();创建节点实例时,可以使用节点实例获取ChannelEventHub实例。 let data = fs.readFileSync(path.join(__dirname, 'somepath/tlscacerts/org1.example.com-cert.pem'));let peer = client.newPeer( 'grpcs://localhost:7051', { pem: Buffer.from(data).toString(), 'ssl-target-name-override': 'peer0.org1.example.com' });let channel_event_hub = channel.newChannelEventHub(peer);区块侦听器当需要监视要添加到分类帐的新块时,请使用块事件侦听器。当新块被提交给节点上的分类帐时,将通知Fabric客户端Node.js.然后,客户端Node.js将调用应用程序的已注册回调。回调将传递新添加的块的JSON表示。请注意,当未使用true值调用connect()时,回调将接收过滤块。注册接收完整块的用户的访问权限将由节点的基于信道的事件服务检查。当需要查看先前添加的块时,回调的注册可以包括起始块号。回调将开始从此号码接收块,并在添加到分类帐时继续接收新块。这是应用程序resume和replay在应用程序脱机时可能已丢失的事件的一种方法。应用程序应记住它已处理的最后一个块,以避免replay整个分类帐。 以下示例将注册块侦听器以开始接收块。 // keep the block_reg to unregister with later if neededblock_reg = channel_event_hub.registerBlockEvent((block) => { console.log('Successfully received the block event'); <do something with the block>}, (error)=> { console.log('Failed to receive the block event ::'+error); <do something with the error>});以下示例将使用起始块编号进行注册,因为此应用程序需要在特定块中恢复并replay丢失的块。应用程序回调将像当前事件一样处理同一区域中的replay块。块侦听器将继续接收块,因为它们已提交到节点的分类帐。 ...

April 22, 2019 · 4 min · jiezi

支持EOS付款怎么这么麻烦?

EOS吹的这么牛,创始人这么厉害,感觉要超过比特币,网站允许用户支付EOS肯定很酷于是程序员满怀信心的去查找eos的api。发现了一个history 接口可以用来查询任何一个账户的历史记录。简直完美,DM果然靠谱。于是程序员开始写代码调试,但是他遇到了一个问题,21个天天赚大钱的EOS主节点没有一个允许查询历史记录的。他搜索了一下发现这个接口已经被废弃了,因为这个接口特别耗费资源,导致没有哪个主网节点愿意免费提供这种服务。于是他继续努力的放狗哥搜索,找到了一些免费服务器还提供查询,结果只调试了半天,自己的ip已经被封掉了,他必须去申请一个key才可以继续用。虽然他可以继续用一些开源的,但是他知道早晚这个接口会被彻底的放弃掉。 他当然不服气,继续找高手咨询。一个高手说目前如果想要稳定的查询账户,只有自己搭建一个全节点,然后启用hisotry 插件,只对某些账户进行查询。 但是运行EOS全节点的费用不是一个月10美金能搞定的,收到的eos还不够付服务器费用的。 另一个高手说可以通过扫描eos全部区块,分析其中属于自己的交易,从而确认入账和出账。这个思路听起来很不错,但是全节点服务器会不会因为频繁调用封掉开发者的服务器IP呢? 说好的为人类文明做贡献,怎么程序员查个帐都这么费劲?还说要干掉支付宝,结果先把程序员赶走了 即使搞定了EOS,如果要支持其他币难道也要照猫画虎来一遍? 这么算下来真是工作量超大。 难道必须用那些现成的商业公司的解决方案么?他们的介绍网页连价格都没有,估计普通个人是承受不起了。 Cedric说:要有光。于是就有了Mixin Network。 在Mixin Network的帮助下,程序员不需要搭建EOS全节点也能编程确认EOS收款。程序员只需要为每一个客户免费创建一个Mixin Network钱包。需要用户充值的时候,可以直接给用户展示该钱包的EOS充值地址。用户可以用任何一种EOS钱包实现充值,甚至包括交易所提现。如果是针对订单付款,甚至可以针对每一笔订单创建一个Mixin Nework钱包。开发者可以通过查询钱包来确认某个客户的入账或者订单的付款情况。 那么在Mixin Network上查询资金入账是否需要搭建Mixin Network全节点呢?当然不需要。Mixin的网络浏览器提供了免费的查询接口,开发者可以通过扫描浏览器来知道是否有资金入账,直接存本地数据库就行了。 创建钱包会不会很费资源?每一个mixin 钱包文件经过base64编码之后只需要1.5k 字节。每一笔资金流动只需要不到1000字节存储空间。 一杯星爸爸能存好多好多数据。 总之编程查询EOS账户是否入账这件事情,使用Mixin Network是超级划算的。省下钱可以付马爸爸的花呗,还能从另一个马爸爸那里买几个游戏皮肤。 One more thing?使用Mixin Network带来的另一个好处是你可以直接提供所有Mixin Network支持的资产的收款。比如可以直接支持波场主网代币和TRC10代币充值,却不需要搞波场的API。感觉买一送十,Mixin Network简直是数字通货支付的支付宝和PayPal。 但是,收到了一大堆各种各样的币,自己去市场买卖很麻烦,能不能编程换成一种货币呢?还真能。Mixin Network上有两个不需要注册账号的交易所。一个是exincore交易所。主打闪兑服务。只要编程支付数字货币过去,直接按市价把usdt转给你,2秒钟就完事。另一个是一个神奇的去中心化交易所Ocean,允许你挂单买卖任何Mixin Network支持的货币,已经支持的13个主链就不说了,竟然可以把任意一个ERC20 token,或者EOS token,或者TRC10 token都放在这个市场上买卖。也是直接编程支付数字货币过去,交易所匹配订单之后把币打给你。 甚至包括著名的社区币吹牛币。我花1 usdt 买到了9990个 CNB。 这才叫可编程货币。 但是等等,听说开发区块链应用要学习新的语言:solidty,或者高难度的c++,用Mixin Network需要啥语言?Mixin Network现在有7种编程语言SDK: Java, C#, PHP, Node.js, Python, Go, Ruby。必有一种适合你,不仅SDK特别全,Mixin Network还有覆盖6种编程语言的手把手教程教你如何创建钱包,查询交易,买卖数字货币。 怎么样?还不来试?难道非要放美女图片才来么?好吧,下载Mixin Messenger,大陆苹果ID可以下载畅聊版,添加好友ID 7000100214,可以看到无限美女图。 老铁,来不来?

April 22, 2019 · 1 min · jiezi

Mixin Network送出1000美金给 Java SDK 赏金任务猎人

Mixin Network在1个月以前发布了赏金任务: 完善Java SDK如今作品揭晓: yuantops/mixin_java_sdk作者已经获得由CEO cedric 颁发的5 XIN token奖励,价值1000美金。到现在,支持Mixin network的sdk已经包括PHP, Java, C#, Node.js, Python,Go, Ruby编程入门教程内容包括创建聊天机器人,机器人收发比特币,创建独立的比特币钱包,和买卖比特币。入门教程演示代码已经包括PHP, Java, C#, Node.js, Python,Go。Mixin Network 资源汇总开发者资源汇总

April 20, 2019 · 1 min · jiezi

DOS Network正式加入企业以太坊联盟(EEA)

各位DOS Network的支持者,我们很高兴地宣布DOS网络已成为企业以太坊联盟(EEA)的成员!我们期待与EEA的其他成员合作,为这个充满活力的行业做出贡献。EEA是世界上最大的开源区块链计划,是一个由成员驱动的标准组织,其章程旨在发展开放的区块链规范,以推动全球企业和消费者的协调和互操作性。其全球成员社区由领导者,采用者,创新者,开发者和企业所组成,他们一齐协作创建一个开放的,去中心化的网络,以造福每个人。EAA正在帮助财富500强企业,瑞士联合银行、俄罗斯联邦储蓄银行、桑坦德银行、摩根大通等主要金融公司,以及其他创新型创业公司和像微软这样的技术巨头与以太坊专家联系,旨在将以太坊发展成为企业级技术,提供一系列领域的研究和开发,包括隐私,机密性,可扩展性和安全性。DOS Network 是一个实现了去中心化预言机的可扩展的二层网络,为主流区块链提供数据上链服务和计算力。它将区块链智能合约与真实世界的数据和事件连接起来,还为区块链提供可验证的计算能力,从而使更多应用场景能够在区块链上实现。“我们很高兴加入企业以太坊联盟,为增强基于以太坊的区块链技术的隐私性,安全性和可扩展性做出贡献 。”——华思远,DOS网络的联合创始人兼首席执行官与EEA其他成员合作将使DOS网络能够加强其提供高质量去中心化预言机服务网络的能力。通过DOS网络,EEA可以加快区块链技术的企业级采用,并增加区块链行业的应用场景。如果你对DOS感兴趣,欢迎添加小助手dosnetwork001进入社区!

April 19, 2019 · 1 min · jiezi

利用Hyperledger Fabric开发你的第一个区块链应用

原文地址:https://www.xuanzhangjiong.to…作者:TopJohn利用Hyperledger Fabric开发你的第一个区块链应用本文示例源于fabric-samples中的fabcarhttps://github.com/hyperledge…在这个例子中,我们通过一个简单的示例程序来了解Fabric应用是如何运行的。在这个例子中使用的应用程序和智能合约(链码)统称为FabCar。这个例子很好地提供了一个开始用于理解Hyperledger Fabric。在这里,你将学会如何开发一个应用程序和智能合约来查询和更新账本,如何利用CA来生成一个应用程序需要的用于和区块链交互的X.509证书。我们使用应用程序SDk来执行智能合约中的查询更新账本的操作,这些操作在智能合约中借助底层接口实现。我们将通过3个步骤来进行讲解:搭建开发环境。我们的应用程序需要和网络交互,因此我们需要一个智能合约和应用程序使用的基础网络。学习一个简单的智能合约,FabCar。我们使用JavaScript开发智能合约。我们通过查看智能合约来学习应用程序如何使用智能合约发送交易,如何使用智能合约来查询和更新账本。使用FabCar开发一个简单的应用程序。我们的应用程序会使用FabCar智能合约来查询及更新账本上的汽车资产。我们将进入应用程序的代码中去了解如何创建交易,包括查询一辆汽车的信息,查询一批汽车的信息以及创建一辆汽车。设置区块链网络注意:下面的部分需要进入你克隆到本地的fabric-samples仓库的first-network子目录。如果你已经学习了 Building Your First Network,你应该已经下载了fabric-samples而且已经运行起了一个网络。在你进行本教程之前,你需要停止这个网络:./byfn.sh down如果你之前运行过这个教程,使用下面的命令关掉所有停止或者运行的容器。注意,这将关掉所有的容器,不论是否和Fabric有关。docker rm -f $(docker ps -aq)docker rmi -f $(docker images | grep fabcar | awk ‘{print $3}’)如果你没有这个网络和应用相关的开发环境和构件,请访问 Prerequisites页面,确保你的机器安装了必要的依赖。接下来,如果你还没有这样做的话,请浏览 Install Samples, Binaries and Docker Images页面,跟着上面的操作进行。当你克隆了fabric-samples仓库,下载了最新的稳定版Fabric镜像和相关工具之后回到教程。如果你使用的是Mac OS和Mojava,你需要安装Xcode。启动网络下面的部分需要进入fabric-samples仓库的fabcar子目录。使用startFabric.sh来启动你的网络。这个命令将启动一个区块链网络,这个网络由peer节点、排序节点、证书授权服务等组成。同时也将安装和初始化javascript版本的FabCar智能合约,我们的应用程序将通过它来操作账本。我们将通过本教程学习更过关于这些组件的内容。./startFabric.sh javascript现在,我们已经运行起来了一个示例网络,还安装和初始化了FabCar智能合约。为了运行我们的应用程序,我们需要安装一些依赖,同时让我们看一下它们是如何工作的。安装应用程序注意:下边的章节需要进入你克隆到本地的fabric-samples仓库的fabcar/javascript子目录。下面的命令来安装应用程序所需的Fabric有关的依赖。大概将话费1分钟左右的时间:npm install这个指令用于安装应用程序所需的依赖,这些依赖被定义在package.json中。其中最重要的是fabric-network类;它使得应用程序可以使用身份、钱包和连接到通道的网关,以及提交交易和等待通知。本教程也将使用fabric-ca-client类来注册用户以及他们的授权证书,生成一个fabric-network使用的合法的身份。一旦npm install执行成功,运行应用程序所需的一切就准备好了。在这个教程中,你将主要使用fabcar/javascript目录下的JavaScript文件来操作应用程序。让我们来了解一下里面有哪些文件:ls你将看到下列文件:enrollAdmin.js node_modules package.json registerUser.jsinvoke.js package-lock.json query.js wallet里面也有一些其他编程语言的文件,比如fabcar/typescript目录中。当你使用过JavaScript示例之后-其实都是类似的。如果你在使用Mac OS而且运行的是Mojava你需要安装Xcode。登记管理员用户下面的部分涉及执行和CA服务器通讯的过程。你在执行下面的程序的时候,打开一个终端执行docker logs -f ca.example.com来查看CA的日志,会是十分有帮助的。当我们创建网络的时候,一个叫admin的用户已经被授权服务器(CA)创建为登记员。我们第一步要做的是使用enroll.js程序为admin生成私钥,公钥和x.509证书。这个程序使用一个证书签名请求 (CSR)–先在本地生成私钥和公钥,然后把公钥发送到CA,CA会发布一个应用程序使用的证书。这三个凭证会保存在钱包中,以便于我们以管理员的身份使用CA。接下来我们会注册和登记一个新的应用程序用户,我们将使用这个用户来通过应用程序和区块链进行交互。让我们登记一个admin用户:node enrollAdmin.js这个命令将CA管理员证书保存在wallet目录。注册和登记user1现在我们在钱包里放了管理员的证书,我们可以登记一个新用户–user1–用这个用户来查询和更新账本:node registerUser.js和登记管理员类似,这个程序使用了CSR来登记user1并把它的证书保存到admin所在的钱包中。现在我们有了2个独立的用户–admin和user1–它们都将用于我们的应用程序。接下来是账本交互时间…查询账本区块链网络中的每个节点都拥有一个账本的副本,应用程序可以通过执行智能合约查询账本上的最新舒徐来实现查询账本操作,将结果返回给应用程序。这是一个如何查询的简单阐述:应用程序使用查询从ledger读取数据。最常见的就是查询当前账本中的最新值–世界状态。世界状态是一个键值对的集合,应用程序可以根据一个键或者多个键来查询数据。而且,当键值对是以JSON形式存在的时候,世界状态可以通过配置使用数据库(例如CouchDB)来支持富查询。这个特性对于查询匹配特定的键的值是很有帮助的,比如查询一个人的所有汽车。首先,让我们使用query.js程序来查询账本上的所有汽车。这个程序使用我们的第二个身份–user1–来操作账本。node query.js输出结果如下:Wallet path: …fabric-samples/fabcar/javascript/walletTransaction has been evaluated, result is:[{“Key”:“CAR0”, “Record”:{“colour”:“blue”,“make”:“Toyota”,“model”:“Prius”,“owner”:“Tomoko”}},{“Key”:“CAR1”, “Record”:{“colour”:“red”,“make”:“Ford”,“model”:“Mustang”,“owner”:“Brad”}},{“Key”:“CAR2”, “Record”:{“colour”:“green”,“make”:“Hyundai”,“model”:“Tucson”,“owner”:“Jin Soo”}},{“Key”:“CAR3”, “Record”:{“colour”:“yellow”,“make”:“Volkswagen”,“model”:“Passat”,“owner”:“Max”}},{“Key”:“CAR4”, “Record”:{“colour”:“black”,“make”:“Tesla”,“model”:“S”,“owner”:“Adriana”}},{“Key”:“CAR5”, “Record”:{“colour”:“purple”,“make”:“Peugeot”,“model”:“205”,“owner”:“Michel”}},{“Key”:“CAR6”, “Record”:{“colour”:“white”,“make”:“Chery”,“model”:“S22L”,“owner”:“Aarav”}},{“Key”:“CAR7”, “Record”:{“colour”:“violet”,“make”:“Fiat”,“model”:“Punto”,“owner”:“Pari”}},{“Key”:“CAR8”, “Record”:{“colour”:“indigo”,“make”:“Tata”,“model”:“Nano”,“owner”:“Valeria”}},{“Key”:“CAR9”, “Record”:{“colour”:“brown”,“make”:“Holden”,“model”:“Barina”,“owner”:“Shotaro”}}]让我们近距离看一下这个程序。使用文本编辑器(如atom或者visual studio)打开query.js。应用程序开始的时候就从fabric-network模块引入了两个关键的类FileSystemWallet和Gateway。这两个类将用于定位钱包中user1的身份,并且使用这个身份连接网络:const { FileSystemWallet, Gateway } = require(‘fabric-network’);应用程序使用网关连接网络:const gateway = new Gateway();await gateway.connect(ccp, { wallet, identity: ‘user1’ });这段代码创建了一个新的网关,然后通过它来让应用程序连接网络。cpp描述了网关通过wallet中的user1来连接网络。打开 ../../basic-network/connection.json来查看cpp是如何解析一个JSON文件的:const ccpPath = path.resolve(__dirname, ‘..’, ‘..’, ‘basic-network’, ‘connection.json’);const ccpJSON = fs.readFileSync(ccpPath, ‘utf8’);const ccp = JSON.parse(ccpJSON);如果你想了解更多关于连接配置文件的结构以及它是怎么定义网络的,请查阅 the connection profile topic一个网络可以被拆分成很多个通道,代码中下一个很重要的地方是将应用程序连接到特定的通道mychannel上:在这个通道中,我们可以通过fabcar智能合约来和账本进行交互:const contract = network.getContract(‘fabcar’);在fabcar中有许多不同的交易,我们的应用程序先使用queryAllCars交易来查询账本的世界状态:const result = await contract.evaluateTransaction(‘queryAllCars’);evaluateTransaction方法呈现了一种和区块链网络中的智能合约交互的最简单的方法。它只是根据配置文件中的定义连接一个节点,然后向节点发送请求,在节点内执行该请求。智能合约查询了节点账本上的所有汽车,然后把结果返回给应用程序。这次交互并没有更新账本。FabCar智能合约让我们看一看FabCar智能合约里的交易。进入fabric-samples下的子目录chaincode/fabcar/javascript/lib,然后用你的编辑器打开fabcar.js。看一下我们的智能合约是如何通过Contract类来定义的:class FabCar extends Contract {…在这个类结构中,你将看到定义了以下交易: initLedger,queryCar,queryAllCars,createCar和changeCarOwner。例如:async queryCar(ctx, carNumber) {…}async queryAllCars(ctx) {…}让我们更进一步看一下 queryAllCars ,看一下它是怎么和账本交互的。async queryAllCars(ctx) { const startKey = ‘CAR0’; const endKey = ‘CAR999’; const iterator = await ctx.stub.getStateByRange(startKey, endKey);这段代码定义了 queryAllCars 将要从账本获取的汽车的范围。从 CAR0 到 CAR999 的每一辆车 – 一共 1000 辆车,假定每个键都被合适地锚定了 – 将会作为查询结果被返回。 代码中剩下的部分,通过迭代将查询结果打包成 JSON 并返回给应用。下边将展示应用程序如何调用智能合约中的不同交易。每一个交易都使用一组 API 比如 getStateByRange 来和账本进行交互。了解更多API请阅读detail。你可以看到我们的queryAllCars交易,还有另一个叫做createCar。我们稍后将在教程中使用他们来更新账本,和添加新的区块。但是在那之前,返回到query程序,更改evaluateTransaction的请求来查询为CAR4。query程序现在如下:const result = await contract.evaluateTransaction(‘queryCar’, ‘CAR4’);保存程序,然后返回到fabcar/javascript目录。现在,再次运行query程序:node query.js你应该会看到如下所示:Wallet path: …fabric-samples/fabcar/javascript/walletTransaction has been evaluated, result is:{“colour”:“black”,“make”:“Tesla”,“model”:“S”,“owner”:“Adriana”}如果你查看一下之前queryAllCars的交易结果,你会看到CAR4是Adriana的黑色 Tesla model S,也就是这里返回的结果,是一样的。我们可以使用queryCar交易来查询任意汽车,使用它的键(比如CAR0)得到车辆的制造商、型号、颜色和车主等相关信息。非常好。现在你应该已经了解了智能合约中基础的查询交易,也手动修改了查询程序中的参数。是时候进行更新账本了。更新账本现在我们已经完成一些账本的查询操作,添加了一些代码,我们已经准备好更新账本了。有很 的更新操作我们可以做,但是我们从创建一辆新车开始。从一个应用程序的角度来说,更新一个账本很简单。应用程序向区块链网络提交一个交易, 当交易被验证和提交后,应用程序会收到一个交易成功的提醒。但是在底层,区块链网络中各组件中不同的共识程序协同工作,来保证账本的每一个更新提案都是合法的,而且有一个大家一致认可的顺序。上图中,我们可以看到完成这项工作的主要组件。同时,多个节点中每一个节点都拥有一份账本的副本,并可选的拥有一份智能合约的副本,网络中也有一个排序服务。排序服务保证网络中交易的一致性;它也将连接到网络中不同的应用程序的交易以定义好的顺序生成区块。我们对账本的的第一个更新是创建一辆新车。我们有一个单独的程序叫做invoke.js,用来更新账本。和查询一样,使用一个编辑器打开程序定位到我们构建和提交交易到网络的代码段:await contract.submitTransaction(‘createCar’, ‘CAR12’, ‘Honda’, ‘Accord’, ‘Black’, ‘Tom’);看一下应用程序如何调用智能合约的交易createCar来创建一辆车主为Tom的黑色Honda Accord汽车。我们使用CAR12作为这里的键,这也说明了我们不必使用连续的键。保存并运行程序:node invoke.js如果执行成功,你将看到类似输出:Wallet path: …fabric-samples/fabcar/javascript/wallet2018-12-11T14:11:40.935Z - info: [TransactionEventHandler]: _strategySuccess: strategy success for transaction “9076cd4279a71ecf99665aed0ed3590a25bba040fa6b4dd6d010f42bb26ff5d1"Transaction has been submitted注意inovke程序使用的是submitTransactionAPI和区块链网络交互的,而不是evaluateTransaction。await contract.submitTransaction(‘createCar’, ‘CAR12’, ‘Honda’, ‘Accord’, ‘Black’, ‘Tom’);submitTransaction比evaluateTransaction要复杂的多。不只是和单个节点交互,SDK将把submitTransaction提案发送到区块链网络中每一个必要的组织的节点。每一个节点都将根据这个提案执行请求的智能合约,并生成一个该节点签名的交易响应并返回给SDK 。SDK将所有经过签名的交易响应收集到一个交易中,这个交易将会被发送到排序节点。排序节点搜集并排序每个应用的交易,并把这些交易放入到一个交易区块。然后排序节点将这些区块分发到网络中的节点,每一笔交易都会在节点中进行验证和提交。最后,SDK会后到提醒,并把控制权返回给应用程序。submitTransaction也会包括一个监听器用于确保交易已经被校验和提交到账本里了。应用程序需要利用监听器或者使用submitTransaction接口,它内部已经实现了监听器。如果没有监听器,你可能无法确定交易是否被排序校验以及提交。应用程序中的这些工作由submitTransaction完成!应用程序、智能合约、节点和排序服务一起工作来保证网络中账本一致性的程序被称为共识。为了查看这个被写入账本的交易,返回到query.js并将参数CAR4更改为CAR12。换句话说就是将:const result = await contract.evaluateTransaction(‘queryCar’, ‘CAR4’);改为:const result = await contract.evaluateTransaction(‘queryCar’, ‘CAR12’);再次保存,然后查询:node query.js将返回:Wallet path: …fabric-samples/fabcar/javascript/walletTransaction has been evaluated, result is:{“colour”:“Black”,“make”:“Honda”,“model”:“Accord”,“owner”:“Tom”}恭喜。你创建了一辆汽车并验证了它记录在账本上!现在我们已经完成了,我们假设Tom很大方,想把他的Honda Accord送给一个叫Dave的人。为了完成这个,返回到invoke.js然后利用输入的参数,将智能合约的交易从createCar改为changeCarOwner:await contract.submitTransaction(‘changeCarOwner’, ‘CAR12’, ‘Dave’);第一个参数 —CAR12— 表示将要易主的车。第二个参数 —Dave— 表示车的新主人。再次保存并执行程序:node invoke.js现在我们来再次查询账本,以确定Dave和CAR12键已经关联起来了:node query.js将返回如下结果:Wallet path: …fabric-samples/fabcar/javascript/walletTransaction has been evaluated, result is:{“colour”:“Black”,“make”:“Honda”,“model”:“Accord”,“owner”:“Dave”}CAR12的主人已经从Tom变成了Dave。在实际的应用中,智能合约有权限控制逻辑。举个例子,只有有权限的用户可以创建新车,只有车子的拥有者可以转移车辆所属权。总结现在我们已经完成了账本的查询和更新,你也应该比较了解如何通过智能合约和区块链进行交互来查询账本和更新账本了。在教程中已经讲解了查询和更新的智能合约,API和SDK,想必你对其他商业场景也有了一定的了解和认识。通过FabCar这个例子,我们可以快速学习如何基于Node SDK开发应用程序。 ...

April 18, 2019 · 2 min · jiezi

DOS与QuarkChain携手共进,为满足区块链全球化商业标准

各位亲爱的支持者,我们很高兴的正式宣布DOS Network与QuarkChain携手建立重要战略合作伙伴关系。两个项目将深度合作,共同推动区块链世界的基础设施建设,一起为区块链经济的繁荣做贡献。QuarkChain是一个基于分片技术来搭建的灵活、高拓展性且方便使用的区块链底层架构。同时它是世界上首批成功实现状态分片的公链之一。QuarkChain在以往实践的基础上,引入了全新的开创性区块链架构设计,旨在用区块链技术满足全球范围商业活动的需要,通过搭建一个安全的、去中心化的、高吞吐能力的、可扩展的区块链底层技术方案,实现每秒数万级链上交易处理能力。QuarkChain提出双层链结构,跟链做确认而分片处理交易,且分片上可以自主定义任何共识、虚拟机、账本结构和代币经济学加粗文字。QuarkChain的这种灵活性使它更能在分片上采纳、应用、部署、兼容区块链领域中关于虚拟机、共识机制和代币经济学等最前沿的创新成果,以满足各行各业对区块链技术的不同需求。QuarkChain主网1.0版“奇点”,即将在2019年4月30日正式上线。届时,QuarkChain将成为第一个实现高并发分片功能的公链,及目前仅有的支持多共识、多虚拟机、多原生代币的公链。DOS Network由毕业于美国卡耐基梅隆大学电子与计算机工程专业、区块链技术早期研究者和研发工程师华思远和王琦创立,是一个支持多链的功能完全的(支持数据预言机和计算预言机)可扩展的去中心化预言机二层服务网络,它使去中心化应用能够以安全有效的方式通过去中心化的链下网络获取外部数据并执行复杂的计算,这将大大促进区块链上的应用发展。同时,DOS Network可支持各种主流区块链,如 Ethereum、EOS、TRON、ThunderCore 、Ultrain、QuarkChain等。而通过DOS Network这些公链可以获取现实世界的股票、天气、航班等各类信息。区块链与现实世界信息交互一直是阻碍区块链应用落地的另一大痛点。DOS Network长期以来致力于成为链接区块链与现实世界的“桥梁”,让链上链下信息数据有效、快速、方便的传输,从而促进区块链上的应用发展和落地。此次双方正式建立合作关系,不仅可以直接巩固双方的紧密联系,对未来的行业发展也带来了巨大的潜力和可能性:DOS Network将联合QuarkChain在区块链技术开发上共同探索研究,尤其是对链上链下信息交互的性能扩展进一步研究。DOS Network将会为QuarkChain提供强大的预言机网络的技术支持,大规模提升QuarkChain链下性能,实现链上与现实世界信息交互的目标。借助QuarkChain的影响力,DOS生态系统将会迎来新生力量,可吸引QuarkChain全球社区中的用户使用DOS的预言机服务并作为节点运营商加入DOS网络。DOS Network与QuarkChain将密切合作,双方通过技术协作和联合研发,推动资源互补,实现合作多赢。为彼此提供更多应用案例的同时推进去中心化应用的发展,双方的合作将共同建设区块链社区,为全球的区块链生态系统提供服务,推动区块链的生态发展和去中心化应用的大规模普及。如果你对DOS感兴趣,欢迎添加小助手dosnetwork001进入社区!

April 15, 2019 · 1 min · jiezi

Hyperledger Fabric 2.0 Alpha发布了!

原文地址:https://www.xuanzhangjiong.to…作者:TopJohnHyperledger Fabric 2.0 Alpha发布了!随着近期Fabric v1.4.1 LTS的发布,Fabric项目目前工作的重点正在向1.4.1和2.0的正式版推进。v2.0.0是2019年的主要目标,重点集中在更多的新特性上,包括增强的链码生命周期管理,raft共识机制,以此来循序渐进地迁移至拜占庭容错算法,以及更强大的token支持。近期发布的2.0版本建议大家仅作为尝鲜之用,生产环境暂时不要考虑。Fabric chaincode lifecycleFabric 2.0 Alpha介绍了分布式治理链码的特性,包括在你的节点上安装链码以及在一个通道中启动链码的新流程。新的Fabric生命周期允许多组织对链码的参数达成共识,例如链码在开始和账本进行交互前的背书策略。新的模型在之前的生命周期上进行了改进:多个组织必须同意链码的参数:在Fabric 1.x版本中,一个组织能够为所有其他通道成员设置链码参数(例如背书策略)。新的Fabric链码生命周期将变得更灵活,提供了中心化的信任模型(例如之前版本的生命周期模型)以及去中心化的要求足够多的组织同意才能生效的模型。更安全的链码升级过程:在之前的链码生命周期中,升级链码可以由单个组织进行发布,从而尚未安装新链码的通道成员将可能产生风险。新的模型要求只有足够数量的组织批准后才能允许升级链码。更轻松的背书策略升级:Fabric生命周期允许你在没有重新打包或者安装链码的情况下,变更背书策略。用户可以体验到默认的要求通道内大多数成员同意的策略的好处。这个策略会在通道添加或者移除组织的时候自动更新。可检查的链码包:Fabric生命周期将链码以易于阅读的tar文件的形式打包。这样可以更加轻松地检查链码代码包并协调跨多个组织安装。使用同一个安装包启动多个链码:在之前的生命周期管理中一个通道上的链码可以使用名字和版本来指定一个安装的链码。在现在的版本中你可以使用一个链码安装包在同一个通道或者不同的通道使用不同的名字进行多次部署。使用新的链码生命周期可以使用下列教程来开始使用新的链码生命周期:Chaindoce for Operators:提供了安装和定义链码所需步骤的详细概述,以及新模型可用的功能。Building Your First Network:如果你想立即开始使用新的生命周期,BYFN教程已经更新为使用新的链码生命周期来安装和定义链码了。Using Private Data in Fabric:已经更新演示如何通过新的链码生命周期来使用隐私数据集合。Endorsement policies:了解使用新的链码生命周期如何使用通道配置中的策略作为背书策略。限制Fabric v2.0 Alpha版本中链码生命周期尚未完成。具体来说,请注意Alpha版本中的以下限制:尚不支持CouchDB索引使用新生命周期定义的链码还不能通过服务发现来发现这些限制在后期将被解决。FabTokenFabric 2.0 Alpha还为用户提供了在Fabric通道上轻松将资产转化为token的功能。FabToken是一种token管理系统,它使用Unspent Transaction Output(UTXO)模型,利用Hyperledger Fabric提供的身份和成员服务基础设施来发布传输和兑换token。使用FabToken:这个操作指南提供了有关如何在Fabric网络上使用token的详细概述。该指南还包含有如何使用tokenCLI创建和传输token的示例。Alpine images从v2.0开始,Hyperledger Fabric Docker镜像将会使用Alpine Linux操作系统,一种面向安全的轻量级的Linux发行版。这意味着Docker镜像现在将会小很多,提供更快的下载和启动时间,以及在主机系统上占用更少的磁盘空间。Alpine Linux的设计初衷是考虑到安全性,而Alpine的发行版的极简主义特性大大降低了安全漏洞的风险。Raft 排序服务Raft是v1.4.1中引入的,它是一种基于etcd的奔溃容错(CFT)排序服务。Raft遵循“领导者和追随者”模型,其中每个通道都会选举一个leader,而且它的决策会复制给追随者。和基于Kafka的排序服务相比,基于Raft的排序服务将变得更容易设置和管理,并且它的设计允许遍布全球的组织成为分散的排序服务贡献节点。The Ordering Service:描述Fabric中排序服务的作用以及三种排序服务实现的概述:Solo、Kafka和Raft。Configuring and operating a Raft ordering service:展示部署基于Raft的排序服务时所需注意的配置参数和注意事项。Setting up an ordering node:描述部署排序服务节点的过程,与排序服务的实现无关。Building Your First Network:已经更新,允许使用基于Raft的排序服务来构建样本网络。

April 11, 2019 · 1 min · jiezi

Droplock:一种启动权益质押网络的新模型

随着DOS Network Beta版本的积极开发和不断完善,我们正在探索启动DOS网络的方法,想分享关于这个主题的最新想法。在这篇文章中,我们提出了一个名为“Droplock”的新模型,我们希望向社区,对DOS感兴趣的开发人员,潜在的DOS beta测试人员和节点运行者分享和收集反馈。首先,为了保障协议安全性和网络价值,任何基于权益抵押的系统(不仅是DOS网络)都需要质押足够的代币。不同的权益抵押系统之间存在差异,我们基本上可以将它们分为3种类型:PoS / DPoS区块链:共识机制为权益证明或委托权益证明的独立的区块链。以Cosmos,Tezos,Polkadot,Cardano,Dfinity,EOS,Tron,Loom,IOST等为代表。主节点:一些基于工作量证明的区块链里有特权的全节点,提供隐私、混币等额外功能,并获得一定比例的区块奖励作为回报。以Dash,Horizen(ZenCash),Zcoin等为代表。基于权益质押的协议:采用work token经济模型的系统,通常不是一条单独的区块链,而是服务和增强底层锚定的区块链的协议。以Nucypher,Enigma,Livepeer,Celer,DOS Network等为代表。PoS / DPoS区块链通常只有数量有限的验证节点,对于DPoS链尤其如此。即使对于像Cosmos这样基于PoS的链,验证节点数量的上限也就是100,而Tezos现在只有不到100个bakers(验证节点)。如此少的节点运行者对于基于权益质押的协议来说是不安全的,而且也无法满足网络的服务水平协议要求。此外,大多数PoS / DPoS区块链采用通胀的经济模型,这也不适用于以work token为模型的协议。为了激励尽可能多的节点运行者(数百个,甚至数千个)来启动和保护DOS网络,提供合理的质押激励是一种解决方案。但仅仅提供高额激励是不够的,它很容易导致投机者在短时间内操纵价格拉高出货,这对合法的节点运行者制造了昂贵的入场门槛和长期的不公平,同时也破坏了网络价值和安全性。以上是SmartCash于2018年1月推出其主节点的一个例子。不恰当的启动机制和不合理的高利息吸引投机者操纵价格并损害节点运行者和投资者的利益。总结一下,在启动一个基于权益抵押的协议网络时需要维持一些基本原则:尽可能多地引入网络维护者(节点运行者),确保广泛和公平的参与;降低网络维护者加入和离开网络时产生的价格波动性;抑制短期价格投机,炒作和抛售;使网络维护者的长期利益与投资者的利益保持一致;网络估值应该会随着网络的更多采用和使用而健康增长。Droplock介绍让我们举一个简单的例子来解释什么是Droplock。假设网络通证的总供应量1,000,000,000(10亿),并且作为节点运行者所需的最小通证数量是100,000。如果期望的目标是将网络扩展到至少1,000个节点,则意味着总供应量的至少10%将被质押和锁定。如果这完全是从二级市场获得的,那么它将极大地影响市场并引发投机。相反,我们在链上开发和部署Droplock智能合约。总量5%的网络通证被发送到Droplock合约并永久锁定在那里,同时5,000个Droplock通证(让我们简称DL)将被铸造,每个DL通证代表10,000个网络通证的权益质押配额。请注意,DL通证并不允许任何人兑换回10,000个网络通证,因此从概念上讲,5%已经从总量中永久“销毁”。它只对节点运行者有意义,因为每个DL通证代表一份网络通证的权益质押配额:假如一个节点运行者拥有2份DL通证,那它只需要获得剩余的80,000个网络通证,就有资格参与协议。DL通证将免费或者基于一些对整个网络有益的“工作量”证明的方式分发给注册的beta测试者,开发者,有意向的节点运行者等。在上面这个例子中,节点运行者没有必要作弊以获得超过3份DL通证,因为可以用DL通证代替的最大质押权益比是30%。因此,平均可以将5,000个DL分配给约2,500个节点运行者。此外,DL通证对不参与质押和节点运行的投机者和羊毛党来说没有价值。此外,由于DL通证符合ERC-20标准,因此可以在无监管的去中心化交易所进行交易。 如果将来节点运行者决定离开网络,它可以将其DL通证交换给其他感兴趣的节点运行者,这是一种双赢的局面。Droplock的好处1、Droplock对网络维护者有益:权益质押配额(DL)将被广泛分发给网络维护人员,在给定的示例中,它将平均分配给约2,500个节点运行者。这意味着网络维护人员的平均投资回报率更高,将激励更多的节点运营者质押锁定更多的通证,确保网络安全和价值。它可以减少网络维护人员加入和离开网络时的市场波动。节点运行者将来可以在DEX上交换权益质押配额(DL)并收回一些回报;获得权益质押配额(DL)比获得等量的网络通证更便宜。这是一种双赢。2、Droplock有利于二级市场和投资者:在给定的示例中,占比5%总量的网络通证会永远从流通量中“销毁”,从而提升通证的价值。节点运行者仍然需要从二级市场获得大多数(在给定示例中至少70%)网络通证才有资格参与协议质押;更不用说更高的投资回报率会激励更多的节点运行者参与。它可以稳定市场,因为权益质押配额(DL)可以在去中心化交易所上交易,而减少对二级市场上的网络代币价格的影响。3、Droplock早早洗掉投机者和羊毛党:权益质押配额(DL)将免费分发,但它可能基于对网络的某种贡献(例如,参与beta 测试网络,开发人员等)的方式来发放。即使投机者可能以某种方式获得权益质押配额(DL通证),他们也被激励与真正的需求者在去中心化交易所上早早交易获得利润之后退出,因为DL通证对于非节点运行者来说是完全没用的。这对短期投机者和长期网络维护者都有好处。Droplock是一个尝试启动权益质押类协议(比如DOS网络)的实验性想法,我们很想知道社区对此的看法,也欢迎大家积极踊跃的评论和讨论!如果你对DOS和Droplock感兴趣,欢迎添加小助手dosnetwork001进入社区!

April 11, 2019 · 1 min · jiezi

基于 SimpleChain Beta 的跨链交互与持续稳态思考

区块链扩展性迷局比特币作为第一个区块链应用与运行到目前为止最被信任的公链,其扩展性问题却持续被作为焦点贯穿着整个链的发展周期。事实上,在2009年1月4日比特币出现的那一天到2010年10月1日之间,并没有明确的区块上限,根据比特币区块链区块的数据结构最高可达到32M的容量。而在2010年10月1日的一个commit当中,中本聪第一次在代码中明确限定了1M的区块上限,就在10月3日,Jeff Garzik发布了将区块上限扩展到7M的补丁,成为了第一个硬分叉的尝试。当然,这个补丁并没有用户使用,而彼时的平均区块数据量仅在几十k左右,中本聪也在当时说明为了保证比特币系统的安全和稳定,建议不要采用Jeff Garzik所发布的补丁。随着比特币网络规模的持续扩张,链上交易变得更为活跃,区块内的数据量也逐渐增多,于是每秒7笔的交易处理速度成为瓶颈的趋势也越发明显。图表 1 比特币区块链历史大小(BitinfoCharts.com)从2015年开始Jeff Garzik就曾再次通过BIP100提出移除1MB上限,回归最早的32MB,而此时比特币算力早已突破了1P的规模边界,利益相关方中比起一般的支付用户,更多的是矿工。然而对于矿工来说,打包更多的交易意味着消耗更多的资源,也因此,一直以来比特币区块链区块的扩容从未真正达成共识,随之而来的是BCH、BSV等的分叉。而无限放大区块容量上限来解决交易处理速度的问题,显然只是权宜之计。类似的问题,在以太坊上依然存在。虽然其区块大小并未像比特币那样以一个常数作为限制,但gaslimit作为上限的设置与矿工利益的平衡也同样对以太坊的交易处理速度形成了限制,使其秒处理速度在15笔左右。也因此在ICO盛行的2017年以及类似以太猫这样的游戏爆火的时候,整个以太坊网络都会陷入交易堆积成山的瘫痪状态。在主链扩展难以破局的过程中,一方面出现了将主链区块链数据验证和计算的责任仅交由一小组高性能节点来完成的解决方式,比特股、EoS等的DPoS机制即通过这种方式啦实现。这类解决方案通过模拟现实中的议会制选举高性能节点,而难免引起了利益集团与中心化趋势的疑议。除此之外,也有通过链下交易来解决这类问题的尝试,其中比特币的闪电网络和以太坊的雷电网络是较为典型的两个实例。由于比特币UTXO的区块链模型和以太坊基于账户余额模型的区别,在链下交易通道的具体协议设计上就有了闪电网络和雷电网络的差异。然而两者之间有着共通的基本逻辑,即通过在主链外开辟针对特定交易对象的交易通道。也就是说,特定交易对象之间通过共同锁定一笔保证金,来用于特定时间区间内的交易结算,只要双方或多方交易结果没有超出保证金的额度,或者没有超时,或者没有任何一方选择中止交易通道,双方或多方的交易就不需要向全网广播获得确认,也不需要向区块链主网支付任何手续费。这使得高频小额的交易不再依赖于区块的大小或者区块的出块速度。当然,为了实现尽可能多的匹配高频交易的各种需求,闪电网络中会出现多个中转节点,用于匹配交易需求的各方。也是由于闪电网络中的交易过程要求收款环节通过签名回收,因此交易方需要实时在线,也而从这个逻辑来看,似乎中心化的交易所最适合担任中转节点的角色。而这也让社区担忧,是否最终会让高频小额交易变得日益中心化并在安全性上做出妥协。当然,不管如何,闪电网络与雷电网络的设计已经将扩展性问题的解决引导向了主链之外的第二层,将不同需求的网络和主链网络分层,成为了解决扩展性问题的一大趋势。主子链设计与分片概念分片源于数据库设计中的概念,通过分类备份和冗余来增加整体数据库的处理效率和容错性。分布式数据库中通过建立不同的分片机制满足业务系统的不同要求。区块链中针对性能扩展所提出的第二层(Layer 2)解决方案也借用了这一概念,通过将不同业务对区块链的不同需求进行分类,并各自分布在不同的子链当中,从而解决全链共识的性能瓶颈。然而,区块链与分布式数据库中较大的区别在于,分布式数据库的增删改查以及计算来自于业务系统或者中心化的数据管理系统,分布式数据库各节点仅负责响应数据管理员(DBA);而区块链的业务逻辑也来自于各节点即包含也业务逻辑、计算、也包含了至少账本层面数据的管理,也就是每个节点都可以是DBA,或者理解为根本没有DBA,因此在设计上则更为复杂。由于分布式数据库的交易逻辑为中心化控制,因此其分片可以被看作是单纯的存储分片。区块链的分片则主要分为相对简单的交易分片:即仍然保持全网络节点在数据上的全同步,仅通过分片来让不同节点运行不同的运算逻辑;和更为困难的状态分片:即同时包含了对交易与存储的分区。狭义上来理解,最直观的状态分片其实就是各种分叉,不同分叉链上各自处理的自己的交易、存储自己的账本数据,验证历史区块有效性的时候可以选择一直回溯到分叉发生前的区块,通过快照来确认历史交易。但这种类型的分片由于没有后续跨片交互的机制设计,因此并没有提升太多实际价值。那么状态分片的跨片交易需要解决的就是如何去相互验证不同分片内交易的有效性了。分片内部交易的有效性由分片内的节点通过共识机制确保,也因此在SimpleChain的设计当中,不同的分片内也同样拥有着区块链的运行机制,因此跨片交易问题在SimpleChain当中就被理解为跨链交易的问题,而分片则被定义为子链。跨链交易的形成由于跨子链交易来自于两个账本数据不一致的区块链用户之间,因此通过构造一个不作为状态存储在账本中的“对象”,可以实现类似于SPV(简单支付验证)的机制,即通过互相之间所同步的区块头来完成梅克尔证明,来验证这个构造出来的“对象”所传递信息的有效性。我们可以把这个对象称为收据。图表 2 基于收据的跨链交易确认(Ethereum wiki)在上述图表中,表示的是一个从区块链X中的用户A向在区块链Y中的用户C发送100个单位的资产的过程。(1) 这个过程首先通过生成一笔交易以及一个编号为154016的收据,并在区块链X的账本中扣除A的100个单位资产来发起。(2) 这个收据发送到区块链Y之后,通过梅克尔证明可以验证到收据所包含的信息是否正确,也就是第一笔交易是否已经在X区块链被确认,A是否已经被扣除了100个单位的资产。(3) 获得确认后,用户C从区块链Y发送一笔包含了对收据154016的梅克尔证明的交易给到区块链X,可以把这笔交易看作回执,并增加C账本中的100个单位资产。(4) 区块链X收到这个回执,并将之前的收据进行销毁,同时区块链Y也在后续的区块中将收据154016进行销毁,跨链交易完成。当然区块链X与Y也可以保留回执,用于验证后续跨链交易的持续性。为了确保上面这个机制的持续有效,我们还需要考虑跨链交易中的终局性问题,或者叫做分叉选择机制。区块链Y所验证的区块链X交易必须来自于区块链X有效链的块中的交易,而不是来源于一个孤块或者孤链。Vlad Zamfir提出过一个合并块的设计,也就是两条链在需要发起跨链交易时,两个在不同链上的块合并为同一个区块,各自的链都基于这个合并块去延长之后的块数据。但实际上合并块意味着两条链的账本同步,因此我们认为并不能解决两个分片或者两个链之间的相互独立性问题。但是跨链交易中,如何寻找正确的对方链的块去完成收据的梅克尔证明,是可以从Vlad的思路中找到答案的。Vlad将两条需要实现跨链的链进行等级排序,分为“父链”和“子链”,“子链”需要在与“父链”高度相同,或高于“父链”高度所产生的区块与“父链”进行区块合并,或者在我们的场景中是在“父链”上进行区块跨链验证。这样能够确保两个链在各自延长的过程中,跨链部分数据能够持续保持一致。图表 3 合并块机制(Vlad Zamfir)但是,在上述的解决方案中存在需要两个区块链同步出块的前提,因为如果“父链”X的交易迟迟不能确认,或者没有延长,或者“子链”Y没有及时收到X的延长情况,亦或者“子链”与“父链”存在间断性同步,则“子链”Y的后续交易有效性也都会受到相应的影响。图表 4 非同步跨链(跨片)交易在分叉时的情况(Alexander Skidanov)从上图中可以看出,两个分片或者链各自存在分叉的情况下,如果分片1中的A-B以及分片2中的V’-X’-Y’-Z’各自被确认为主链,则跨链或跨片交易没有问题,亦或A’-B’-C’-D’和V-X成为了主链,则跨片交易就失效。但假设是另外两种情况,则存在了原子性故障,也就是在一个分片中交易有效而在另一个分片中交易无效。由于两个分片或者链的异步性,导致在发起跨链交易时并不能确定两个链内部各自的主链确定情况,因此这种问题就会产生。于是分片或者子链之间的跨链交易就需要一个中间共识机制来进行协调。在以太坊2.0的设计中,信标链被赋予了这个职能。信标链可以被认为是以太坊2.0设计中所有分片链的主链,这条主链通过Casper共识机制来选举并在每一轮中随机产生分片验证者,用于协调分片之间的交易正确性。但是在属于PoS的Casper共识机制中,由于没有了难度要求、nonce、块哈希这些原本在PoW中能够执行无状态SPV证明的工具,因此要验证分片链的有效性需要回溯到可信区块,再重新计算可信区块后的区块状态一致到当前区块,才能完成验证。导致了验证者增加了工作量。因此在SimpleChain当中,为了减少验证者的工作量,类似信标链的角色则通过PoW的主链来完成。主链当中存在锚定矿工的角色,所谓锚定矿工承担三个功能角色,1. 负责在某子链发起跨链交易时验证该子链状态的有效性;2. 负责在主链中写入子链交易并广播获得确认;3. 将意在主链确认的跨链交易结果分别写入交易发起子链与交易接收子链的区块中。锚定矿工在验证、广播、和传递跨链交易时,既作为子链矿工也作为主链矿工存在。然而在主链上的矿工数量会比子链中的矿工数量多,因此在子链中伪造交易传递到主链的成本将大大低于在主链伪造交易写入子链。因此需要一种更为合理的锚定矿工选举机制。图表 5 子链中作恶矿工的概率将会高于主链(Alexander Skidanov)锚定矿工不针对于某个子链长期存在,但需要长时间作为主链矿工存在。由于PoW的主链能够允许无状态SPV证明,因此我们在SimpleChain中将锚定矿工的选举通过随机的形式来完成。一次跨链交易验证的锚定矿工数量上限=Min[(全网矿工数/子链数量)*3,全网矿工数]由于锚定矿工来自于PoW主链矿工,因此通过从小到大排列主链矿工所计算出的工作量证明计算结果,进行锚定矿工筛选。由于数值越小的工作量证明计算结果获得的概率越低,因此在锚定矿工预选列表中的排名越高,超出该次锚定矿工数量上限排名的矿工则在当前轮的交易验证中不参与签。锚定矿工选举过程的PoW排序与主链延长的PoW同步进行,即主链矿工不仅将使用工作量证明计算结果获得主链SIPC奖励,还将获得锚定矿工奖励。锚定矿工奖励来自于子链跨链交易发起者所支付的SIPC矿工手续费。在保证主子链的一致性问题上,我们采用了n个确认的机制。当发起一笔跨链交易时,子链内的区块应首先获得n个块高的确认,才能够通过锚定矿工的验证并广播至主链上。经过主链n各块高的确认后,才分别将确认后的交易状态写入跨链交易所涉及的两个子链当中。n的大小与跨链交易的金额、数据量成正比,也就是价值越高的交易所需要的在子链和主链中的确认数要求越高。目前设计中,主链确认数n沿袭了比特币的常数设定思路,由于主链平均出块时间12秒,因此主链的n值设定为15时其安全性将会接近于比特币6个确认的时间。而子链确认数则以主链15个确认的基础,基于跨链交易的金额、数据量进行动态调整。主子链结构持续稳态的经济设计图表 6 SIPC模型 (Simplechain Foundation)SimpleChain在白皮书1.0中提出了主链数字资源SIPC的微通胀机制,即随着子链的增加、子链活跃度的增加以及对跨链交易需求的增加,SIPC的区块奖励会在原本的衰减曲线基础上产生微调(上图中从绿色虚线变为黑色实线)。这种微调的结果就是当主链SIPC被作为一种资源,子链对其的需求量增加的时候,主链出块奖励将相应增加,以当前状态为例,主链出块奖励将可能从20SIPC增加到21SIPC。这一设计的目的在于让子链与主链上的角色之间的关系更为稳固。子链对主链的需求在于通过主链协调跨链交易,一笔跨链交易的过程为:(1) 子链用户发起跨链交易并支付手续费,手续费包含子链Token(T)与主链SIPC(S);(2) 子链矿工或验证节点完成共识验证并收取部分子链Token(t1)作为手续费;(3) 被选举出来的跨链矿工收取剩余部分子链Token(t2)以及手续费中的全部主链SIPC(S)以及运营池中的部分SIPC(s2)作为手续费完成跨链锚定与广播;(4) 一般主链矿工收取主链交易手续费SIPC(S’)打包跨链交易;(5) 另一条子链锚定矿工读取主链中的跨链交易,广播至目标子链中。以上过程中T=t1+t2,然而一般主链矿工收取的主链交易手续费S’=R+k,R为原始主链出块奖励,即当前的20SIPC,k则为微通胀调节奖励。上面出现了运营池的概念,所谓运营池即是在子链初期创建时,创建节点通过抵押SIPC的形式向子链注入的启动资源,运营池中的SIPC将在跨链交易中作为部分奖励s,输出给锚定矿工。假设一个资料的启动运营池容量是10SIPC,在跨链过程中,每次会分出其中的0.1SIPC给到跨链矿工作为跨链矿工的部分奖励,一次交易过后运营池容量减少为9.9SIPC。此时,一般主链矿工收取到的交易手续费S’=20+0.01,这0.01就是微通胀调节奖励。运营池可以由任何SimpleChain用户选择再次注入SIPC,也可由子链共识触发活跃度下限,更改跨链矿工奖励来使得跨链矿工获得的s2为负,即部分跨链手续费被存入子链运营池。此时,一般主链矿工收取的手续费中的微通胀调节奖励k将为0或转向负数。这种情况下表明子链走向衰退期,或子链与主链将逐渐通过减少互相激励而脱离关系。潜在风险与后期讨论上述模型中可能存在的技术风险包括主链区块当中对于包含跨链交易的交易量上限问题,以及过多锚定矿工造成的主链负担过重的问题。经济模型方面,存在“损人不利己”攻击的可能,即通过创建衰减子链,影响主链矿工与用户利益的情况。References[1]. BitInforCharts (2019) Bitcoin Block Size historical chart, Available from: https://bitinfocharts.com/com… [Accessed on 02/04/2019][2]. Buterin. V(2015) On Slow and Fast Block Times, Available from: https://blog.ethereum.org/201… [Accessed on 04/04/2019][3]. Buterin. V(2019) Merge blocks and synchronous cross-shard state execution, Available from: https://ethresear.ch/t/merge-… [Accessed on 03/04/2019][4]. Buterin. V(2019) How can we facilitate cross-shard communication?, Available from: https://github.com/ethereum/w… [Accessed on 03/04/2019][5]. Prestwich. J(2019) What to expect when eths expecting, Chinese Version Translated by EthFans, Available from https://ethfans.org/posts/wha… [Accessed on 02/04/2019][6]. Skidanov. A(2019) The authoritative guide to blockchain sharding part 1, Chinese Version Translated by EthFans, Available from: https://ethfans.org/posts/the… [Accessed on 02/04/2019][7]. Skidanov. A(2019) The authoritative guide to blockchain sharding part 2: Unsolved problems in blockchain sharding, Chinese Version Translated by EthFans,https://ethfans.org/posts/uns… [Accessed on 02/04/2019][8]. Zamir. V(2018) Casper, Ethereum Community Conference on March 8-10,2018, Available from: https://www.youtube.com/watch...[Accessed on 03/04/2019] ...

April 10, 2019 · 1 min · jiezi

Node.js买卖比特币 教程

通过 Nodejs 买卖BitcoinGithub Repo方案一: 通过ExinCore API进行币币交易Exincore 提供了基于Mixin Network的币币交易API.你可以支付USDT给ExinCore, ExinCore会以最低的价格,最优惠的交易费将你购买的比特币转给你, 每一币交易都是匿名的,并且可以在区块链上进行验证,交易的细节只有你与ExinCore知道!ExinCore 也不知道你是谁,它只知道你的UUID.预备知识:你先需要创建一个机器人, 方法在 教程一.安装依赖包正如教程一里我们介绍过的, 我们需要依赖 mixin-node-client, 你应该先安装过它了, 这儿我们再安装其它的软件包. yarn add fast-csv inquirer msgpack5 path pem-fileor npm i fast-csv inquirer msgpack5 path pem-file充币到 Mixin Network, 并读出它的余额.通过ExinCore API, 可以进行BTC, USDT, EOS, ETH 等等交易, 此处演示用 USDT购买BTC 或者 用BTC购买USDT。交易前,先检查一下钱包地址。完整的步骤如下:检查比特币或USDT的余额,钱包地址。并记下钱包地址。从第三方交易所或者你的冷钱包中,将币充到上述钱包地址。再检查一下币的余额,看到帐与否。(比特币的到帐时间是5个区块的高度,约100分钟)。比特币与USDT的充值地址是一样的。 let aesKey = ‘’; const privateKeyBytes = pem.decode(Buffer.from(data[0])); const aesKeyBuffer = await oaepDecrypt( Buffer.from(data[1], ‘base64’), privateKeyBytes, ‘SHA-256’, Buffer.from(data[2]) ); aesKey = Buffer.from(aesKeyBuffer).toString(‘base64’); // console.log(aesKey); const newUserConfig = {clientId: data[3], aesKey: aesKey, privateKey: data[0], sessionId: data[2], clientSecret: “do not need”, assetPin: data[4]}; // console.log(newUserConfig); const newUserClient = new HttpClient(newUserConfig); if ( args.type === TYPE_ASSETS_INFO ) { const assetsInfo = await newUserClient.getUserAssets(); console.log(assetsInfo); } else if (args.type === TYPE_BITCOIN_INFO) { // console.log(‘You choice to 1:’, args); const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID); console.log(“Bitcoin address is “, assetInfo.public_key); console.log(“Bitcoin balance is “, assetInfo.balance); console.log(“Bitcoin price is (USD) “, assetInfo.price_usd);查询ExinCore市场的价格信息如何来查询ExinCore市场的价格信息呢?你要先了解你交易的基础币是什么,如果你想买比特币,卖出USDT,那么基础货币就是USDT;如果你想买USDT,卖出比特币,那么基础货币就是比特币. if ( args.type === TYPE_FETCH_USDT_MARKETINFO ) { // Make a request var instance = axios.create({ baseURL: ‘https://exinone.com/exincore/markets', timeout: 3000, headers: {‘X-Custom-Header’: ‘foobar’} }); instance.get(’?base_asset=’ + USDT_ASSET_ID) .then(function(response) { console.log(response.data.data); }); } else if ( args.type === TYPE_FETCH_BTC_MARKETINFO ) { var instance = axios.create({ baseURL: ‘https://exinone.com/exincore/markets', timeout: 3000, headers: {‘X-Custom-Header’: ‘foobar’} }); instance.get(’?base_asset=’ + BTC_ASSET_ID) .then(function(response) { console.log(response.data.data); }); }交易前,创建一个Memo!在第二章里,基于Mixin Network的 Nodejs 比特币开发教程: 机器人接受比特币并立即退还用户, 我们学习过退还用户比特币,在这里,我们除了给ExinCore支付币外,还要告诉他我们想购买的币是什么,即将想购买的币存到memo里。const bytes = Buffer.from( BTC_ASSET_ID.replace(/-/g, ‘’), ‘hex’);const memo = msgpack .encode({ A: bytes, }) .toString(‘base64’);console.log(memo);币币交易的完整流程转币给ExinCore时,将memo写入你希望购买的币,否则,ExinCore会直接退币给你!如果你想卖出比特币买入USDT,调用方式如下:const EXIN_BOT = “61103d28-3ac2-44a2-ae34-bd956070dab1”;const BTC_ASSET_ID = “c6d0c728-2624-429b-8e0d-d9d19b6592fa”;const EOS_ASSET_ID = “6cfe566e-4aad-470b-8c9a-2fd35b49c68d”;const USDT_ASSET_ID = “815b0b1a-2764-3736-8faa-42d694fa620a”;//change to your third exchange/cold btc wallet addressconst BTC_WALLET_ADDR = “14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C”;const EOS_WALLET_NAME = “huobideposit”;const EOS_WALLET_TAG = “1872050”;//change to your mixin messenger account ’s uuidconst MASTER_UUID = “0b4f49dc-8fb4-4539-9a89-fb3afc613747”;else if ( args.type === TYPE_EXCHANGE_BTC_USDT ) { // Pack memo const bytes = Buffer.from( USDT_ASSET_ID.replace(/-/g, ‘’), ‘hex’ ); const memo = msgpack .encode({ A: bytes, }) .toString(‘base64’); console.log(memo); // gaFBxBDG0McoJiRCm44N2dGbZZL6 const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID); console.log(“The Wallet ’s BTC balance is “, assetInfo.balance); if ( assetInfo.balance >= 0.0001 ) { const Obj = { assetId: BTC_ASSET_ID, recipientId: EXIN_BOT, traceId: newUserClient.getUUID(), amount: “0.0001”, memo: memo, } console.log(Obj); newUserClient.transferFromBot(Obj); } else { console.log(“Not enough BTC!”); }}如果你想卖出USDT买入比特币,调用方式如下:else if ( args.type === TYPE_EXCHANGE_USDT_BTC ) { // Pack memo const bytes = Buffer.from( BTC_ASSET_ID.replace(/-/g, ‘’), ‘hex’ ); const memo = msgpack .encode({ A: bytes, }) .toString(‘base64’); console.log(memo); const assetInfo = await newUserClient.getUserAsset(USDT_ASSET_ID); console.log(“The Wallet ’s BTC balance is “, assetInfo.balance); if ( assetInfo.balance >= 1 ) { const Obj = { assetId: USDT_ASSET_ID, recipientId: EXIN_BOT, traceId: newUserClient.getUUID(), amount: “1”, memo: memo, } console.log(Obj); newUserClient.transferFromBot(Obj); } else { console.log(“Not enough USDT!”); }}交易完成后,Exincore会将你需要的币转到你的帐上,同样,会在memo里,记录成交价格,交易费用等信息!你只需要按下面的方式解开即可!getSnapshots 读取钱包的交易记录。if ( args.type === TYPE_READ_SNAPSHOTS ) { const prompts = [ { name: ‘datetime’, type: ‘input’, message: “Input iso8601 datetime: “, }, ]; const answers = await inquirer.prompt(prompts); console.log(answers); console.log(encodeURIComponent(answers.datetime)); const snapshots = await newUserClient.getSnapshots({ limit: 10, asset: USDT_ASSET_ID, offset: answers.datetime, order: “ASC”}); // console.log(snapshots); snapshots.forEach(function(element) { if ( element.amount > 0) { if ( element.data != null ) { console.log(element.amount); console.log(element.data); const buf = Buffer.from(element.data, ‘base64’); console.log(msgpack.decode(buf)); const codeInt = msgpack.decode(buf).C; if ( codeInt === 1000 ) { console.log(“Successful Exchange”); } else { console.log(“Go to there get more info https://github.com/exinone/exincore#code error code: " + codeStr);} const hexStr = Buffer.from(msgpack.decode(buf).FA).toString(‘hex’); const uuid = ${hexStr.slice(0,8)}-${hexStr.slice(8,12)}-${hexStr.slice(12,16)}-${hexStr.slice(16,20)}-${hexStr.slice(20)}; console.log(“Asset uuid is :” + uuid); const priceStr = msgpack.decode(buf).P; console.log(“Price is :” + priceStr); const feeStr = msgpack.decode(buf).F; console.log(“Fee is :” + feeStr); console.log(“percent of Fee is :” + (feeStr/element.amount)* 100 + " %”); const tStr = msgpack.decode(buf).T; console.log(“T is :” + tStr); } } });}一次成功的交易如下:Make your choose 16: Read snapshotsYou choice to : { type: ‘16: Read snapshots’ }You wallet is : 0b10471b-1aed-3944-9eda-5ab947562761? Input iso8601 datetime: 2019-04-08T05:16:33.615253Z{ datetime: ‘2019-04-08T05:16:33.615253Z’ }2019-04-08T05%3A16%3A33.615253Z0.5228004hqFDzQPooVCnNTI0OC45OKFGqTAuMDAxMDQ5OKJGQcQQgVsLGidkNzaPqkLWlPpiCqFUoVKhT8QQeJyt3MrqSGOpbqzFXy5JUw=={ C: 1000, P: ‘5248.98’, F: ‘0.0010498’, FA: <Buffer 81 5b 0b 1a 27 64 37 36 8f aa 42 d6 94 fa 62 0a>, T: ‘R’, O: <Buffer 78 9c ad dc ca ea 48 63 a9 6e ac c5 5f 2e 49 53> }Successful ExchangeAsset uuid is :815b0b1a-2764-3736-8faa-42d694fa620aPrice is :5248.98Fee is :0.0010498percent of Fee is :0.2008032128514056 %T is :R You select the : 0b10471b-1aed-3944-9eda-5ab947562761You select the wallet 0b10471b-1aed-3944-9eda-5ab947562761读取币的余额通过读取币的余额,来确认交易情况!if (args.type === TYPE_BITCOIN_INFO) { // console.log(‘You choice to 1:’, args); const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID); console.log(“Bitcoin address is “, assetInfo.public_key); console.log(“Bitcoin balance is “, assetInfo.balance); console.log(“Bitcoin price is (USD) “, assetInfo.price_usd);}源代码执行编译执行,即可开始交易了.[x] node bitcoin-wallet-nodejs.js 编译项目.本代码执行时的命令列表:Make your choose(select the uuid for open the specified wallet): 0b10471b-1aed-3944-9eda-5ab947562761 You select the : 0b10471b-1aed-3944-9eda-5ab947562761You select the wallet 0b10471b-1aed-3944-9eda-5ab947562761?Make your choose (Use arrow keys)0: Read All Asssets Balance1: Read Bitcoin Balance & Address2: Read USDT Balance & Address3: Read EOS Balance & Address4: Transfer BTC from Bot to Wallet5: Transfer EOS from Bot to Wallet6: Transfer BTC from Wallet to Master7: Transfer EOS from Wallet to Master8: Verify Wallet PIN9: BTC withdraw10: EOS withdraw11: Fetch BTC withdrawal info12: Fetch EOS withdrawal info13: Fetch USDT Market info14: Fetch BTC Market info14: Transfer 0.0001 BTC buy USDT15: Transfer USDT $1 buy BTC16: Read snapshotsExit完整代码Solution Two: List your order on Ocean.One exchange ...

April 10, 2019 · 4 min · jiezi

调用Bytom Chrome插件钱包开发Dapp

安装使用插件钱包1. 打开Google浏览器的应用商店,搜索Bystore下载链接:http://t.cn/E6cFFwb2. 然后点击添加到Chrome,就可以添加到我们的:3. 使用google插件钱包如果你使用的是测试网,可以去测试网水龙头领取BTM。测试网水龙头:http://test.blockmeta.com/fau…搭建Dapp demoDapp demo是一个基于比原的储蓄合约,该demo可以进行资产的锁仓储蓄,到期返还资产并给一定的利息。这个dapp很适合的场景就是股息分红,内部通过智能合约自动锁仓操作,到期资产自动解锁。所以我个人对这个dapp应用场景表示非常看好。项目源码地址:https://github.com/Bytom/Byto…根据源码里面的readme.md文件进行搭建dapp,然后我们在本地打开http://127.0.0.1:8080 后就可以看该dapp应用。然后我们点开我们的账户如下图:点击saving,我们看到的是储蓄资产界面,用户可以设置资产的金额,并储蓄资产下图是我们收益的页面,我们可以看到自己储蓄的收益,如果是到期的话我们可以提出自己的收益。Dapp调起Google插件的实现初始化注入检查插件,账户调交易接口下图是发送交易的API接口,接口的具体文档参考:https://github.com/Bytom/Byst…。还有其他的API接口都在该文档里面。监听事件接口bytom.request(eventName, options)。后端服务器接口由于比原链采用的UTXO模型,该模型没有状态。但是在开发dapp的过程中需要关联用户的的地址。所以后端服务器主要是封装一层类似账户模型,方便dapp跟链进行交互。开发者开发dapp可以搭建改项目作为与链交互的服务器,自己搭建参考项目的readme.后端服务器项目地址:https://github.com/oysheng/bu…Dapp开发流程梳理通过上面的一系列步骤,我们已经大概明白基于比原链开发dapp的一个大致流程。流程总结就是:step1: 下载安装Chrome插件钱包,如果自己的dapp不需要跳过这一步。step2: 如果需要自己搭建BlockCenter后端服务器,参考项目说明文件安装。不想搭建的话,直接用官方的服务,直接远程调用即可。step3: 开发智能合约,并编译。然后将编译后的合约参数配置在dapp的配置文件,如下图:(全红部分是测试网合约配置参数)step4:调用Chrome插件钱包。到此,在比原链上开发dapp的整套流程都已经梳理清楚,欢迎大家快速上手试试。开发出优秀的dapp应用。Github: https://github.com/bycoinio/B…

April 8, 2019 · 1 min · jiezi

区块链笔记(1)基础概念扫盲

正如民谣像一杯酒,有故事的人听不得。深夜失眠的我,无意翻起中本聪的白皮书,就注定了无眠。今夜的我只醉心于技术,别问是真是假。这是一篇关于区块链基础的笔记,涉及了我认为对于初学者来说,想要进一步深入前需要了解的最重要的几个概念,概括如下图:一、金融交易在深入了解区块链的技术细节之前,明白它为什么存在对理解它是很有帮助的。区块链技术,最早是在金融交易领域破土发芽的,但在这之前,金融交易系统已经大体正常运作了许多年。所谓变革的新技术,必定对既有领域中一些核心理念发起了冲击,并提出了自己的解决方案。只在一个行业领域的“兴风作浪”,充其量只能算作改进,若说成是变革,那么这项技术的思想及提供的解决方案,必定能跨越多个行业领域继续“兴风作浪”。在我们探究金融交易系统的缘起流变之前,先埋下两个问题。金钱在整个金融系统中已无处不在,它到底有什么价值,让人们不得不去使用它?在当前的金融系统中,有什么我们可以进行改进的方面?现有的金融系统假设我们回到金融交易的历史源头,来为人们设计搭建一套金融系统。首先得明白人们的现状和需求:每个人都拥有属于自己并可以提供给他人的产品或服务,同时也存在自己所稀缺的。为了均衡这种稀缺和富余,每个人可以对自己所拥有东西的价值进行评估,以及所要换取的东西进行预期,这便是贸易的开始。但以物易物的贸易存在一个不争的事实:交易双方需要通过沟通谈判,来确定交易时物品的价值。当从小范围内的交易,扩展到更大范围的贸易时,相对公允的价格参考就需要被呼唤出来了。而像黄金这样,存量稀缺有价值、属性稳定可长存、体积不大便携带的物品,作为价格参考便再合适不过。更进一步地,人们创造出货币代替了黄金。由于货币属于人造物,自然就需要对于基于此的交易进行记录和管理,已保证人们拥有财富的安全,于是银行作为可信赖第三方便出现了。人们可在银行中安全的存放金钱,信赖基于货币进行的交易,这是非常有价值的。同时不免想问,银行又是如何做到这一点的呢?当一个有价值的创新,成为了日常生活中不可或缺的一部分时,它的实现原理与运行机制,对于大多数使用者来说就会变的透明了。可想而知,在全球贸易如此普遍的今天,银行维持系统正常运作,所需要的子系统及工具绝对成百上千。这里介绍其中一个重要的工具:分类账,它记录的交易信息包括:发送方、接收方、交易时间、交易额度。银行可以利用分类账记录的信息做一些很酷的事情。比如,由于知道谁有钱,谁负债,以及拥有钱的数额,那么便可以确保互不认识的交易双方达成信赖。同时这也帮助解决了所谓的“双花问题”,所谓双花问题就是,某人将同一份笔钱花了不止一次。为使一个金融系统正常运行,这种现象是不被允许的,因为你可以想象,这完全是在印钞呀。银行可以通过分类账上的记录,来避免双花问题,因为银行知道第一次交易发生的时间,那么同笔钱第二次交易时就可以认定为无效。区块链的改进银行作为可信赖第三方,对于金融交易信息的全知视角,便是我们长期以来解决这个问题的一种途径。但是区块链技术提供了一种不同的,或许是更好的方式。因为现有的金融系统,不可否认地依然存在着一些问题:交易数据的访问权银行在金融系统中的地位太过重要,它确定拥有我们所有的交易数据,但我们不确定银行是否将这些数据同样共享给我们,这样是否真的合理呢?任何的不公,都是从信息不对称开始的,你说呢。类似于银行所用的分类账,我们可以创建一个共享的分类账来供所有人访问。解决一个问题的同时,总会有新的问题伴随着产生。所创建的共享分类账,是否能达到与目前银行同样的安全与信任程度?类似银行的可信赖第三方并不唯一现在我们有一个转账需求要完成,可采用的途径并非去银行借记一种方式,还可以信用卡、支付宝、微信、PayPal等等。无论你选择哪种,你都需要给他们提供相关必要的信息。而若当你尝试进行更加复杂的交易时,可能涉及中间环节的公司也会越来越多,这必然会产生额外的费用以及交易延迟。这也是区块链技术尝试解决的一点。区块链技术发展迅速,想法和工具都会层出不穷,只有我们牢牢抓住目标,我们才能做出明智的取舍。二、关于比特币区块链现在已经是一个跨越许多平台和行业的热门话题,每天都有许多更新层出不穷,如果我们要去对区块链追根溯源,比特币是一个不容忽视的里程碑。它的相关概念和想法影响着所有后来的其他区块链应用,所以我们可以通过了解比特币,来明白它的核心思想,是如何帮助建立起今天所熟知的区块链的。比特币使用块的概念,来分组和验证交易信息,将若干个交易打包到一个块中进行管理。这个想法对比特币乃至区块链来说都非常重要,但却不是比特币首先提出来的,早在1991年,Haber和Stornetta 发表了一篇名为How to Time-stamp a Digital Document的论文,提出了一种验证文档的新方式:采用文档更新的时间戳,将不同的版本按此顺序组成一个文档连。如此看这两位老铁也算是区块链的先驱了。区块链元年2008年,一个叫做中本聪(Satoshi Nakamoto)的神秘作家发表了一封名为Bitcoin: A Peer to Peer Electronic Cash System的白皮书,奠定了比特币的基础,也完全改变了我们看待和理解货币的方式。接着在2009年1月3日,中本聪发布了比特币软件,同时将第一个比特币带到了这个世界。中本聪的这篇白皮书真是读一读神清气爽,开篇第一句就开始描述,点对点电子现金系统如何绕过对中心化银行的需求。通篇谈及了交易、时间戳、工作量证明、网络以及许多关于比特币如何运作的概念,或许目前你对于这些概念的技术细节还不是很清楚,不过没关系,当我们初次面对一个新技术的时候都这样。让我们怀着以下问题,继续往下探索:比特币尝试在解决什么问题?它提出了怎样的解决方案?开发这个新系统都用到了什么组件?三、Hashing目前我们对区块链技术的起心动念,已经有了一个大体的了解。接下来我们逐一简介,上图区块链框架中的各部分组件,首先是哈希和一个特殊的哈希函数SHA256。哈希值可以被当做是信息的数字指纹,它是由字母和数字组成的唯一字符串,用以代表或者说是对应一组数据,哈希函数的作用,就是完成给定数据到唯一哈希值得映射。SHA256是一个特殊的哈希函数,SHA是Secure Hashing Algorithm的缩写,256表示其输出的哈希值是256位的。除此之外还有许多不同的哈希函数,比特币从中选择了SHA256函数,来计算区块链上每个区块的哈希值,这样做的原因是方便对区块的引用,以及完整性的校验。更详细的使用方式可以参考JS类库crypto-js。为了理解哈希值是如何将数据组成为链的,我们需要对区块和区块链的概念有更多一点的了解。四、区块如字面意思,区块就是保存区块链上一定量交易信息的容器。如前所述,区块链是一个在网络中存储所有交易记录的共享分类记账单,当我们让它无限地运行下去时,就意味着这个记录所有交易的账单会变得非常庞大。那么将所有的记录作为一个整体来使用或管理,都会非常困难,明智的方法便是化整为零,来存储这些交易信息于许多个小区块中。那这样包含数量有限交易信息的小区块长什么样呢?一个区块大体分为主体和头部,交易信息存储在主体中,而头部包含了一些额外信息诸如:前一个区块的哈希值。各个区块也就是通过该值相连构成链状结构的。区块被创建的时间戳。每个区块创建的时间,能够帮助我们确定某项交易生效的时间,这将有效地解决前面讲到的双花问题。Merkle root。是一个代表区块中每个交易的哈希值。一个哈希值如何代表区块中所有的交易呢?这里的骚操作是这样的:所有的交易对象两两取哈希值,然后再对得到的哈希值再两两取哈希值,以此类推,所得到的最后一个哈希值即是Merkle root,说白了就是一个二叉树的根节点。这么做的原因是,可以快速查找出区块中不一致的交易,不一致的产生可能是因为传输损坏或篡改。Nonce随机数。在创建区块时,网络中可能会存在许多个体同时发起请求,想要创建该区块,这其实就是所谓的“挖矿”,那么区块链网络该如何决定由谁来创建一个区块呢?这就是所谓的创建区块的复杂度问题。解决方案的关键就是这个随机数,比特币系统要求每个想要创建下一个区块的请求方,都要提供一个特定的哈希值,这个哈希值由区块所包含的内容blockData和这个随机数nonce,即SHA256({ blockData, nonce}),通过哈希函数计算得到。额外的要求是,所得到的哈希值需要以特定数量0开始,这就需要重复的取哈希值一遍又一遍的计算,直到满足要求。也可以看出,该特定哈希值开头要求得0数量越多,创建该区块的复杂度就越高,反之亦然。区块大小。顾名思义,就是一个区块能存储信息的大小,这是由开发者在区块链创建时定下来的,当一个区块写入的交易信息达到该区块大小的限制时,就是该创建新区块的时候了。五、区块链区块链是一个共享数字分类账,它包含了发生在网络上的所有交易的历史信息,存储在区块链上的信息永久保存且不可改变。构成区块链的两个重要因素是:区块和哈希值,每一个区块包含自己的哈希值,以及一个指向前一个区块的哈希值,通过哈希值将所有区块按照创建顺序连接成区块链。区块链这种由哈希值链接而成的结构,带来了一个有趣的性质:不易更改。当想要更改一个区块的内容时,由于哈希值得完整性,该区块的哈希值也必将更改,又由于该区块的下一个区块的头部中,包含了指向该区块的哈希值,后继区块哈希值的计算包含了指向前序区块的哈希值,前序区块哈希值得更改,就必然连锁的更改所有后继的哈希值。区块链不易更改的性质,造就了其安全性。六、分布式点对点网络运行区块链的网络比较特殊,叫做分布式点对点网络。为了能够清楚地理解,就字面可以拆成两块来看:点对点网络和分布式网络。所谓点对点网络,就是允许网络中的任意两个节点,可以相互直接通信,而不需要通过什么中心化的节点。举些例子,微信,Google的环聊,Skype都属于点对点网络。而分布式网络,允许在许多用户间进行信息传递。这样的定义,我第一次看到也很费解,为了更好地理解,最好的方法论就是比较与鉴别。我可以把中心化网络,非中心化网络以及分布式网络拿到一起来看。但在细看之前,需要明白一点,每一种网络都有他们各自的优势和使用场景,我们在区块链中采用分布式网络,只是由于比较来看,分布式网络更适合于区块链应用。在中心化网络中,所有的信息都集中于一个节点上,其他节点都与中心节点相连。可以拿图书馆的例子来类比,将所有图书都集中保存在唯一的一个图书馆中,人们需要查阅资料或借阅图书,都来这个图书馆就好。好处是书籍与资料集中后便于管理,但问题也是显而易见的:其一,容灾性较差,假如这个唯一的图书馆失火或遭到破坏,由于所有信息只有这里独一份,损失后便无法恢复。其二,对于用户来说,非常不方便,所有人都需要到图书馆才能获取信息,无论你在何处。于是就有了非中心化网络的改进方案,备份出全部或部分图书馆中的资料,建立多个地区或区域性的图书馆,这样便有了一定的灾备性。而分布式网络,则是把这个思路做到了极致。不需要图书馆了,每个人家里书架摆上50来本树,如果没有的话再相互借。把上述例子中的图书换成交易数据,就是我们比特币网络的样子,每个节点虽然不一定存储了所有的数据,但是通过这个分布式点对点网络,他们可以获取到区块链的所有数据。七、内存池我们随时的起心动念都可以产生一个交易,但这并不意味着网络处理交易的速度,能够实时的跟上交易产生的速度。也就是说,一定时间内,产生交易的数量可能会超过网络处理交易的数量,那么对于那些暂时未确认写入区块链的交易,就需要一个地方来存储这些信息,这个地方就叫做:内存池。交易信息被写入区块之前,需要经过网络的确认与验证,这个工作是由区块链网络中一些叫作“矿工”的节点来完成的。具体到如何挖矿稍后介绍,这里先大致有一个概念。blockchain.info这个站点提供了一些比特币区块的专业服务以及加密货币钱包,除此之外,还有一些区块状态的神仙图标可以免费查看。比如我们可以来关注一下,当前未确认的区块情况:图中和日期一行的字符串,是一条交易的哈希值;和绿色箭头一行的字符串,是交易双方的钱包,可以类比电子邮箱,只不过这里是用来发送比特币的。一条交易信息离开内存池的原因,除了由矿工校验过后加入区块,还有一些其他原因:一条交易信息在内存池中停留的过久,若超过14天还没有被矿工写入区块,则会被移除。在内存池的堆栈中,所有的交易都是按照小费的大小,由高到低排序的。当内存池的存储空间达到上限的时候,此时来了一个小费大于目前内存池中最少小费的交易,那么小费值最少的交易将会被移除内存池。这个小费的额度,是是由发起交易的人确定的,如果希望自己的交易信息被矿工更早的写入区块,可以适当提高小费值。当然并不是不给小费,你的交易信息就不会写入,这要看节点的具体情况。如果区块中已经有了该交易信息,在写入验证阶段,会将重复的交易信息移除内存池。如果将要写入的交易信息,和目前区块链中的交易存在冲突,也将会被移除。八、共识机制先来看一个著名的问题:“拜占庭将军问题”。假设有9个拜占庭的将军,各自领着一支军队围着一座城的不同方位,他们之间彼此物理隔离,只能通过传令兵进行通信。他们需要达成共识到底是攻打还是撤退,要么一同攻打要么一同撤退,如果有一支军队和其他军队行动不一致,都会造成失败。同时这其中还有更复杂的因素,或许有某个将军已经叛变了,但其他人还不知道,这就意味着叛变的将军会破坏这次决议的投票;同时负责消息传递的传令兵,在路上也可能发生不可测的状况,而导致送达的信息失真,也可能压根没送到。我们将将军换成区块链网络中的节点,两个场景中面对的问题是类似的,我们需要一种策略来帮助建立,在通信没那么稳定顺畅的情况下用户之间的信任。这便是所谓的共识机制,达成这个目的有许多备选的算法,比如工作量证明,股份证明等等。8.1 工作量证明工作量证明最早是比特币提出的一种解决“拜占庭将军问题”的方案,基本思想就是利用,前面谈到的区块头部中那个随机数以及哈希值。计算出这个有着特定数量0开头的哈希值比较困难,但网络中的其他节点验证起来比较容易。工作量证明存在的问题:高昂的电费;矿工对于网络计算资源的垄断,间接的造成整个系统的中心化趋势;

April 6, 2019 · 1 min · jiezi

Nodejs 比特币开发教程: 创建比特币钱包

基于Mixin Network的 Nodejs 比特币开发教程: 创建比特币钱包我们已经创建过一个回复消息的机器人和一个能自动支付比特币的机器人.通过本教程的学习,你可以学到如下内容如何创建一个比特币钱包.如何读取比特币钱包的余额.如何支付比特币并即时确认.如何将Mixin Network的比特币提现到你的冷钱包或第三方交易所.前期准备:你要有一个Mixin Network账户。下面的代码创建一个帐号,并写到csv文件里。console.log(“create wallet ….”);const { generateKeyPairSync } = require(‘crypto’);const { publicKey, privateKey } = generateKeyPairSync(‘rsa’,{ modulusLength: 1024, // the length of your key in bits publicKeyEncoding: { type: ‘spki’, // recommended to be ‘spki’ by the Node.js docs format: ‘pem’ }, privateKeyEncoding: { type: ‘pkcs1’, // recommended to be ‘pkcs8’ by the Node.js docs format: ‘pem’, //cipher: ‘aes-256-cbc’, // optional //passphrase: ’top secret’ // optional }});publicKey1 = publicKey.replace("—–BEGIN PUBLIC KEY—–","");publicKey2 = publicKey1.replace("—–END PUBLIC KEY—–","");publicKey3 = publicKey2.replace(/\r?\n|\r/g, “”);console.log(publicKey);console.log(publicKey3);(async () => { const info = await clientBot.createUser({full_name : “nodejs bitcoin wallet”, session_secret: publicKey3, });上面的语句会在本地创建一个RSA密钥对,然后调用Mixin Network来创建帐号,最后保存帐号信息到csv文件. let aesKey = ‘’; const privateKeyBytes = pem.decode(Buffer.from(privateKey)); const aesKeyBuffer = await oaepDecrypt( Buffer.from(info.pin_token, ‘base64’), privateKeyBytes, ‘SHA-256’, Buffer.from(info.session_id) ); aesKey = Buffer.from(aesKeyBuffer).toString(‘base64’); console.log(aesKey); var csvStream = csv.createWriteStream({headers: false, ignoreEmpty: true}), writableStream = fs.createWriteStream(WalletName, {flags: ‘a’}); writableStream.on(“finish”, function(){ console.log(“Bitcoin wallet DONE!”); }); csvStream.pipe(writableStream); csvStream.write({a: privateKey, b: info.pin_token, c: info.session_id, d: info.user_id, e: “123456”} ); csvStream.end(); fs.appendFile(WalletName, require(“os”).EOL, function(){}); const newUserConfig = {clientId: info.user_id, aesKey: aesKey, privateKey: privateKey, sessionId: info.session_id, clientSecret: “do not need”, assetPin: “123456”}; console.log(newUserConfig); const newUserClient = new HttpClient(newUserConfig); var info2 = await newUserClient.updatePin({oldPin : “”, newPin: “123456”, }); console.log(info2); const verifyPin = await newUserClient.verifyPin(“123456”); console.log({ verifyPin });现在你需要小心保管好你的帐号信息,在读取该账户的比特币资产余额或者进行其他操作时,将需要用到这些信息.给新建的帐号创建一个比特币钱包新账号并不默认内置比特币钱包, 现在读一下比特币余额就可以创建一个比特币钱包。 const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID); console.log(“Bitcoin address is “, assetInfo.public_key); console.log(“Bitcoin balance is “, assetInfo.balance); console.log(“Bitcoin price is (USD) “, assetInfo.price_usd);创建的帐号的比特币资产详细信息如下,其中public key就是比特币的存币地址: Make your choose(select the uuid for open the specified wallet): 0b10471b-1aed-3944-9eda-5ab947562761 You select the : 0b10471b-1aed-3944-9eda-5ab947562761 You select the wallet 0b10471b-1aed-3944-9eda-5ab947562761 ? Make your choose 1: Read Bitcoin Balance & Address You choice to : { type: ‘1: Read Bitcoin Balance & Address’ } You wallet is : 0b10471b-1aed-3944-9eda-5ab947562761 Bitcoin address is 15MySY7UnA827TRMQWuCKGiogCYXUmt21M Bitcoin balance is 0 Bitcoin price is (USD) 5029.59915767 You select the : 0b10471b-1aed-3944-9eda-5ab947562761 You select the wallet 0b10471b-1aed-3944-9eda-5ab947562761这个API能够提供若干与比特币有关的信息:存币地址:[public_key]Logo: [icon_url]资产名字:[name]资产在Mixin Network的uuid: [asset_key]对美元的价格(Coinmarketcap.com提供): [price_usd]存币时确认的区块数量:[confirmations]比特币私钥呢?比特币的私钥呢?这个私钥被Mixin Network通过多重签名保护,所以对用户来说是不可见的,比特币资产的提现和转账都需要用户提供正确的的RSA签名,PIN代码与会话密钥才能完成.不只是比特币,还有以太坊,EOS等这个帐号不只支持比特币,还支持以太坊,EOS等, 完整的区块链支持列表. 这个账户同时也支持所有的 ERC20 代币与 EOS 代币.创建其它的币的钱包与创建比特币钱包过程一样,读对应的资产余额就可以.Mixin Network 当前支持的加密货币 (2019-02-19)cryptouuid in Mixin NetworkEOS6cfe566e-4aad-470b-8c9a-2fd35b49c68dCNB965e5c6e-434c-3fa9-b780-c50f43cd955cBTCc6d0c728-2624-429b-8e0d-d9d19b6592faETC2204c1ee-0ea2-4add-bb9a-b3719cfff93aXRP23dfb5a5-5d7b-48b6-905f-3970e3176e27XEM27921032-f73e-434e-955f-43d55672ee31ETH43d61dcd-e413-450d-80b8-101d5e903357DASH6472e7e3-75fd-48b6-b1dc-28d294ee1476DOGE6770a1e5-6086-44d5-b60f-545f9d9e8ffdLTC76c802a2-7c88-447f-a93e-c29c9e5dd9c8SC990c4c29-57e9-48f6-9819-7d986ea44985ZENa2c5d22b-62a2-4c13-b3f0-013290dbac60ZECc996abc9-d94e-4494-b1cf-2a3fd3ac5714BCHfd11b6e3-0b87-41f1-a41f-f0e9b49e5bf0EOS的存币地址与其它的币有些不同,它由两部分组成: account_name and account tag, 如果你向Mixin Network存入EOS,你需要填两项数据: account name 是eoswithmixin,备注里输入你的account_tag,比如0aa2b00fad2c69059ca1b50de2b45569.EOS的资产余额返回结果如下: Make your choose 3: Read EOS Balance & Address You choice to : { type: ‘3: Read EOS Balance & Address’ } You wallet is : 0b10471b-1aed-3944-9eda-5ab947562761 EOS account name is eoswithmixin tag is 30f0c36057b9b22151173b309bd0d79c EOS balance is 0 EOS price is (USD) 5.26225922 You select the : 0b10471b-1aed-3944-9eda-5ab947562761 You select the wallet 0b10471b-1aed-3944-9eda-5ab947562761存入比特币与读取比特币余额现在,你可以向比特币的钱包存币了。当然,在比特币网络里转币,手续费是相当贵的,费用的中位数在0.001BTC,按当前4000美元的价格,在4美元左右,有一个方便的办法,如果你有Mixin Messenger帐号,里面并且有比特币的话,可以直接提现比特币到新创建的帐号的比特币充值地址,它们在同一个Mixin Network网络内,手续费为0,而且1秒到账。下面的代码,可以读取比特币钱包余额. const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID); console.log(“Bitcoin address is “, assetInfo.public_key); console.log(“Bitcoin balance is “, assetInfo.balance); console.log(“Bitcoin price is (USD) “, assetInfo.price_usd);Mixin Network网内免手续费的,并且即时确认任何币在Mixin Network内部的交易,都是无手续费的,并且立刻到账。前期准备: 账户设置了PIN对于新创建的帐号,我们通过updatePin来设置新PIN码, 代码如下: var info2 = await newUserClient.updatePin({oldPin : “”, newPin: “123456”, }); console.log(info2); const verifyPin = await newUserClient.verifyPin(“123456”); console.log({ verifyPin });Mixin Network帐号之间的比特币支付通过Mixin Messenger,我们可以先转比特币给机器人,然后让机器人转币给新用户。 const assetInfo = await newUserClient.getUserAsset(EOS_ASSET_ID); console.log(“The Wallet ’s EOS balance is “, assetInfo.balance); if ( assetInfo.balance > 0 ) { const Obj = { assetId: BTC_ASSET_ID, recipientId: MASTER_UUID, traceId: newUserClient.getUUID(), amount: assetInfo.balance, memo: ‘’, }; console.log(Obj); newUserClient.transferFromBot(Obj); }读取Bitcoin的余额,来确认比特币是不是转成功了! 注意newUserClient是新用户的。 const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID); console.log(“Bitcoin address is “, assetInfo.public_key); console.log(“Bitcoin balance is “, assetInfo.balance);如何将比特币存入你的冷钱包或者第三方交易所如果你希望将币存入你的冷钱包或者第三方交易所, 先要得到冷钱包或者你在第三方交易所的钱包地址,然后将钱包地址提交到Mixin Network.要点提示: 提现是需要支付收续费的,准备好比特币包地址!增加目的钱包地址到Mixin Network调用createAddress API, 将会返回一个address_id,下一步的提现操作会用到这个id。 const withdrawAddress = await newUserClient.createWithdrawAddress({ assetId: BTC_ASSET_ID, label: ‘BTC withdraw’, publicKey: BTC_WALLET_ADDR, });这里的 14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C 就是一个比特币钱包地址, 如下所示,提现费用是0.0025738 BTC, address_id 是"345855b5-56a5-4f3b-ba9e-d99601ef86c1”.Make your choose 9: BTC withdrawYou choice to : { type: ‘9: BTC withdraw’ }You wallet is : 0b10471b-1aed-3944-9eda-5ab947562761{ type: ‘address’, address_id: ‘a513da38-a18a-4536-abe4-d1c29ca3a1a8’, asset_id: ‘c6d0c728-2624-429b-8e0d-d9d19b6592fa’, public_key: ‘14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C’, label: ‘BTC withdraw’, account_name: ‘’, account_tag: ‘’, fee: ‘0.00212232’, reserve: ‘0’, dust: ‘0.0001’, updated_at: ‘2019-04-04T02:20:42.552274992Z’ }? Input you BTC amount:创建提现地址成功后,你可以用readAddress读取最新的提现费。 const addressList = await newUserClient.getWithdrawAddress(BTC_ASSET_ID); console.log(addressList);提交提现请求,Mixin Network会即时处理提现请求.提交提现请求到 Mixin Network, withdrawAddress.address_id 就是createAddress创建的。 console.log(withdrawAddress); const prompts = [ { name: ‘amount’, type: ‘input’, message: “Input you BTC amount: “, }, ]; const answers = await inquirer.prompt(prompts); console.log(answers); const withdrawResult = await newUserClient.withdraw({ addressId: withdrawAddress.address_id, assetId: BTC_ASSET_ID, amount: answers.amount, memo: ‘withdraw by nodejs’, }); console.log(withdrawResult);可以通过blockchain explore来查看进度.完整的代码在这儿 ...

April 5, 2019 · 3 min · jiezi

如何开发一款以太坊安卓钱包系列3 - 资产信息展示

这是如何开发以太坊(安卓)钱包系列第3篇, 钱包账号资产信息展示,展示信息主要包括账号地址、eth余额及该账号所拥有的Token及余额。预备知识 MVVM本文会涉及和UI界面的交互,提前理解下界面和数据如何交互是非常有必要的,如果你已经很熟悉MVVM,可跳过这一小节。最早写Android的时候,数据和界面经常耦合在一起,一个Activity文件总是特别大,每当产品界面改版就非常痛苦,吐槽下,很多产品经理都喜欢对界面改来改去。后来Google 推荐多个架构模式: MPV、 MVVM模式来解决数据和UI耦合的问题,登链钱包代码,使用的就是MVVM模式,所以对它做一个简单介绍,下面是MVVM的视图和数据的交互图:View 通常对应于Activity/Fragment/自定义ViewModel:则是和数据相关的模块。View 与 Model 不直接发生联系, 而是通过ViewModel负责接收View层的事件以及获取并处理数据,ViewModel层的数据变化也会通知给View层进行相应的UI的更新,从而实现业务逻辑和Ui的隔离。使用MVVM模式最大的优点就是解耦, 因为数据处理逻辑是独立于View, 在UI更改时,ViewModel 不用做太多改动。我们使用了Google在I/O大会推出的一套遵循MVVM开发模式的LiveData和ViewModel组件架构。ViewModel 和 LiveDataViewModel 会关注UI生命周期来存储和管理数据,在Activity发生变化(锁屏开屏、旋转)时,ViewModel 会自动保留之前的数据并给新的Activity或Fragment使用,当界面被系统销毁时,ViewModel也会进行资源清理,避免内存泄漏。ViewModel 还可以用于不同界面间数据共享。LiveData是一个可观察的数据持有者类。观察者可以方便我们以异步的方式获取数据,同时LiveData也是有生命周期感知的。如果其生命周期处于STARTED或RESUMED状态。LiveData会将观察者视为活动状态,并通知其数据的变化。LiveData未注册的观察对象以及非活动观察者是不会收到有关更新的通知。了解更多,可自行以关键字: Lifecycle、ViewModel、LiveData 进行搜索。账号信息展示展示信息主要包括账号地址、eth余额及该账号所拥有的Token及余额, 其界面效果如下:这个界面应的是登链钱包的PropertyFragment,上图的UPT 是我自己发行的Token,所以没有显示价格现在我们来思考一下, 怎么来展现上面的数据, 别着急往下看, 可以先想想。先对问题做一个拆分,把数据拆分为4个部分:显示当前选中的账号显示当前账号 ETH 余额显示当前账号下 Token 数量显示对应的法币金额。为了避免 UI 与上面4个数据的耦合,代码使用了一个TokensViewModel, 获取到的数据用 LiveData做了一个Wrap,以便UI可以订阅数据,TokensViewModel类像下面,代码有删减:public class TokensViewModel extends ViewModel { private final MutableLiveData<ETHWallet> defaultWallet; private final MutableLiveData<NetworkInfo> defaultNetwork; private final MutableLiveData<Token[]> tokens; private final MutableLiveData<Ticker> prices;}MutableLiveData 是前面提到的 LiveData的子类,在UI界面中就可以对数据进行订阅,下面我们逐一拆解下每个数据。显示当前账号可以分为两个步骤:从数据库中读取账号;界面显示账号TokensViewModel中定义了一个MutableLiveData<ETHWallet> defaultWallet ,从数据库中读取账号会保存在defaultWallet中,然后UI对 defaultWallet 进行观察显示。注解: 登链钱包 里大量使用的这个方式,通过一个LiveData 做数据桥接。在上一篇导入账号及账号管理,所有的账号使用greenDao 存储起来, 因此我们只需要把所有账号从加载出来,挑选出当前选中的那一个。 结合代码看一看:// WalletDaoUtils.java public static ETHWallet getCurrent() { List<ETHWallet> ethWallets = ethWalletDao.loadAll(); for (ETHWallet ethwallet : ethWallets) { if (ethwallet.isCurrent()) { ethwallet.setCurrent(true); return ethwallet; } } return null; }上面代码先用 ETHWalletDao.loadAll 加载出所有的账号,返回当前选中的,上面的代码会被FetchWalletInteract 类的 findDefault方法调用,在ViewModle里,很多时候以数据进行交互的类,我们会命名为 xxxInteract,这也是一个习惯用法。其代码如下: // FetchWalletInteract.java // 返回一个可订阅的Single<ETHWallet> 对象 public Single<ETHWallet> findDefault() { return Single.fromCallable(() -> { return WalletDaoUtils.getCurrent(); }).subscribe(this::onDefaultWallet); } // 获取到默认钱包账号 设置到 defaultWallet 这个LiveData private void onDefaultWallet(ETHWallet wallet) { defaultWallet.setValue(wallet); }findDefault()返回一个可订阅的Single<ETHWallet> 对象,如果不熟悉可参考后面的文档。之后,在UI界面 PropertyFragment.java 中, 就可以对 defaultWallet 进行订阅:tokensViewModel.defaultWallet().observe(this, this::showWallet);当获取到默认账号时,就会回调showWallet:// UI 显示 public void showWallet(ETHWallet wallet) { tvWalletName.setText(wallet.getName()); tvWalletAddress.setText(wallet.getAddress()); }这样, 界面的显示就完成了,下一篇继续介绍获取余额。参考文档lifecycle官方文档地址RxAndroid 了解更多响应式编程我创建了一个专门讨论钱包开发的微信群,加微信:xlbxiong 备注:钱包。加入知识星球,和一群优秀的区块链从业者一起学习。深入浅出区块链 - 系统学习区块链,学区块链的都在这里,打造最好的区块链技术博客。本文原文链接 ...

April 4, 2019 · 1 min · jiezi

用VSCode和IBM Hyperledger Fabric 区块链扩展开发智能合约

了解使用IBM Blockchain Platform的VSCode扩展来简化开发,测试和部署智能合约的过程。完成本教程后,你将了解如何使用VSCode在本地Hyperledger Fabric网络上快速开发,演示和部署区块链应用程序。本教程假设你对Hyperledger Fabric有一些基本的了解。学习目标安装IBM Blockchain Platform VSCode扩展。创建一个新的JavaScript智能合约。打包智能合约。创建,探索和了解Hyperledger Fabric网络。在本地Hyperledger Fabric实例上部署智能合约。使用Node.js SDK与已部署的智能合约包进行交互。先决条件你需要安装以下内容才能使用扩展程序:node v8.x或更高版本以及npm v5.x或更高版本。Yeoman(yo) v2.x。Docker版本v17.06.2-ce或更高版本。Docker Compose v1.14.0或更高版本。VSCode 1.28.2或更高版本。如果你使用的是Windows,则还必须确保以下内容:你的Windows版本支持Hyper-V和Docker:Windows 10 Enterprise,Pro或具有1607 Anniversary更新或更高版本的教育版。Docker for Windows配置为使用Linux容器(这是默认设置)。你已经从windows-build-tools安装了适用于Windows的C ++ Build Tools。你已从Win32 OpenSSL安装了OpenSSL v1.0.2安装正常版本,而不是标记为light的版本。在32位系统上将Win32版本安装到C:OpenSSL-Win32中。在64位系统上将Win64版本安装到C:OpenSSL-Win64中。你可以通过从终端运行以下命令来检查已安装的版本:node –versionnpm –versionyo –versiondocker –versiondocker-compose –version预计的时间安装必备组件后,大约需要30-45分钟才能完成。步骤:1.开始2.创建一个新的智能合约项目3.修改智能合约4.打包智能合约5.安装智能合约6.实例化智能合约7.导出连接详细信息8.提交交易9.更新智能合约10.提交更多交易11.查询分类帐12.测试合约1.开始你需要做的第一件事是安装IBM Blockchain Platform VSCode扩展。为此,你需要安装最新版本的VSCode;要查看你是否拥有最新的VSCode扩展,请转到代码>检查更新(Code > Check for Updates)。如果此时VSCode崩溃(我遇到了),则可能意味着你没有最新版本。如果你的VSCode崩溃,请查看下面的故障排除部分。否则,请更新你的VSCode,完成后,单击屏幕左侧边栏中的扩展名。在顶部,在扩展市场中搜索IBM Blockchain Platform。单击Install,然后单击reload。现在你应该全部使用扩展!2.创建一个新的智能合约项目要创建智能合约项目:1.单击新下载的IBM Blockchain Platform扩展。它应该是左侧边栏底部的一直延伸。2.接下来,使用键盘快捷键Shift+CMD+P调出命令pallete。从下拉列表中选择IBM Blockchain Platform:Create Smart Contract Project。3.点击下拉列表中的JavaScript。4.单击新建文件夹New Folder,然后将项目命名为所需名称。我将我的名字命名为demoContract。5.单击创建Creat,然后Open刚刚创建的新文件夹。接下来,从下拉列表中单击添加到工作区Add to WrokSpace。6.完成扩展打包合约后,你可以打开lib/my-contract.js文件以查看智能合约代码框架。不错的工作!3.修改智能合约在lib/my-contract.js文件中,继续复制并粘贴以下代码:‘use strict’;const { Contract } = require(‘fabric-contract-api’);class MyContract extends Contract { //update ledger with a greeting to show that the function was called async instantiate(ctx) { let greeting = { text: ‘Instantiate was called!’ }; await ctx.stub.putState(‘GREETING’, Buffer.from(JSON.stringify(greeting))); } //take argument and create a greeting object to be updated to the ledger async transaction1(ctx, arg1) { console.info(’transaction1’, arg1); let greeting = { text: arg1 }; await ctx.stub.putState(‘GREETING’, Buffer.from(JSON.stringify(greeting))); return JSON.stringify(greeting); }}module.exports = MyContract;注意:.gifs可能与上面的智能合约不完全匹配,但这是你现在应该在lib/my-contract.js文件中应该拥有的那个!让我们来看看你刚刚定义的函数。实例化函数创建一个greeting对象,然后使用密钥GREETING将其存储在分类帐中。transaction1函数采用Hyperledger Fabric上下文和一个参数arg1,该参数用于存储用户定义的问候语。ctx.stub.putState方法用于记录分类帐上的greeting,然后返回该对象。保存文件然后继续!4.打包智能合约现在你已经创建了智能合约并了解了你已定义的功能,现在可以将其打包,以便你可以将其安装在节点设备上。使用Shift+CMD+P打开命令pallete并选择包智能合约。在左侧边栏中,单击IBM Blockchain Platform图标(它看起来像一个正方形)。在左上角,你将看到所有智能合约包。如果一切顺利,你应该看到demoContract@0.0.1。5.安装智能合约好的,你已经完成超过一半了。现在是有趣的部分!让我们在节点上安装这份合约!为此,你必须首先连接到Hyperledger Fabric网络。VSCode扩展附带的网络非常适合开发,它为开发和测试合约提供了最少的资源占用。以下Docker容器在本地计算机上启动,每个容器在网络中具有不同的角色:Orderer,Certificate Authority,CouchDB和Peer。要启动网络,请单击编辑器左侧的IBM Blockchain Platform扩展。这是一个看起来像正方形的图标。1.单击扩展后,你应该在编辑器的左侧看到LOCAL FABRIC OPS。在LOCAL FABRIC OPS右侧,你应该看到一个三点符号。单击该按钮,然后单击启动Fabric运行时Start Fabric Runtime。你的扩展程序现在将提供将充当网络中节点的Docker容器。配置完成后,你应该会看到LOCAL FABRIC OPS下的智能合约Smart Contracts部分。2.在智能合约Smart Contracts下,单击+install。3.接下来,扩展程序将询问你在哪个节点上安装智能合约。选择peer0.org1.examplee.com。4.扩展程序将询问你要安装哪个软件包:选择demoContract@0.0.1。如果一切顺利,你应该会在右下角看到通知:已成功安装在节点peer0.org1.example.com上就是这样!不错的工作!6.实例化智能合约这是真正的考验,你的智能合约是否会正确实例化?我们来看看……1.在智能合约Smart Contracts下,你将看到一个显示实例化的部分。单击实例化+ Instantiate。2.然后,扩展将询问你在哪个频道实例化智能合约,选择mychannel。3.然后,扩展将询问你实例化哪个合约和版本,选择demoContract@0.0.1。4.然后,扩展将询问你要调用哪个函数,输入instantiate。5.接下来,它会询问你的参数。没有,所以只需按回车即可。扩展将执行一些工作,然后在右下角,你应该看到合约已成功实例化。万岁!7.导出连接详细信息此时,你需要开始与Fabric实例进行更密切的交互。你需要向证书颁发机构证明你可以在网络上创建数字身份。这是通过向证书颁发机构显示你的证书和私钥来完成的。1.在本教程的后面,我们将查询网络。为此,我们需要一些脚本。在你的智能合约目录之外克隆此Github Repo,以获取查询网络所需的必要脚本。$ git clone https://github.com/horeaporutiu/VSCodeTutorialBlockchain.git2.右键单击VSCode中智能合约目录下的空白区域,然后选择将文件夹添加到工作区Add folder to workspace,将此文件夹导入VSCode工作区。找到最近克隆的文件夹VSCodeTutorialBlockchain并双击它。3.在VSCode中,单击左侧栏中的IBM Blockchain Platform扩展。4.在LOCAL FABRIC OPS下点击Nodes。右键单击peer0.org1.example.com节点。选择导出连接细节Export Connection Details。5.扩展程序将询问将连接配置文件保存到哪个文件夹。选择VSCodeTutorialBlockchain目录。如果一切顺利,你应该看到类似的东西:Successfully exported connection details to /Users/Horea.Porutiu@ibm.com/Workdir/VSCodeTutorialBlockchain/local_fabric8.提交交易好的,所以你已经实例化你的合约,把我们的密钥输出到我们的钱包里,那么现在呢? 那么,现在是时候实际调用智能合约中的功能了!为此,你可以使用VSCode扩展。1.在LOCAL FABRIC OPS下你应该看到FABRIC GATEWAYS。2.单击local_fabric,然后单击Admin@org1.example.com。3.如果一切顺利,你应该会看到一条通知,其中显示正在连接到fabricConnecting to local_fabric。4.接下来,在FABRIC GATEWAYS和Channels下你应该看到我的mychannel。单击以展开它。然后展开demoContract@0.0.1。你应该看到两个函数,instantiate和transaction1。5.右键单击transaction1,然后选择提交交易submit transaction。对于参数,请输入’hello’。不错的工作!你刚刚成功向Fabric网络提交了一笔交易,并更新了分类帐!9.更新智能合约在上一步中,你使用putState API更新了分类帐,并传入了密钥和值。key恰好是greeting,值也赋予了对象。{ text: ‘hello’}你应该学习的最后一件事是如何查询,如何从分类帐中检索数据。你将通过使用getState API执行此操作,该API接收密钥并返回与该密钥关联的值(如果找到它)。让我们为demoContract添加一个查询功能。1.将以下代码复制并粘贴到lib/my-contract.js文件中:‘use strict’;const { Contract } = require(‘fabric-contract-api’);class MyContract extends Contract { //update ledger with a greeting async instantiate(ctx) { let greeting = { text: ‘Instantiate was called!’ }; await ctx.stub.putState(‘GREETING’, Buffer.from(JSON.stringify(greeting))); } //add a member along with their email, name, address, and number该代码添加了一个addMember函数,该函数接收来自用户的参数,如电子邮件,姓名,地址和电话号码,并将该数据作为键值对保存在分类帐中。此代码还添加了查询功能; 这个函数接受一个参数,这是查找的关键。该函数返回与给定键关联的值(如果有)。2.更新package.json文件,使包含版本号的第3行现在读取: “version”: “0.0.2”,保存文件。3.要在LOCAL FABRIC OPS下将你现有的智能合约升级到新版本。展开实例化,直到你看到demoContract@0.0.1。接下来,右键单击demoContract并选择Upgrade Smart Contract。4.扩展程序将询问使用哪个版本执行升级。选择demoContract。5.扩展程序将询问哪个节点安装智能合约,请选择peer0.org1.example.com。6.扩展程序将询问要调用的函数。输入实例化instantiate。7.扩展名将询问要传递的参数。将其留空,然后按Enter键。经过一些繁重的计算(以及一点点时间),如果一切顺利,你应该在右下角收到一条通知说成功升级智能合约Successfully upgraded smart contract。10.提交更多交易现在你已经更新了智能合约,请在FABRIC GATEWAYS下查看并展开频道Channels。接下来,展开mychannel,你应该看到demoContract@0.0.2。1.接下来,展开demoContract@0.0.2以查看已更新智能合约my-contract.js的函数,即instantiate,addMember和query。2.右键单击addMember,然后单击Submit Transaction。对于参数,请复制并粘贴以下内容:ginny@ibm.com, Ginny Rometty, Wall Street NY, 1234567890在输出中,你应该看到以下内容:Submitting transaction addMember with args Ginny Rometty, Wall Street NY, 1234567890, ginny@ibm.com让我们再添加一个成员,重复此步骤,但是对于参数,请复制并粘贴以下内容:arvind@ibm.com, Arvind Krishna, Broadway Street NY, 1231231111不错的工作。 我们差不多完成了!11.查询分类帐而现在,你们一直都在等待…让我们真正看到写在分类账上的内容!为此,我们将使用VSCodeTutorialBlockchain文件夹中的query.js文件。1.查看VSCodeTutorialBlockchain目录中的query.js文件。它与invoke.js文件非常相似,只是它有一个主要区别:let response = await contract.evaluateTransaction(‘query’, ‘GREETING’);主要区别在于,在此文件中,你将使用evaluateTransaction API,它不会将交易发送到ordering服务。因此,它不会更新分类帐。这是非常重要的。在invoke.js文件中,你将交易提交到ordering服务,这些交易都将写入分类帐,但在query.js文件中,你不会更新分类帐。2.使用VSCode中的终端导航到VSCodeTutorialBlockchain文件夹。从那里,使用以下命令安装所需的依赖项:VSCodeTutorialBlockchain $ npm install3.接下来,使用以下命令运行query.js:VSCodeTutorialBlockchain$ node query.js你应该看到下面的输出:Connected to Fabric gateway.{ text: ‘Instantiate was called!’ }Disconnect from Fabric gateway.done4.接下来,查询Ginny Rometty。更改以下行:let response = await contract.evaluateTransaction(‘query’, ‘GREETING’);对此:let response = await contract.evaluateTransaction(‘query’, ‘ginny@ibm.com’);你应该看到下面的输出:VSCodeTutorialBlockchain$ node query.jsConnected to Fabric gateway.{“address”:" Wall Street NY",“email”:“ginny@ibm.com”,“name”:" Ginny Rometty",“number”:" 1234567890"}Disconnect from Fabric gateway.done5.最后,查询Arvind。修改请求如下:let response = await contract.evaluateTransaction(‘query’, ‘arvind@ibm.com’);除了Arvind的数据外,输出应该类似于上面的输出。12.测试合约测试功能是IBM Blockchain扩展的一项功能,可以通过UI完成。单击左侧的IBM Blockchain Platform扩展图标。在FABRIC GATEWAYS下,在频道Channels下展开mychannel,右键单击最新的智能合约demoContract@0.0.2,然后选择Generate Smart Contract Tests。扩展程序将询问你生成测试文件的语言。选择JavaScript。生成测试完成扩展后,你可以从demoContract目录运行npm test,也可以从MyContract-demoContract@0.0.2.test.js文件中单击VSCode UI中的运行测试按钮,如gif所示。总结干得好!你学习了如何使用Hyperledger的最新API创建,打包,安装,实例化和调用智能合约。此时,你可以专注于开发智能合约并更新my-contract.js文件,因为你知道已经处理了区块链的网络方面。你还可以使用VSCode,Node.js和Docker成功调用和更新分类帐。如果有错误,请拜托我,请对这篇文章发表评论,我会修复它们。非常感谢你阅读本教程。我希望你喜欢它!Horea Blockchain出来了!======================================================================分享一些比特币、以太坊、EOS、Fabric等区块链相关的交互式在线编程实战教程:java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。c#比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在C#代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是C#工程师不可多得的比特币开发学习课程。java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。ERC721以太坊通证实战,课程以一个数字艺术品创作与分享DApp的实战开发为主线,深入讲解以太坊非同质化通证的概念、标准与开发方案。内容包含ERC-721标准的自主实现,讲解OpenZeppelin合约代码库二次开发,实战项目采用Truffle,IPFS,实现了通证以及去中心化的通证交易所。C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。EOS入门教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。深入浅出玩转EOS钱包开发,本课程以手机EOS钱包的完整开发过程为主线,深入学习EOS区块链应用开发,课程内容即涵盖账户、计算资源、智能合约、动作与交易等EOS区块链的核心概念,同时也讲解如何使用eosjs和eosjs-ecc开发包访问EOS区块链,以及如何在React前端应用中集成对EOS区块链的支持。课程内容深入浅出,非常适合前端工程师深入学习EOS区块链应用开发。Hyperledger Fabric 区块链开发详解,本课程面向初学者,内容即包含Hyperledger Fabric的身份证书与MSP服务、权限策略、信道配置与启动、链码通信接口等核心概念,也包含Fabric网络设计、nodejs链码与应用开发的操作实践,是Nodejs工程师学习Fabric区块链开发的最佳选择。Hyperledger Fabric java 区块链开发详解,课程面向初学者,内容即包含Hyperledger Fabric的身份证书与MSP服务、权限策略、信道配置与启动、链码通信接口等核心概念,也包含Fabric网络设计、java链码与应用开发的操作实践,是java工程师学习Fabric区块链开发的最佳选择。tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。汇智网原创翻译,转载请标明出处。这里是Hyperledger Fabric和VSCode的IBM区块链扩展开发智能合约 ...

April 4, 2019 · 2 min · jiezi

Python写的比特币和多种加密通货钱包

啥东西一个用python和urwid写的多功能数字货币钱包为什么你需要这个东西透明这是一个开源项目,所有人都可以看代码。安全你持有账户私钥,没人能偷走你的资产。可靠基于一个透明且开源运作的分布式区块链项目 :Mixin Network。主网已经于2019年2月末上线。有用不仅仅能保存比特币,还能保存其他币(Ethereum, EOS, XRP…)。快确认一笔交易只需要1秒钟。保护你的隐私匿名创建账户,匿名交易和付款。强大内置1秒闪兑交易所,可以交易比特币和主流加密资产。交易结束资产回到自己的钱包,不用放在中心化交易所,不担心交易所被攻击。 这是一个开放世界的入口通过开放式交易所可以在买卖任何ERC20 token。你自己创建都可以。有真随机数生成器保证的骰子游戏。安装Python 3:这个钱包基于Python3。macOSbrew upgradebrew install python@3Ubuntu使用第三方源安装python3sudo apt updatesudo apt install software-properties-commonsudo add-apt-repository ppa:deadsnakes/ppa遇到如下提示,敲击EnterPress [ENTER] to continue or Ctrl-c to cancel adding it.更新apt,安装 python3.7, python3.7-venvsudo apt updatesudo apt install python3.7 python3.7-venvsudo ln -s /usr/bin/python3.7 /usr/bin/python3确认python3 和Python3-env$ python3 -VPython 3.7.2下载代码库并且创建env环境git clone https://github.com/awesome-mixin-network/bitcoin-cli-wallet-python.gitcd bitcoin-cli-wallet-pythonpython3 -m venv ./激活环境source ./bin/activate安装依赖包先升级pip,然后安装依赖软件库pip install –upgrade pippip install -r requirements.txt运行代码python Bitcoin_Wallet_Mixin_consoleGUI.py

April 2, 2019 · 1 min · jiezi

通过 C# 买卖Bitcoin

方案一: 通过ExinCore API进行币币交易Exincore 提供了基于Mixin Network的币币交易API.你可以支付USDT给ExinCore, ExinCore会以最低的价格,最优惠的交易费将你购买的比特币转给你, 每一币交易都是匿名的,并且可以在区块链上进行验证,交易的细节只有你与ExinCore知道!ExinCore 也不知道你是谁,它只知道你的UUID.预备知识:你先需要创建一个机器人, 方法在 教程一.安装依赖包正如教程一里我们介绍过的, 我们需要依赖 mixin-csharp-sdk, 你应该先安装过它了, 这儿我们再安装 MsgPack.Cli 软件包. dotnet add package MixinCSharpSdk dotnet add package MsgPack.Cli –version 1.0.1充币到 Mixin Network, 并读出它的余额.通过ExinCore API, 可以进行BTC, USDT, EOS, ETH 等等交易, 此处演示用 USDT购买BTC 或者 用BTC购买USDT。交易前,先检查一下钱包地址。完整的步骤如下:检查比特币或USDT的余额,钱包地址。并记下钱包地址。从第三方交易所或者你的冷钱包中,将币充到上述钱包地址。再检查一下币的余额,看到帐与否。(比特币的到帐时间是5个区块的高度,约100分钟)。比特币与USDT的充值地址是一样的。 MixinApi mixinApiNewUser = new MixinApi(); mixinApiNewUser.Init(UserIDNewUser, “”, SessionIDNewUser, PinTokenNewUser, PrivateKeyNewUser); Asset AssetBTC = mixinApiNewUser.ReadAsset(USRCONFIG.ASSET_ID_BTC); Console.WriteLine(“New User " + UserIDNewUser + " ’s BTC balance is " + AssetBTC.balance); Console.WriteLine(“New User " + UserIDNewUser + " ’s BTC address is " + AssetBTC.public_key);查询ExinCore市场的价格信息如何来查询ExinCore市场的价格信息呢?你要先了解你交易的基础币是什么,如果你想买比特币,卖出USDT,那么基础货币就是USDT;如果你想买USDT,卖出比特币,那么基础货币就是比特币.string jsonData = FetchMarketPrice(“815b0b1a-2764-3736-8faa-42d694fa620a”);var marketObj = JsonConvert.DeserializeObject<MarketInfo>(jsonData);foreach (AssetInfo value in marketObj.data){ Console.WriteLine(value);}public class MarketInfo{ public string code { get; set; } public string message { get; set; } public List<AssetInfo> data { get; set; } public override string ToString() { return JsonConvert.SerializeObject(this); }}public class AssetInfo{ public string base_asset { get; set; } public string base_asset_symbol { get; set; } public string exchange_asset_symbol { get; set; } public string price { get; set; } public string minimum_amount { get; set; } public string maximum_amount { get; set; } public List<string> exchanges { get; set; } public override string ToString() { return JsonConvert.SerializeObject(this); }}public static string FetchMarketPrice(string asset_id){ return FetchMarketPriceAsync(asset_id).Result;}public static async Task<string> FetchMarketPriceAsync(string asset_id){ HttpClient client = new HttpClient(); // Call asynchronous network methods in a try/catch block to handle exceptions try { HttpResponseMessage response = await client.GetAsync(“https://exinone.com/exincore/markets?base_asset=" + asset_id); response.EnsureSuccessStatusCode(); string responseBody = await response.Content.ReadAsStringAsync(); // Above three lines can be replaced with new helper method below // string responseBody = await client.GetStringAsync(uri); Console.WriteLine(responseBody); return responseBody; } catch(HttpRequestException e) { Console.WriteLine("\nException Caught!”); Console.WriteLine(“Message :{0} “,e.Message); } return null;}交易前,创建一个Memo!在第二章里,基于Mixin Network的 C# 比特币开发教程: 机器人接受比特币并立即退还用户, 我们学习过退还用户比特币,在这里,我们除了给ExinCore支付币外,还要告诉他我们想购买的币是什么,即将想购买的币存到memo里。private static string TargetAssetID(string asset_id) { Guid guid = new Guid(asset_id); var gbytes = guid.ToByteArray(); Array.Reverse(gbytes,0,4); Array.Reverse(gbytes,4,2); Array.Reverse(gbytes,6,2); var serializer = MessagePackSerializer.Get(gbytes.GetType()); var stream = new MemoryStream(); serializer.Pack(stream, gbytes); return Convert.ToBase64String(stream.ToArray());}币币交易的完整流程转币给ExinCore时,将memo写入你希望购买的币,否则,ExinCore会直接退币给你!如果你想卖出比特币买入USDT,调用方式如下://config.cspublic static string EXIN_BOT = “61103d28-3ac2-44a2-ae34-bd956070dab1”;// public static string EXIN_BOT = “0b1a2027-4fd6-3aa0-b3a3-814778bb7a2e”;public static string MASTER_UUID = “0b4f49dc-8fb4-4539-9a89-fb3afc613747”;public static string ASSET_ID_BTC = “c6d0c728-2624-429b-8e0d-d9d19b6592fa”;public static string ASSET_ID_EOS = “6cfe566e-4aad-470b-8c9a-2fd35b49c68d”;public static string ASSET_ID_USDT= “815b0b1a-2764-3736-8faa-42d694fa620a”;//Program.csif (cmd == “5” ) { var memo = TargetAssetID(USRCONFIG.ASSET_ID_USDT); Console.WriteLine(memo); using (TextReader fileReader = File.OpenText(@“mybitcoin_wallet.csv”)) { var csv = new CsvReader(fileReader); csv.Configuration.HasHeaderRecord = false; while (csv.Read()) { string PrivateKeyNewUser; csv.TryGetField<string>(0, out PrivateKeyNewUser); string PinTokenNewUser; csv.TryGetField<string>(1, out PinTokenNewUser); string SessionIDNewUser; csv.TryGetField<string>(2, out SessionIDNewUser); string UserIDNewUser; csv.TryGetField<string>(3, out UserIDNewUser); string PinNewUser; csv.TryGetField<string>(4, out PinNewUser); MixinApi mixinApiNewUser = new MixinApi(); mixinApiNewUser.Init(UserIDNewUser, “”, SessionIDNewUser, PinTokenNewUser, PrivateKeyNewUser); // Console.WriteLine(mixinApiNewUser.CreatePIN(””, “123456”).ToString()); Transfer reqInfo = mixinApiNewUser.Transfer(USRCONFIG.ASSET_ID_BTC, USRCONFIG.EXIN_BOT, “0.0001”, PinNewUser.ToString(), System.Guid.NewGuid().ToString(), memo); Console.WriteLine(reqInfo); } }}如果你想卖出USDT买入比特币,调用方式如下:if (cmd == “6” ) { var memo = TargetAssetID(USRCONFIG.ASSET_ID_BTC); Console.WriteLine(memo); using (TextReader fileReader = File.OpenText(@“mybitcoin_wallet.csv”)) { var csv = new CsvReader(fileReader); csv.Configuration.HasHeaderRecord = false; while (csv.Read()) { string PrivateKeyNewUser; csv.TryGetField<string>(0, out PrivateKeyNewUser); string PinTokenNewUser; csv.TryGetField<string>(1, out PinTokenNewUser); string SessionIDNewUser; csv.TryGetField<string>(2, out SessionIDNewUser); string UserIDNewUser; csv.TryGetField<string>(3, out UserIDNewUser); string PinNewUser; csv.TryGetField<string>(4, out PinNewUser); MixinApi mixinApiNewUser = new MixinApi(); mixinApiNewUser.Init(UserIDNewUser, “”, SessionIDNewUser, PinTokenNewUser, PrivateKeyNewUser); // Console.WriteLine(mixinApiNewUser.CreatePIN(””, “123456”).ToString()); Transfer reqInfo = mixinApiNewUser.Transfer(USRCONFIG.ASSET_ID_USDT, USRCONFIG.EXIN_BOT, “1”, PinNewUser.ToString(), System.Guid.NewGuid().ToString(), memo); Console.WriteLine(reqInfo); } }}交易完成后,Exincore会将你需要的币转到你的帐上,同样,会在memo里,记录成交价格,交易费用等信息!你只需要按下面的方式解开即可!NetworkSnapshots 读取钱包的交易记录。using (TextReader fileReader = File.OpenText(@“mybitcoin_wallet.csv”)){ var csv = new CsvReader(fileReader); csv.Configuration.HasHeaderRecord = false; while (csv.Read()) { string PrivateKeyNewUser; csv.TryGetField<string>(0, out PrivateKeyNewUser); string PinTokenNewUser; csv.TryGetField<string>(1, out PinTokenNewUser); string SessionIDNewUser; csv.TryGetField<string>(2, out SessionIDNewUser); string UserIDNewUser; csv.TryGetField<string>(3, out UserIDNewUser); string PinNewUser; csv.TryGetField<string>(4, out PinNewUser); MixinApi mixinApiNewUser = new MixinApi(); mixinApiNewUser.Init(UserIDNewUser, “”, SessionIDNewUser, PinTokenNewUser, PrivateKeyNewUser); // Console.WriteLine(mixinApiNewUser.CreatePIN("", “123456”).ToString()); var snaps = mixinApiNewUser.NetworkSnapshots(10,“2019-03-26T01:49:52.462741863Z”, “815b0b1a-2764-3736-8faa-42d694fa620a”, “ASC”,true); // Console.WriteLine(snaps); foreach (var sn in snaps) { if ( Convert.ToDouble(sn.amount) > 0 ) { if ( sn.data != null ) { var memoBytes = Convert.FromBase64String(sn.data); var memoObj = MessagePackSerializer.UnpackMessagePackObject(memoBytes); Console.WriteLine(memoObj.ToString()); var xR = JsonConvert.DeserializeObject<ExchangeResult>(memoObj.ToString()); Console.WriteLine(xR.C); if (xR.C == “1000”) { Console.WriteLine("———–Successfully–Exchange————-"); Console.WriteLine(“You got " + sn.amount.ToString() + " back!”); Console.WriteLine(“Price is " + xR.P + " Fee is " + xR.F + " Percent of fee: " + Convert.ToDouble(xR.F)/Convert.ToDouble(sn.amount)*100 + " %”); Console.WriteLine(“Fee Asset uuid: " + HexStringToUUID(xR.FA)); Console.WriteLine(“trace uuid: " + HexStringToUUID(xR.O)); Console.WriteLine(”———-end of snapshots query————–”); } } } } }}一次成功的交易如下:———–Successfully–Exchange————-You got 0.3923244 back!Price is 3938.62 Fee is 0.0007878 Percent of fee: 0.200803212851406 %Fee Asset uuid: 815b0b1a-2764-3736-8faa-42d694fa620atrace uuid: 1a3d8561-26e7-49bb-8ae3-ed85ce2bb957———-end of snapshots query————–读取币的余额通过读取币的余额,来确认交易情况! MixinApi mixinApiNewUser = new MixinApi(); mixinApiNewUser.Init(UserIDNewUser, “”, SessionIDNewUser, PinTokenNewUser, PrivateKeyNewUser); Asset AssetBTC = mixinApiNewUser.ReadAsset(USRCONFIG.ASSET_ID_BTC); Console.WriteLine(“New User " + UserIDNewUser + " ’s BTC balance is " + AssetBTC.balance); Console.WriteLine(“New User " + UserIDNewUser + " ’s BTC address is " + AssetBTC.public_key);源代码执行编译执行,即可开始交易了.[x] dotnet build 编译项目.[x] dotnet bin/Debug/netcoreapp2.2/bitcoin_wallet.dll 运行它.本代码执行时的命令列表:1: Create Bitcoin Wallet and update PIN2: Read Bitcoin balance & address3: Read USDT balance & address4: Read EOS balance & address5: pay 0.0001 BTC buy USDT6: pay $1 USDT buy BTC7: Read Snapshots8: Fetch market price(USDT)9: Fetch market price(BTC)v: Verify Wallet Pinq: ExitMake your choose:完整代码Solution Two: List your order on Ocean.One exchange ...

March 31, 2019 · 4 min · jiezi

Hyperledger Fabric 区块链开发详解

Hyperledger是一个旨在推动区块链跨行业应用的开源项目,由Linux基金会在2015年12月主导发起该项目,成员包括金融、银行、物联网、供应链、制造和科技等多个行业的领头羊,托管了众多面向企业的区块链开源框架和工具。Hyperledger及Fabric项目概述Hyperledger Fabric(后文简称Fabric)是其中发展最好的一个企业级区块链平台,最初由Digital Asset和IBM贡献,目前已经应用于沃尔玛的食物溯源链(Foodtrust)和马士基的物流跟踪链(TradeLens)中,代表了当下企业级区块链应用的最高水平。可以认为Fabric是一种联盟链(Consortium Blockchain)平台,它适合构建跨越多个企业边界的去中心化应用。由于Fabric项目的目标是应用于相对可信的企业联盟环境,因此其设计思路与比特币、以太坊等公链平台有明显的差异。Fabric借鉴了区块链的数据结构,但引入了相当多的身份验证与权限控制机制,以及数据隐私保护机制,以适应企业级应用的要求。同时由于企业联盟环境要比完全开放的公链环境可控,因此Fabric没有强调其共识体系对拜占庭容错的实现,允许使用 非拜占庭容错算法建立共识,从而可以达到相当实用的交易吞吐量。Fabric的定位与特点毫无疑问,Fabric是受到比特币的启发而诞生的,因此它借鉴了比特币、以太坊这些公链中的一些核心特性,例如采用不可篡改的区块链结构来保存数据、采用非对称加密技术来进行身份识别 与认证、支持智能合约等等。但是Fabric定位于企业级的分布式账本技术(DLT - Distributed Ledger Technology)平台,它的主要目的是为跨越多个企业边界的活动提供不可篡改的分布式记账平台。例如在食物溯源应用中,为了让消费者可以了解到所购买食物是否安全,就必须将从农场到加工商、分销商、 零售商乃至监管机构等各个环节的检验与放行信息记录到区块链上,以保证溯源信息的透明与可信。因此Fabric是一种联盟链(Consortium Blockchain),它适合在多个企业间实现分布式记账,这一定位使Fabric的实现与以太坊这样的公链有了明显的差异:分布式账本 vs. 区块链分布式账本是比区块链更加宽泛的概念,可以认为区块链只是分布式账本的一种实现技术,其他的分布式账本实现还包括哈希图等。去中心化 vs. 分布式Fabric淡化了去中心化(Decentralized),而以分布式(Distributed)代替,这一思路带来了系统设计与实现上的巨大影响。例如,在Fabric中,采用中心化的CA机制来发放证书,只有持有有效证书的节点和用户才可以访问区块链上的账本数据。因此Fabric是许可制/Permissioned的区块链,这与不需要许可/Permissionless的以太坊这样的公链形成了鲜明的对比。拜占庭容错 vs. 崩溃容错由于采用许可机制,Fabric也淡化了对不可信(Trustless)环境下共识达成的依赖性,而假设联盟链中的企业有可能是值得信赖的,因此并不依赖于工作量证明这样的拜占庭容错算法,虽然Fabric模块化的设计可以支持引入不同的共识算法实现,但目前的产品化方案是Kafka共识,它显然是不能对抗拜占庭错误的,不过对不可信环境支持的淡化处理有利于提高交易的吞吐量,这对于企 业级应用也是有益的。数据隐私保护在另一方面,Fabric强化了隐私保护能力。例如,Fabric支持在同一套企业网络上建立多个不同的通道/Channel,每一个通道都有自己的区块链和访问控制,彼此互不影响,这有利于复用基础设施,例如不同企业间的销售部门可以建立一个通道来分享市场数据,而这些企业间的 研发部门可以建立另一个通道来分享技术数据。Fabric并不是唯一的联盟链解决方案,但目前可以说是最复杂的企业联盟链实现,这种复杂性源于设计者对应用场景的假设和推演,以及对Fabric广泛适用性的考量,这是我们在学习过程中需要换位思考的一点。课程内容概述本课程适合nodejs开发人员快速掌握超级账本Fabric区块链的设计思路、 核心概念、网络搭建、链码及应用开发等知识点,课程主要内容简述如下:第一章、课程概述简介Fabric项目来源、定位特点、适用场景以及其与公链平台的重要区别。第二章、初识Fabric创建一个最小CA,搭建一个最小Farbic网络,开发一个最小Fabric链码,实现一个最小Fabric应用,从零开始学习并掌握Farbic中的核心概念、设计思路、实用工具与开发模型。第三章、身份与权限管理机制深入学习Fabric中的身份验证机制与权限管理机制,理解证书、成员服务提供器、 策略、访问控制清单等核心概念并掌握其创建、部署和使用方法。第四章、通道配置与更新深入学习Fabric的通道配置初始化与更新流程、相关数据结构以及配置工具的操作方法。第五章、链码开发进阶学习理解链码运行机制、掌握状态历史跟踪、富查询、Contract API等链码开发进阶知识。第六章、应用开发进阶学习掌握通道事件监听、Network API等应用开发进阶知识。希望尽快学习课程的请访问:Hyperledger Fabric Node.js 区块链开发详解Hyperledger Fabric java 区块链开发详解

March 29, 2019 · 1 min · jiezi

Nervos 双周报第 6 期:一旦开始,一切就会变得简单

本期小编 | Sherry不知不觉, Nervos 双周报已经到第 6 期了,这期突然想写点小情绪(叨叨叨)了。有句俗话:万事开头难!放在任何人或者任何公司都是合适的吧?Nervos 从去年一直坚持在杭州举办的以开发者为主的 Dev Meetup 已经走过了 17 期,虽然前几期的时候我还没有来到这家公司,但可以想象到前几期负责 Dev Meetup 同事的内心戏:报名人数会不会少?这期请的讲师内容大家会不会不感兴趣?…还记得发布双周报第 1 期之前确定内容框架、风格的选择困难感,担心内容不是社区愿意看的,风格不是大家喜欢的,但还是硬着头皮发出去了。如果认真看我们周报的伙伴会发现从第 2 期开始的双周报都会加一个标题和引语,我们一直很喜欢橙皮书的《预言家周报》,对双周报的期望大概也源于此,美好的东西总是令人向往和值得学习。很多的问题在开始之后就变得简单了,难的是开始。我们已经开始,你呢?Nervos 社区动态Nervos 项目发展路线图更新我们更新了项目发展路线图,包括过去已实现的、未实现的,以及未来将会发生的一些变化:《Nervos 项目发展路线图更新 (https://mp.weixin.qq.com/s/VQ…》。对于软件开发而言,准确估算项目的交付时间并非易事,我们之后也会继续和大家更新 Nervos 的开发进展。《价值存储型公链的加密经济》在我们发布了加密经济设计的 RFC (https://github.com/nervosnetw… 之后,Kevin 针对社区不少有意思的讨论,撰写了一篇文章《Crypto-economic Design for a Preservation Focused Layer 1 Blockchain (https://medium.com/nervosnetw…》。我们认为一个基于状态存储的经济模型,对于价值存储平台的可持续至关重要,并且它是独立于交易需求的可持续经济模型设计的关键。中文版请查看:《价值存储型公链的加密经济 (https://mp.weixin.qq.com/s/qJ…》Nervos 在台北第一站:听 Nervos CKB 开发者肖雪洁在台北 RISC-V Conf 上讲区块链与 RISC-V 的故事,他主要描述了 RISC-V 在区块链虚拟机上的发展潜力,CKB-VM 将会是一个可以用在区块链以及非区块链场景的虚拟机。第二站:Nervos Dev Meetup 上,Nervos 架构师 Jan (https://twitter.com/janhxie) 分享了他对区块链长久以来的思考:为什么会有 Layer 2?Layer 1 与 Layer 2 各自的定位是什么?同时提到了张韧(https://twitter.com/nirenzang)准博士是如何用科学的方法去找寻现有区块链的瓶颈。肖雪洁详细介绍了 CKB-VM,并现场以 Live Coding 的方式展示如何在 30 分钟内基于 CKB-VM 实现比特币的改进提案 BIP118。第三站:Nervos 台北社群见面会上,Jan、Daniel(https://twitter.com/lgn21st?l…)(Nervos 首席宣传员)、Ash (https://twitter.com/ashchan) (Neuron 钱包架构师)三位同台为大家分析了区块链中遇到的问题及深度思考,这也是我们的 Ash 首次公开演讲,对下次更是充满期待呀!Daniel 为你解读 CKB 经济模型提案在 Nervos 经济模型提案发布以后,收到很多小伙伴的反馈及讨论,我们为此专门安排了一期现场解读活动,点击链接直达:Dev Meetup No.17 —— Daniel 为你解读 CKB 经济模型提案(https://mp.weixin.qq.com/s/Nm…) ,当然更激烈的讨论还在论坛(talk.nervos.org )继续进行着…北京社区活动上个周日,北京社区如期举办了「Blockchain Coding Day 5th」,不同于往常,本期在 Coding 之前,应此次参与活动的成员建议,社区管理员兼教练刘宁亮出了《初探以太坊》的 77 页幻灯片,向大家普及了区块链的基础知识,深受好评!并在活动的最后将 BCD 资源开源,更多详细的内容,可以查看:《Blockchain Coding Day 5th 活动回顾 (https://mp.weixin.qq.com/s/uR… 》,BCD 资源也可在其中找到。RustCon Asia 大会进展RustCon Asia (rustcon.asia) 上线 CFP (Call For Proposals)的两周时间内,我们共收到了 50 份中英文议题,经过一周的评选和近 2 小时的讨论会议,最终议题确定并更新至官网,也可查看这里:《RustCon Asia 讲师和议程公布 (https://mp.weixin.qq.com/s/KO…》。Fork It 5: 聊一聊 DeFi本期 Fork It 我们有幸请到了 Maker DAO 中国区的负责人潘超来和我们聊一聊 DeFi。这期内容分为两部分,第一部分讨论了 JPM Coin 和稳定币的区别以及它未来的走向是什么?其中穿插了一些案例,非常全面。第二部分和大家介绍了 DeFi,其中包含 DeFi 和 Fintech 的区别是什么?Maker DAO 是怎么和其它 DeFi 项目结合的?DeFi 目前最大的缺陷又是什么?..值得一听:https://forkit.fm/5Peter 每周四分享程序员中的专业区块链讲解员 Peter (https://www.zhihu.com/people/… 老师每周四晚的千聊直播分享,最近两周带来了 2 期有关《如何在 GitHub 上参与开源项目》的内容。Peter 对 Git 和 GitHub 十年来一直抱有热情。作为一个开源运动铁粉,十年来一直没有停止过往 GitHub 上 Push 内容。感兴趣的伙伴可以关注直播间「Crypto Camp(https://m.qlchat.com/wechat/p…)」回听。Nervos CKB 开发动态CKB v0.8.0 已冻结此版本的主要变化是 CKB 切换到了新的 P2P 库(#295(https://github.com/nervosnetw…)),带回了网络发现功能(#340(https://github.com/nervosnetw…))进行了代码重构,使代码更安全,更容易调试,以避免使用 unwrapCKB VM 已将 JIT merge 进 masterJIT 为可选功能,进行继续测试,确保它的安全和快速CKB VM repo 正在进行重构工作继续努力升级 CKB ,以便及时使用最新的 CKB VM 进行测试更多更详细的更新,可以查看:Nervos CKB Development Update #7(https://medium.com/@doitian/6…)Nervos 的粉丝们近期好玩的推荐首位当然非论坛(talk.nervos.org )莫属了,小伙伴们在论坛上提出了各种各样有趣的观点,Jan 也会不定时出没,参与大家的讨论,并且还会结合大家共通的难点去专门写一篇便于理解的文章发布论坛,比如:《Layer 1 应该做什么 (https://talk.nervos.org/t/lay…》、《区块链与状态爆炸 (https://talk.nervos.org/t/top…》其次,要说说这次 RustCon Asia 大会了,我们针对所有即将参会的讲师做了一个深度挖掘,有你意想不到的料,持续更新中:https://talk.citahub.com/t/to… ,迫不及待见到他们!还有,海报解谜活动:Jan 为 Nervos Meetup 提出了一道谜题,藏在了 7 张海报中,每一张海报除了有区块链的一些重要元素之外,还列出了一串英文及数字组成的字串。这些海报就从北美的 Meetup 开始,直到台北 Meetup 结束两天之后,我们收到了台北伙伴Robin Pan (https://medium.com/@robinpan) 的消息,他成功破解了这道谜题,同时收到了我们的机械猿及周边奖励。为此,他特意将破解密码的过程及参加 Nervos Meetup 的感受写成了一篇文章:《Nervos 解迷过程 & meetup 心得 (https://talk.nervos.org/t/ner…》最后,好文推荐:《论 Layer 1 和 Layer 2 的价值捕获 (https://mp.weixin.qq.com/s/Uy…》,由社区伙伴 Ryan 翻译,原文出自著名区块链投资机构 Multicoin Capital 近期推出的《On Value Capture at Layers 1 and 2 (https://multicoin.capital/201…》,解释了 Layer 1 和 Layer 2 的协议究竟如何捕获价值。Nervos 活动预告3 月 28 日,Daniel 受邀参加火星财经在重庆举办的「火星POW’ER 2019中国区块链贡献者年度峰会」。3 月 28 日,Nervos 社区运营肖杰 (https://twitter.com/JackXiao1…:《分层是区块链面向未来的发展方向》。4 月 3 日,Nervos 将在韩国参与举办以「Building the new web (https://www.eventbrite.nl/e/b…」为主题的论坛活动,Nervos 研究员朱海潮将带来《Understanding the Layer1 Blockchain Design for the Future Crypto-Economics》的主题分享。-4 月 3 日,Crypto Wednesday (https://www.huodongxing.com/e… 我们邀请了潘超(MakerDAO 中国区负责人)和 Jason(DAEX 联合创始人 & 首席架构师)一起来聊一聊 Defi 和分布式数字资产生态。4 月 11 日,Nervos 北美市场运营Jane (https://twitter.com/cryp_TOTO… San Francisco 活动「Marketing to Developers: The Key Marketing Vertical in Crypto Today (https://www.meetup.com/Starfi… 」。关注我们Nervos 官网: https://www.nervos.orgNervos 论坛: https://talk.nervos.orgCommunity blogs: https://medium.com/nervosnetworkTwitter: https://twitter.com/nervosnet...Reddit: https://www.reddit.com/r/Nerv...Telegram: http://t.me/nervosnetworkGitHub: https://github.com/nervosnetwork这是 Nervos 双周报的第 6 期,如有任何建议或者想法,欢迎大家讨论哦!原文来自 Nervos talk 论坛:https://talk.nervos.org/t/ner… ...

March 28, 2019 · 2 min · jiezi

使用Java SDK实现离线签名

严格来说,tx-signer并不属于SDK,它是bytomd中构建交易、对交易签名两大模块的java实现版。因此,若想用tx-signer对交易进行离线签名,需要由你在本地保管好自己的私钥。如果你的目的是完全脱离于bytomd全节点,可能需要自己做更多额外的工作。比如,在构建交易时,需要花费若干个utxo(Unspent Transaction Output)作为交易的输入,如果没有全节点则需要自身来维护utxo。当使用tx-signer构建完成一笔交易并签名后,若没有全节点的帮助,也需要自己实现P2P网络协议将交易广播到其他节点。本文不会对以上技术细节进行讨论,而是利用bytomd全节点查询可用的utxo构建交易,对交易进行签名并序列化后,同样使用bytomd提交交易。准备工作将Maven依赖引入到你的项目中获取SDK源码git clone https://github.com/Bytom/bytom-java-sdk.git 打包成JAR包并安装到本地的Maven仓库$ mvn clean install -DskipTests 在项目的POM文件中添加依赖。其中,第一个依赖是bytomd api的封装,可用于查询可用的utxo以及提交交易;第二个依赖用于构建交易以及对交易进行离线签名。 <dependency> <groupId>io.bytom</groupId> <artifactId>java-sdk</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>io.bytom</groupId> <artifactId>tx-signer</artifactId> <version>1.0.0</version> </dependency>构建交易普通交易查询可用的utxo在本文中,以下将全部使用全节点来查询可用的utxo,你也可以构建一套自己的utxo维护方案。Client client = Client.generateClient();UnspentOutput.QueryBuilder builder = new UnspentOutput.QueryBuilder();builder.accountAlias = “bytom”;List<UnspentOutput> outputs = builder.list(client);利用SDK只需要四行代码就能查询可用的utxo(SDK具体文档详见java-sdk documentation)。在QueryBuilder中可以指定是否为未确认的utxo(默认false),也可以通过from和count来进行分页查询(默认查询所有)。假设在当前账户下查询得到这样一个utxo:{ “account_alias”: “bytom”, “id”: “ffdc59d0478277298de4afa458dfa7623c051a46b7a84939fb8227083411b156”, “asset_id”: “ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff”, “asset_alias”: “BTM”, “amount”: 41250000000, “account_id”: “0G1R52O1G0A02”, “address”: “sm1qxls6ajp6fejc0j5kp8jwt2nj3kmsqazfumrkrr”, “control_program_index”: 1, “program”: “001437e1aec83a4e6587ca9609e4e5aa728db7007449”, “source_id”: “2d3a5d920833778cc7c65d7c96fe5f3c4a1a61aa086ee093f44a0522dd499a34”, “source_pos”: 0, “valid_height”: 4767, “change”: false, “derive_rule”: 0}构建交易现在需要往0014c832e1579b4f96dc12dcfff39e8fe69a62d3f516这个control program转100个BTM。代码如下:String btmAssetID = “ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff”;// 下面的字段与utxo中的字段一一对应SpendInput input = new SpendInput();input.setAssetId(btmAssetID);input.setAmount(41250000000L);input.setProgram(“001437e1aec83a4e6587ca9609e4e5aa728db7007449”);input.setSourcePosition(0);input.setSourceID(“2d3a5d920833778cc7c65d7c96fe5f3c4a1a61aa086ee093f44a0522dd499a34”);input.setChange(false);input.setControlProgramIndex(1);// 选择使用BIP32还是BIP44来派生地址,默认BIP44input.setBipProtocol(BIPProtocol.BIP44);// 账户对应的密钥索引input.setKeyIndex(1);// 自身本地保管的私钥,用于对交易进行签名input.setRootPrivateKey(“4864bae85cf38bfbb347684abdbc01e311a24f99e2c7fe94f3c071d9c83d8a5a349722316972e382c339b79b7e1d83a565c6b3e7cf46847733a47044ae493257”);Transaction tx = new Transaction.Builder() .addInput(input) // 加入需要转入的output .addOutput(new Output(btmAssetID, 10000000000L, “0014c832e1579b4f96dc12dcfff39e8fe69a62d3f516”)) // 剩余的BTM用于找零 .addOutput(new Output(btmAssetID, 31250000000L, “0014bb8a039726df1b649738e9973db14a4b4fd4becf”)) .setTimeRange(0) .build();String rawTransaction = tx.rawTransaction();对交易调用build方法后,自动会对交易进行本地的验证和签名操作。注意,在本地只是做简单的字段验证,本地验证通过并不代表交易合法。最后对交易调用rawTransaction方法返回交易序列化后的字符串。提交交易本文利用bytomd全节点来提交交易:HashMap<String, Object> body = new HashMap<>();body.put(“raw_transaction”, “070100010160015e4b5cb973f5bef4eadde4c89b92ee73312b940e84164da0594149554cc8a2adeaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80c480c1240201160014cb9f2391bafe2bc1159b2c4c8a0f17ba1b4dd94e6302401cb779288be890a28c5209036da1a27d9fe74a51c38e0a10db4817bcf4fd05f68580239eea7dcabf19f144c77bf13d3674b5139aa51a99ba58118386c190af0e20bcbe020b05e1b7d0825953d92bf47897be08cd7751a37adb95d6a2e5224f55ab02013dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80b095e42001160014a82f02bc37bc5ed87d5f9fca02f8a6a7d89cdd5c000149ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80d293ad03012200200824e931fb806bd77fdcd291aad3bd0a4493443a4120062bd659e64a3e0bac6600”);Transaction.SubmitResponse response = client.request(“submit-transaction”, body, Transaction.SubmitResponse.class);交易提交成功后,response返回交易ID。发行资产交易查询可用的utxo发行资产时,需要使用BTM作为手续费,因此第一步同样需要查询当前账户下可用的utxo,由于上面已经提到,这里不再赘述。查询需要发行的资产信息例如,需要发行的资产id为7b38dc897329a288ea31031724f5c55bcafec80468a546955023380af2faad14Asset.QueryBuilder builder = new Asset.QueryBuilder();builder.setId(“7b38dc897329a288ea31031724f5c55bcafec80468a546955023380af2faad14”);List<Asset> assets = builder.list(client);假设查询得到的资产信息如下:{ “type”: “asset”, “xpubs”: [ “5ff7f79f0fd4eb9ccb17191b0a1ac9bed5b4a03320a06d2ff8170dd51f9ad9089c4038ec7280b5eb6745ef3d36284e67f5cf2ed2a0177d462d24abf53c0399ed” ], “quorum”: 1, “key_index”: 3, “derive_rule”: 0, “id”: “7b38dc897329a288ea31031724f5c55bcafec80468a546955023380af2faad14”, “alias”: “棒棒鸡”, “vm_version”: 1, “issue_program”: “ae20db11f9dfa39c9e66421c530fe027218edd3d5b1cd98f24c826f4d9c0cd131a475151ad”, “raw_definition_byte”: “7b0a202022646563696d616c73223a20382c0a2020226465736372697074696f6e223a207b7d2c0a2020226e616d65223a2022222c0a20202273796d626f6c223a2022220a7d”, “definition”: { “decimals”: 8, “description”: {}, “name”: “”, “symbol”: "" }}构建交易现在需要发行1000个棒棒鸡资产:IssuanceInput issuanceInput = new IssuanceInput();issuanceInput.setAssetId(“7b38dc897329a288ea31031724f5c55bcafec80468a546955023380af2faad14”);issuanceInput.setAmount(100000000000L);// issue programissuanceInput.setProgram(“ae20db11f9dfa39c9e66421c530fe027218edd3d5b1cd98f24c826f4d9c0cd131a475151ad”);// 可以不指定,不指定时将随机生成一个issuanceInput.setNonce(“ac9d5a527f5ab00a”);issuanceInput.setKeyIndex(5);// raw definition byteissuanceInput.setRawAssetDefinition(“7b0a202022646563696d616c73223a20382c0a2020226465736372697074696f6e223a207b7d2c0a2020226e616d65223a2022222c0a20202273796d626f6c223a2022220a7d”);// 该资产对应的私钥issuanceInput.setRootPrivateKey(“4864bae85cf38bfbb347684abdbc01e311a24f99e2c7fe94f3c071d9c83d8a5a349722316972e382c339b79b7e1d83a565c6b3e7cf46847733a47044ae493257”);// 创建一个spend input作为手续费,假设当前有一个100BTM的utxo,并且使用1BTM作为手续费,则后续还要创建99BTM的找零地址SpendInput feeInput = new SpendInput(btmAssetID, 10000000000L, “0014cb9f2391bafe2bc1159b2c4c8a0f17ba1b4dd94e”);feeInput.setKeyIndex(1);feeInput.setChange(true);feeInput.setSourceID(“4b5cb973f5bef4eadde4c89b92ee73312b940e84164da0594149554cc8a2adea”);feeInput.setSourcePosition(2);feeInput.setControlProgramIndex(457);feeInput.setRootPrivateKey(“4864bae85cf38bfbb347684abdbc01e311a24f99e2c7fe94f3c071d9c83d8a5a349722316972e382c339b79b7e1d83a565c6b3e7cf46847733a47044ae493257”);Transaction tx = new Transaction.Builder() .addInput(issuanceInput) .addInput(feeInput) // 该output用于接收发行的资产 .addOutput(new Output(“7b38dc897329a288ea31031724f5c55bcafec80468a546955023380af2faad14”, 100000000000L, “001437e1aec83a4e6587ca9609e4e5aa728db7007449”)) // 找零 .addOutput(new Output(btmAssetID, 9800000000L, “00148be1104e04734e5edaba5eea2e85793896b77c56”)) .setTimeRange(0) .build();提交交易提交交易的方式与普通交易一致。销毁资产交易销毁资产跟发行资产类似,同样需要BTM作为手续费。查询可用的utxo查询方式与普通交易一致。构建交易这里以销毁一个BTM为例,假设查询得到一个100BTM的utxo:// 查询得到一个100BTM的utxo作为输入SpendInput input = new SpendInput(btmAssetID, 10000000000L, “0014f1dc52048f439ac7fd74f8106a21da78f00de48f”);input.setRootPrivateKey(rootKey);input.setChange(true);input.setKeyIndex(1);input.setControlProgramIndex(41);input.setSourceID(“0b2cff11d1d056d95237a5f2d06059e5395e86f60e69c1e8201ea624911c0c65”);input.setSourcePosition(0);// 销毁资产时,可添加一段附加的文本String arbitrary = “77656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c”;// 销毁99个BTM,剩余1个BTM作为手续费Output output = Output.newRetireOutput(btmAssetID, 9900000000L, arbitrary);Transaction transaction = new Transaction.Builder() .addInput(input) .addOutput(output) .setTimeRange(2000000) .build();String rawTransaction = transaction.rawTransaction();提交交易提交交易的方式与普通交易一致。bytom java sdk:https://github.com/Bytom/byto… ...

March 27, 2019 · 2 min · jiezi

EOS源码解析 创建账号的三种方式。

第一种:创建系统账号eosio的方式。直接调用create_native_account 方法直接进行创建。并将资源设置成无限。 void create_native_account( account_name name, const authority& owner, const authority& active, bool is_privileged = false ) { //create account 直接创建账号,不会做任何资源判断,因为创建的是系统账号 db.create<account_object>([&](auto& a) { a.name = name; a.creation_date = conf.genesis.initial_timestamp; a.privileged = is_privileged; if( name == config::system_account_name ) { a.set_abi(eosio_contract_abi(abi_def())); } }); db.create<account_sequence_object>([&](auto & a) { a.name = name; }); const auto& owner_permission = authorization.create_permission(name, config::owner_name, 0, owner, conf.genesis.initial_timestamp ); const auto& active_permission = authorization.create_permission(name, config::active_name, owner_permission.id, active, conf.genesis.initial_timestamp ); //初始化账号资源,但是初始化赋值只赋了resource_limits_object的owner值,其他cpu,ram,net等资源默认是-1,也就是unlimit。 resource_limits.initialize_account(name); int64_t ram_delta = config::overhead_per_account_ram_bytes; ram_delta += 2config::billable_size_v<permission_object>; ram_delta += owner_permission.auth.get_billable_size(); ram_delta += active_permission.auth.get_billable_size(); resource_limits.add_pending_ram_usage(name, ram_delta); resource_limits.verify_account_ram_usage(name); }void resource_limits_manager::initialize_account(const account_name& account) { _db.create<resource_limits_object>([&]( resource_limits_object& bl ) { bl.owner = account; }); _db.create<resource_usage_object>([&]( resource_usage_object& bu ) { bu.owner = account; });}/** Every account that authorizes a transaction is billed for the full size of that transaction. This object* tracks the average usage of that account./struct resource_limits_object : public chainbase::object<resource_limits_object_type, resource_limits_object> { OBJECT_CTOR(resource_limits_object) id_type id; account_name owner; bool pending = false; int64_t net_weight = -1; int64_t cpu_weight = -1; int64_t ram_bytes = -1; };第二种:cleos create account 方式创建账号,调用的是eosio的默认合约,但该方式在eosio 部署了eosio.system后不可用。 因为默认合约被替换掉。eosio的默认合约是来自源码提前定义好的。具体的abi信息在:libraries/chain/eosio_contract_abi.cpp,libraries/chain/eosio_contract.cpp。跟第一种一样,同样是将资源的使用权设置为无限。 下一次再介绍eosio默认合约的形成原理,以及调用流程。/** * This method is called assuming precondition_system_newaccount succeeds a /void apply_eosio_newaccount(apply_context& context) { auto create = context.act.data_as<newaccount>(); try { context.require_authorization(create.creator);// context.require_write_lock( config::eosio_auth_scope ); auto& authorization = context.control.get_mutable_authorization_manager(); //判断公钥是否合法。 EOS_ASSERT( validate(create.owner), action_validate_exception, “Invalid owner authority”); EOS_ASSERT( validate(create.active), action_validate_exception, “Invalid active authority”); auto& db = context.db; auto name_str = name(create.name).to_string(); //判断account name的合法性 EOS_ASSERT( !create.name.empty(), action_validate_exception, “account name cannot be empty” ); EOS_ASSERT( name_str.size() <= 12, action_validate_exception, “account names can only be 12 chars long” ); // Check if the creator is privileged //只有eosio才能创建eosio.为前缀的账号。 const auto &creator = db.get<account_object, by_name>(create.creator); if( !creator.privileged ) { EOS_ASSERT( name_str.find( “eosio.” ) != 0, action_validate_exception, “only privileged accounts can have names that start with ’eosio.’” ); } //判断用户名是否存在。 auto existing_account = db.find<account_object, by_name>(create.name); EOS_ASSERT(existing_account == nullptr, account_name_exists_exception, “Cannot create account named ${name}, as that name is already taken”, (“name”, create.name)); const auto& new_account = db.create<account_object>([&](auto& a) { a.name = create.name; a.creation_date = context.control.pending_block_time(); }); db.create<account_sequence_object>([&](auto& a) { a.name = create.name; }); for( const auto& auth : { create.owner, create.active } ){ validate_authority_precondition( context, auth ); } const auto& owner_permission = authorization.create_permission( create.name, config::owner_name, 0, std::move(create.owner) ); const auto& active_permission = authorization.create_permission( create.name, config::active_name, owner_permission.id, std::move(create.active) ); context.control.get_mutable_resource_limits_manager().initialize_account(create.name); int64_t ram_delta = config::overhead_per_account_ram_bytes; ram_delta += 2config::billable_size_v<permission_object>; ram_delta += owner_permission.auth.get_billable_size(); ram_delta += active_permission.auth.get_billable_size(); context.trx_context.add_ram_usage(create.name, ram_delta);} FC_CAPTURE_AND_RETHROW( (create) ) }跟第一种一样,同样是将资源的使用权设置为无限。 下一次再介绍当没有部署eosio.system合约时,eosio默认合约的形成原理。第三种:当部署eosio.system合约时,创建账号都必须使用该合约的newaccount的action。 值得一提的是用第三种方式创建时,第二种方式的apply_eosio_newaccount也会执行。void native::newaccount( account_name creator, account_name newact / no need to parse authorities const authority& owner, const authority& active*/ ) { //当creator 不是eosio时,需要判断创建者的资源以及低于12个字符的名字是否通过拍卖。 if( creator != _self ) { auto tmp = newact >> 4; bool has_dot = false; for( uint32_t i = 0; i < 12; ++i ) { has_dot |= !(tmp & 0x1f); tmp >>= 5; } if( has_dot ) { // or is less than 12 characters auto suffix = eosio::name_suffix(newact); if( suffix == newact ) { name_bid_table bids(_self,_self); auto current = bids.find( newact ); eosio_assert( current != bids.end(), “no active bid for name” ); eosio_assert( current->high_bidder == creator, “only highest bidder can claim” ); eosio_assert( current->high_bid < 0, “auction for name is not closed yet” ); bids.erase( current ); } else { eosio_assert( creator == suffix, “only suffix may create this account” ); } } } user_resources_table userres( _self, newact); userres.emplace( newact, [&]( auto& res ) { res.owner = newact; }); //将账号资源初始化为0,不购买资源无法进行相关动作 set_resource_limits( newact, 0, 0, 0 ); } ...

March 27, 2019 · 3 min · jiezi

跨链技术的分析和思考

当前的区块链底层技术平台百花齐放,不同的业务、不同的技术底层的区块链之间缺乏统一的互联互通的机制,这极大限制了区块链技术和应用生态的健康发展。跨链的需求由此而来,本文通过分析几种主流的跨链方案探讨跨链技术的本质及相应的解决思路。<!– more –>跨链的类型跨链交互根据所跨越的区块链底层技术平台的不同可以分为同构链跨链和异构链跨链:同构链之间安全机制、共识算法、网络拓扑、区块生成验证逻辑都一致,它们之间的跨链交互相对简单。而异构链的跨链交互相对复杂,比如比特币采用PoW算法而联盟链Fabric采用传统确定性共识算法,其区块的组成形式和确定性保证机制均有很大不同,直接跨链交互机制不易设计。异构链之间的跨链交互一般需要第三方辅助服务辅助跨链交互。主流跨链机制概述截至目前,主流的区块链跨链技术方案按照其具体的实现方式主要分为三大类,分别是公证人机制、侧链/中继和哈希锁定:公证人机制(Notary schemes): 公证人也称见证人机制,公证人机制本质上是一种中介的方式。具体而言,假设区块链A和B本身是不能直接进行互操作的,那么他们可以引入一个共同信任的第三方作为中介,由这个共同信任的中介进行跨链消息的验证和转发。公证人机制的优点在于能够灵活地支持各种不同结构的区块链(前提是公证人能够访问相关方的链上信息),缺点在于存在中心化风险。哈希锁定(Hash-locking): 哈希锁定技术主要是支持跨链中的原子资产交换,最早起源自比特币的闪电网络。其典型实现是哈希时间锁定合约HTLC(Hashed TimeLock Contract)。哈希锁定的原理是通过时间差和影藏哈希值来达到资产的原子交换。哈希锁定只能做到交换而不能做到资产或者信息的转移,因此其使用场景有限。侧链/中继链(Sidechains / Relays): 侧链是指完全拥有某链的功能的另一条区块链,侧链可以读取和验证主链上的信息。主链不知道侧链的存在,由侧链主动感知主链信息并进行相应的动作。而中继链则是侧链和公证人机制的结合体,中继链具有访问需要和验证进行互操作的链的关键信息并对两条链的跨链消息进行转移。从这个角度看中继链也是一种去中心的公证人机制。下面就这几种跨链方式的典型实现方式进行详细分析:典型跨链机制实现分析公证人机制最传统的公证人机制是基于中心化交易所得跨链资产交换,这种跨链的方式比较单一,只支持资产的交换,如下图演示了Alice通过交易所,用比特币和Bob交换ETH的过程。 Alice 通过交易所钱包将自己的比特币打入交易所地址;Alice 在交易所上挂上卖单1个BTC卖出20ETH价格;Bob需要将自己的ETH打入交易所的以太坊地址;Bob通过交易所挂出购买比特币的单子 20ETH买一个比特币;交易所将Alice的卖单和Bob的卖单进行撮合;交易所将Alice在交易所存储的1BTC 转移给Bob的比特币地址;交易所将Bob在交易所存储的20ETH 转移给Alice的以太坊地址;至此完成了Alice和Bob的BTC和ETH的交换(案例中省去了交易所的服务费)。通过该例子可以看出交易所的方式目前仅能够支持资产的交换,且资产交换的原子性、安全性完全由中心化的交易所保障存在较大的中心化风险。除此之外还有一种著名的分布式账本技术Ripple,也是采用类似公证人的机制来解决全球金融机构之间的资产交换。Ripple的系统架构如上图所示,Ripple系统中交易通过网络中的验证者进行交易的验证,验证者验证的交易通过加密算法保护交易内容不能被验证着窥探从而保证交易的隐私性。公证人机制的跨链技术实现简单,且能够比较灵活地支持不同类型的底层区块链体系。公证人机制的主要问题在于公证人机制的安全性保障完全由公证人系统保障。参与跨链的相关方需要对中间人给予较大的信任。哈希锁定哈希时间锁定(HTLC)最早出现在比特币的闪电网络,跨链资产交换支持一定数量的A链资产和一定数量的B链资产进行原子交换。哈希时间锁定巧妙地采用了哈希锁和时间锁,迫使资产的接收方在deadline内确定收款并产生一种收款证明给打款人,否则资产会归还给打款人。收款证明能够被付款人用来获取接收人区块链上的等量价值的数量资产或触发其他事件。如下图所示,我们用一个例子来阐述如何使用哈希时间锁定进行跨链的原子资产交换,假设Alice和Bob有资产交换的需求,Alice想用1个BTC和Bob换20个ETH. 那么首先需要在两条链上设置哈希时间锁定合约,然后执行如下步骤:Alice 随机构建一个字符串s,并计算出其哈希 h = hash(s);Alice 将h发送给Bob的合约;Alice锁定自己的1个BTC资产,并设置一个较长的锁定时间t1, 并设置了获取该BTC的一个条件:谁能够提供h的原始值s就可以得到该BTC;Bob观察到Alice 合约中锁定了一个BTC, 然后Bob锁定自己的20个ETH资产,并设置一个相对较短的锁定时间t2, t2 < t1, Bob也设置了同样获取条件(谁提供h的原始值s就可以获取20个ETH);Alice将自己最初生成的字符串s 发送到Bob的合约里取得了20个ETH;Bob观察到步骤5中Alice的s值,将其发送给Alice的合约成功获取1个BTC; 至此Alice和Bob完成了资产的交换。从上述的过程我们可以看出哈希时间锁定合约有一些约束条件:进行跨链资产交换的双方必须能够解析双方的合约内部数据,例如s,例如锁定资产的证明等;哈希锁定的超时时间设置时需要保证存在时间差,这样在单方面作弊时另一方可以及时撤回自己的资产。哈希锁定的思想运用在支付领域较多,例如闪电网络、雷电网络以及跨链资产转移协议Interledger等。但是哈希锁定目前看只适合偏资产或者关键数据的交换,甚至不支持转移因此其试用场景受限。侧链/中继链侧链侧链是相对于主链而言的,最初的侧链提出是针对比特币做新特性的测试和研发。侧链相对主链而言能够验证和解析主链中的区块数据和账本数据。侧链实现的基础技术是双向锚定(Two-way Peg),通过双向锚定技术可以将数字资产在主链上进行锁定,同时将等价的资产在侧链中释放。相反当侧链中相关资产进行锁定时,主链上锚定的等价资产也可以被释放。BTC-Relay是号称的史上第一个侧链,BTC-Relay是通过以太坊构建了一个比特币的侧面,运用以太坊的智能合约允许用户验证比特币的交易。这里我们仍然以Alice 1BTC和Bob的20ETH数字资产交换为例阐述相应原理:Bob将20ETH发送到BTCSwap的合约进行冻结;(该合约只要能够确认BTC网络上Bob接收到来自Alice 1BTC就自动将20ETH转给Alice)Alice 确认Bob冻结信息后,将1 BTC转给Bob比特币账户;BTC Relayer将比特币区块头推送到BTCSwap合约;Alice 接下来就可以调用relay tx;BTCSwap合约结合tx和BTC链的区块链进行SPV验证,验证通过则将20ETH转给Alice以太坊地址。这种跨链的实现方式简单,但是BTC Relay需要额外的信任和维护成本,且智能合约内部的数据存储会有体积膨胀的问题。但是侧链的机制相对哈希锁定而言能够提供更多的跨链交互场景,侧链以及类SPV验证的思想适合所有跨链的场景。中继链中继链本质上算是公证人机制和侧链机制的融合和扩展,目前社区内最活跃的两个跨链项目Cosmos 和 Polkadot 采用的都是基于中继链的多链多层架构,其中Cosmos目前支持的是跨链资产交互而Polkadot则宣称提供任意类型的跨链交互,具体实现还有待观察。CosmosCosmos网络是一个多链混合的区块链网格结构,如下图所示,该网络中主要包括两种角色:Hub: 用于处理跨链交互的中继链;Zone: Cosmos中的平行链, Cosmos中平行链需要具备两个前提条件: 1. 快速确定性(fast finality), 这个特性由共识算法保障,也就是说Cosmos的跨链不直接支持PoW等概率确定模型的区块链; 2. 强监管性(Sovereignty):每个平行链都具有一组验证者能够决定其出块。 为了支持平行链之间的跨链互操作,Cosmos提出了一种跨链交互协议IBC(Inter-Blockchain Communication protocol), 并利用tendermint共识算法的即时确定性实现多个异构链之间的价值和数据传输。首先我们以Chain A 到Chain B 转账10 token为例说明使用IBC的跨链交互: 1. 互相跟踪,也就是说如果A要和B进行跨链交易,那么A和B链需要分别运行相当于对方区块链的轻节点服务,这样互相可以实时接收到对方的区块头信息(方便后续执行类SPV验证); 2. A链上初始化IBC协议,冻结相关资产10 token, 并生成相应的证明发送给B区块链; 3. B链接收到相应的IBC消息,通过A链的区块头信息确定A确实进行相应的资产冻结,然后B链会生成等价值10 token的资产。以上是使用IBC协议的两个平行链直接进行跨链的基本过程,如果区块链很多,那么这种方式的两两跨链复杂度会呈现组合级别增加。因此Cosmos网络又引入了一种Hub的中继链,所有的平行链都通过IBC连接到Hub,让Hub辅助跨链交易的验证和转移,目前Cosmos实现了一个官方的Hub称为Cosmos Hub(如前图所示)。如下图所示是Cosmos 网络的详细架构图,Cosmos为方便平行链开发提供了基本服务CosmosSDK包括:共识、网络以及IBC协议等,这样基于Cosmos SDK开发的子链之间都能够方便地互相交互。此外对于非Cosmos SDK 开发的区块链需要使用Peg Zone进行桥接,如图中的Ethereum。笔者认为Cosmos为跨链带来的最大贡献在于IBC协议的设计,IBC协议提供了一种通用的跨链协议标准。IBC的设计使得跨链交易可以在多个Hub之间进行安全路由和转发,类似目前互联网的TCP/IP 协议。但是遗憾的是目前的Cosmos设计也只能够支持资产的跨链,而且由于不同区块链的业务不同其共识速率的不一致也会影响跨链交易有效性的证明。PolkadotPolkadot也是一种集成平行链和中继链的多层多链架构,Polkadot区块链的整体架构图如下图所示,主要包含三种角色链和四种参与方:三种链角色:中继链(Relay chain): 中继链位于Polkadot的体系的核心地位,主要是为整个系统提供统一的共识和安全性保障;平行链(Parachain): 在Polkadot中平行链负责具体的业务场景,平行链自身不具备区块的共识,它们将共识的职责渡让给了中继链,所有平行链共享来自中继链的安全保障,中继链是Polkadot组成的一部分;桥接链:桥接链指的是非Polkadot体系之外的区块链,如Bitcoin, Ethereum, 这些区块链有自身的共识算法,它们通过不同的Bridge与Polkadot连接在一起进行跨链交互。四种参与方:验证者(Validator): 验证者负责Polkadot的网络出块,会运行一个中继链的客户端,在每一轮区块产生中会对其提名的平行链出的块进行核验。当平行链的跨都被他们的子验证者集合确定好之后,验证者们会将所有平行链区块头组装到中继链的区块并进行共识。核验人(Collator): 帮助验证者收集、验证和提交备选平行链区块,维护了一个平行链的全节点。钓鱼人(Fisherman):钓鱼人主要靠检举非法交易或者区块以获取收益;提名人(Nominator): 拥有stake的相关方,维护和负责验证者的安全性。Polkadot的特性包括两个,一个是共享安全性,一个是不需信任的跨链交互。这里的不需信任的跨链交互其实是和第一个特点共享安全性密切相关的,而且Polkadot的不需信任的跨链交互也主要是只其内部的平行链之间。在Polkadot中如果parachain A 需要发送一笔交易到parachain B的过程如下:A链将跨链交易放到自己的engress(每个平行链有一个消息输出队列engress 和一个消息输入队列ingress);A链的Collator收集A链的普通交易以及跨链交易并提交给A链的验证者集合;A链的验证者集合验证成功,将本次A链的区块头信息以及A链的engress内信息提交到中继链上;中继链运行共识算法进行区块确认以及跨链交易路由,中继链上的验证者会将A链的相应交易从A链的engress queue中移动到B链的ingress queue中。B链执行区块,将ingress queue中相应交易执行并修改自身账本。以上便是Polkadot跨链交易的主要步骤,由于所有平行链的共识同步发生(中继链区块示意图如下),因此跨链交易不会有诸如双花等安全性问题。Polkadot 的平行链之间的跨链交换的安全性保障主要来自共享安全性这个特点,共享安全性使得跨链交易和普通交易同步发生也就不存在其他跨链场景中的双花等跨链数据不一致问题。其次Polkadot中的引入的特殊状态验证方法方便中继链进行跨链等消息的有效性验证。值得一提的是Polkadot项目目前还处在项目初期,对于parachain的设计、Collator的协作以及Validator的共识、工作效率等都未完善。这种共享安全性的方式是否也限制了平行链自身的性能都还有待考证。关于跨链技术的几点思考综合以上的一些主流跨链场景和方案的分析,从跨链的概念以及需求上看跨链的本质其实就是 如何将A链上的消息M安全可信地转移到B链并在B链上产生预期效果。那么一个成功的跨链交互到底需要解决哪些问题呢?笔者认为主要有以下四个问题:消息M的真实性证明,也就是说M是否确实是存在A链上的,也确实是A链发给B链的;消息M的路由,如何让跨链消息安全跨系统路由;消息M的有效性证明,这里的有效性是指来自A链的消息M如何让B链认可其抵达B链时状态仍然有效,比如转移的资产是否是冻结的,没有双花的,如果是状态那么是否在此期间未发生改变等;消息M的执行结果证明,这个是指A链需要确认跨链操作是否成功,以及成功操作的相应回执。那么针对这些关键本质问题,如何去处理呢?笔者设想未来的区块链应该在底层平台的设计之初就需要遵循统一的跨链协议标准,就像现在的操作系统对TCP/IP协议的支持一样。需要进行通用跨链的区块链至少要支持一下功能:提供跨链消息的输入和输出口径,例如Cosmos和Polkadot的跨链队列;提供跨链消息的真实性证明,区块链需要提供类似SPV的证明手段;消息的有效路由需要构建跨链消息的统一格式,定义好消息的来源和去处以及消息内容,如Cosmos的IBC协议;消息的有效性证明,区块链可能需要设计新的类似UTXO的可验证存储结构,方便做类SPV类验证,否则目前的基于KV的数据存储方式做有效性证明几乎不可能;跨链执行结果证明,和有效性证明类似,需要全新的数据结构和运行算法支持。除此之外,跨链系统的设计还需要考虑系统稳定性、可扩展性以及易升级性、容错等等,总而言之,真正的可信互联网建设艰辛蛮长,诸君共勉!本文经作者授权转自BITKING深入浅出区块链 - 系统学习区块链,打造最好的区块链技术博客。????本文原文链接 ...

March 26, 2019 · 1 min · jiezi

分享一个网友第一次开发EOS区块链总结的经验

在处理项目时,用Java Connector for EOS区块链编写:创建钱包创建帐户创建交易创建签名交易在帐户之间转移代币我遇到了各种和运行本地EOS节点需要遵循的基本步骤。这个小指南纯粹是为了帮助你启动和运行自己的EOS节点。几天的内容和图片汇编了我的阅读和理解。本指南不解释什么是区块链,这是特定的,以尽快开始使用EOS并减少麻烦。纯粹基于经验。EOS区块链概述EOSIO附带了许多程序。你将使用的主要部分以及此处涉及的部分是:nodeos(node + eos = nodeos) ,可以使用插件配置以运行节点的核心EOSIO节点守护程序。示例用法是块生产,专用API端点和本地开发。cleos(cli + eos = cleos) ,命令行界面,用于与区块链交互并管理钱包。keosd(key + eos = keosd) ,将EOSIO密钥安全存储在钱包中的组件。eosio-cpp(eosio.cdt的一部分) ,它将C ++代码编译为WASM并可以生成ABI(CDT是合约开发工具链)。这些组件之间的基本关系如下图所示。最新堆栈版本(截至本文编写日)nodeos:1.5.0cleos:1.5.0keosd:1.5.0eosio.cdt:1.4.1eosio.contracts:1.4.0安装本地节点有几种方法可以做到:1.使用Docker,快速简便。2.使用二进制文件,它也行。使用Docker安装You create 2 containers. One for ’nodeos’ and another for ‘keosd’#Pull latest docker image of EOSdocker pull eosio/eos-dev#Create local networkdocker network create eosdev#Start nodeos(Core Daemon)docker run –name nodeos -d -p 8888:8888 –network eosdev -v /tmp/eosio/work:/work -v /tmp/eosio/data:/mnt/dev/data -v /tmp/eosio/config:/mnt/dev/config eosio/eos-dev /bin/bash -c “nodeos -e -p eosio –plugin eosio::producer_plugin --plugin eosio::history_plugin –plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin –plugin eosio::http_plugin -d /mnt/dev/data –config-dir /mnt/dev/config –http-server-address=0.0.0.0:8888 --access-control-allow-origin=* –contracts-console –http-validate-host=false”###### NOTES about above Command- Creating a docker container running ’nodeos’ daemon- Exposing port 8888 so that you can access the ’nodeos’ using RPC and HTTP- Mounting few directories on your local machine so that you don’t have to login into container- Few plugins which will allow this node to become a producer, expose rpc api over http, exposing command line interface to run ’nodeos’ commands#Run keosd(Wallet and Keystore)docker run -d –name keosd –network=eosdev -i eosio/eos-dev /bin/bash -c “keosd –http-server-address=0.0.0.0:9876”#Check installationdocker logs –tail 10 nodeosand you will see something like:info 2018-12-04T15:01:22.003 thread-0 producer_plugin.cpp:1494 produce_block ] Produced block 00005ce7fabcbcf8… #23783 @ 2018-12-04T15:01:22.000 signed by eosio [trxs: 0, lib: 23782, confirmed: 0]info 2018-12-04T15:01:22.507 thread-0 producer_plugin.cpp:1494 produce_block ] Produced block 00005ce84867bcbf… #23784 @ 2018-12-04T15:01:22.500 signed by eosio [trxs: 0, lib: 23783, confirmed: 0]info 2018-12-04T15:01:23.005 thread-0 producer_plugin.cpp:1494 produce_block ] Produced block 00005ce936ca4869… #23785 @ 2018-12-04T15:01:23.000 signed by eosio [trxs: 0, lib: 23784, confirmed: 0]i#Check Wallets (Open bash for keosd)docker exec -it keosd bashand once in the container, on bash, execute this:cleos –wallet-url http://127.0.0.1:9876 wallet list keysShould show empty wallets:Wallets: []#Check ’nodeos’ end points - run this out side containerscurl http://localhost:8888/v1/chain/get_info{ “server_version”:“549c96cd”, “chain_id”:“cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f”, “head_block_num”:24182, “last_irreversible_block_num”:24181, “last_irreversible_block_id”:“00005e751a1e31b15acd25ffc8725cb2c67926647edb89e726e386716afdef5d”, “head_block_id”:“00005e76fd035dbf694d2a575bb1849f436428b466fd95323e43619b73bf7b9d”, “head_block_time”:“2018-12-04T15:04:41.500”, “head_block_producer”:“eosio”, “virtual_block_cpu_limit”:200000000, “virtual_block_net_limit”:1048576000, “block_cpu_limit”:199900, “block_net_limit”:1048576, “server_version_string”:“v1.5.0-rc2”}#Alias cleos so that you can access it by simply ‘cleos’docker network inspect eosdevcheck for keosd IP address in the response of above command and execute the following:alias cleos=‘docker exec -it nodeos /opt/eosio/bin/cleos –url http://127.0.0.1:8888 –wallet-url http://172.18.0.3:9876’使用二进制文件安装 - MAC指令#Step 1: Install binariesbrew tap eosio/eosiobrew install eosio#Step 2: Setup a development directory, stick to it.mkdir contractscd contracts#Step 3: Install CDT. The EOSIO Contract Development Toolkit, CDT for shortbrew tap eosio/eosio.cdtbrew install eosio.cdt#Boot Node and Wallet #Start keosd: keosd & #Start nodeos: nodeos -e -p eosio --plugin eosio::producer_plugin –plugin eosio::chain_api_plugin –plugin eosio::http_plugin –plugin eosio::history_plugin –plugin eosio::history_api_plugin -d /Users/vijay/eos_blockchain/contracts/eosio/data --config-dir /Users/vijay/eos_blockchain/contracts/eosio/config '–access-control-allow-origin=’ –contracts-console –http-validate-host=false ‘–filter-on=’ >> nodeos.log 2>&1 & #Check installation (in current directory) tail -f nodeos.log #Check the wallet cleos wallet list #Check nodeos endpoints curl http://localhost:8888/v1/chain/get_info上述步骤之一将帮助你设置和运行本地节点。使用钱包,帐户和密钥现在你准备好在区块链上做一些事情。在EOS中,你必须拥有一个帐户才能执行任何操作,例如创建token,发送token,接收token,编写交易等。此节点将有一个名为eosio的系统用户,因此你可以使用此用户来玩eos区块链。因此,在本节中,我们将在本地节点上执行以下操作:创建一个新钱包。创建新密钥(私人+公共)。将这些钥匙导入钱包。建立新帐户。让我们运行一些命令并观察你所看到的。只需阅读所有命令的注释,即可了解它们的作用。#List existing wallets. Wallet stores keyscleos wallet list#List wallet keys if anycleos wallet list key#you should see all empty response#create wallet nowcleos wallet createCreating wallet: default"PW5JYR5u7WTk6RaJARE41qb3Wy6BJtcKCjpDAyjR2uV3CWF8nDFe7"this will create wallet with name ‘default’. Keep note of password it returns.#Create new keyscleos create key –to-consolePrivate key: 5JseP8pEsJfAEWix5U6ow77TrKu2uuBhjfobyzgYyCYAtnxnCk8Public key: EOS4tmc8ufENZNkFQaj8ZfV9UfeRLnyaCecybSgPS1U8671BNdSxD#Import the private keys in wallet cleos wallet import -n quant –private-key 5JseP8pEsJfAEWix5U6ow77TrKu2uuBhjfobyzgYyCYAtnxnCk8#### MOST IMPORTANT STEP ####Import genesis ’eosio’ account keys in the wallet so that eosio account is available for creating new accounts.Private key of eosio: 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3在这个阶段,你已准备好带有eosio(创世纪帐户)的钱包和导入的新密钥。所以我们现在准备好做更多的操作了。我们将在下一节中执行以下操作:部署token合约,以便区块链准备好创建新的token。创建新token。将新token分配给创世帐户(eosio)。在用户之间转移token。检查余额等。#Deploy Token Contacts create an account first with the name ’eosio.token’ for the contractcleos create account <owner> <newaccountname> <pubkey1> <pubkey2>cleos create account eosio eosio.token EOS5ySgzeHp9G7TqNDGpyzaCtahAeRcTvPRPJbFey5CmySL3vKYgE EOS5ySgzeHp9G7TqNDGpyzaCtahAeRcTvPRPJbFey5CmySL3vKYgEyou would see something like this:executed transaction: 4a8b53ae6fa5e22ded33b50079e45550e39f3cb72ffa628e771ea21758844039 200 bytes 339 us # eosio <= eosio::newaccount {“creator”:“eosio”,“name”:“eosio.token”,“owner”:{“threshold”:1,“keys”:[{“key”:“EOS5ySgzeHp9G7TqNDGpy…Deploy contract now:cleos set contract eosio.token <path-to-contracts-directory>/contracts/eosio.token -p eosio.tokenyou would see something like this:Reading WAST/WASM from /opt/eosio/bin/data-dir/contracts/eosio.token/eosio.token.wasm… Using already assembled WASM… Publishing contract… executed transaction: 41677b5fd5c701ca67a153abb09f79c04085cc51a9d021436e7ee5afda1781bd 8048 bytes 1212 us # eosio <= eosio::setcode {“account”:“eosio.token”,“vmtype”:0,“vmversion”:0,“code”:“0061736d01000000017f1560037f7e7f0060057f7e… # eosio <= eosio::setabi {“account”:“eosio.token”,“abi”:“0e656f73696f3a3a6162692f312e30010c6163636f756e745f6e616d65046e616d65…#Create new Tokencleos push action eosio.token create ‘[“eosio”, “10000000000.0000 EOS”,0,0,0]’ -p eosio.tokenyou would see like this:executed transaction: 566693cba0b0d5d11d85e40cdfb095d525612c5915e17ce75d309054e1912235 120 bytes 552 us # eosio.token <= eosio.token::create {“issuer”:“eosio”,“maximum_supply”:“10000000000.0000 EOS”}#Send newly created Tokens (EOS) to genesis account (eosio)cleos push action eosio.token issue ‘[“eosio”,“1000000000.0000 EOS”, “issue”]’ -p eosioyou would see something like this:executed transaction: 73f72879d220c720fcefb16b6aaf3db0ba492bd62020853b2cd5051557d5fa87 128 bytes 677 us # eosio.token <= eosio.token::issue {“to”:“eosio”,“quantity”:“1000000000.0000 EOS”,“memo”:“issue”}#Check above transactions if they are completedcleos get transaction 73f72879d220c720fcefb16b6aaf3db0ba492bd62020853b2cd5051557d5fa87andcleos get transaction 566693cba0b0d5d11d85e40cdfb095d525612c5915e17ce75d309054e1912235you should have long JSON response. It simply means above steps are successful.#Check balance now of eosio accountcleos get currency balance eosio.token eosioyou would see:1000000000.0000 EOS你去了,现在你已经创建了token,eosio帐户有很多EOS token,他现在可以轻松地将资金发送到其他帐户。#Create a new accountcleos create account eosio user1 <public_key_of_user1> <public_key_of_user1>#Check if account is created. You should have json responsecleos get account user1#Send money to user1 accountcleos transfer eosio user1 “1000.00 EOS”#Check the balance of user1cleos get currency balance eosio.token vijay1仅此而已!分享两个EOS区块链相关的交互式在线编程实战教程:EOS入门教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。深入浅出玩转EOS钱包开发,本课程以手机EOS钱包的完整开发过程为主线,深入学习EOS区块链应用开发,课程内容即涵盖账户、计算资源、智能合约、动作与交易等EOS区块链的核心概念,同时也讲解如何使用eosjs和eosjs-ecc开发包访问EOS区块链,以及如何在React前端应用中集成对EOS区块链的支持。课程内容深入浅出,非常适合前端工程师深入学习EOS区块链应用开发。汇智网原创翻译,转载请标明出处。这里是网友第一次开发EOS区块链的经验 ...

March 19, 2019 · 4 min · jiezi

如何开发一款以太坊(安卓)钱包系列1 - 通过助记词创建账号

上周我开源了一款钱包,反映很好,一周时间不到已经快到100 Star。接下来我会几篇系列文章把开发以太坊钱包的核心要点写出来,也算是对代码的一个解读。写在前面钱包是使用Android安卓平台编写,使用的是原生代码Java 语言编写, 是基于Java 1.8 版本,也使用了Java 1.8 中一些较新的语言特性,如 Lambda表达式等;另外还较多使用了ReactiveX/RxAndroid响应式编程用法。在本系列文章中,重点是介绍以太坊钱包账号、交易等逻辑,有时可能会假定读者已经了解Android开发等相关知识,因为这些内容不是文章的重点,因此不会过多介绍,请海涵。钱包包含的功能通常一个钱包会包含以下功能:[x] 支持通过生成助记词、Keystore文件、私钥 创建钱包账号。[x] 支持导出钱包账号助记词、私钥、Keystore文件。[x] 支持多个钱包账号管理[x] 账户余额查询及转账功能(二维码扫描支持)。[x] 支持ERC20 代币(余额显示、转账、代币币价显示)[x] 支持用法币(美元和人民币)实时显示币价。[x] 历史交易列表显示创建账号预备知识我们先来介绍第一个功能:通过生成助记词、Keystore文件、私钥创建钱包账号。本系列中,钱包都是指分层确定性钱包,(HD钱包 Hierarchical Deterministic Wallets), 之前博客有一篇文章分层钱包进行了详细的介绍,还不熟悉的可以读一下。为了保持本文的完整,这里做一个总结性回顾:以太坊及比特币的地址是由随机生成的私钥经过椭圆曲线等算法单向推倒而来 ,BIP32及BIP44是为方便管理私钥提出的分层推倒方案,BIP39 定义助记词让分层种子的备份更方便。而KeyStore文件是用来解密以太坊保存私钥的一种方式,大家可以阅读下这篇文章: 账号Keystore文件导入导出了解更多。实现完成的,界面如下图:这是一张导入钱包账号的截图(导入和创建,其实原理一样),界面仿照ImToken,不过本文将不会介绍UI部分的编写。Web3j & bitcoinj为了完成创建账号功能,我们需要使用到两个库:Web3j 和 bitcoinjWeb3是一套和以太坊通信的封装库,Web3j是Java版本的实现,例如发起交易和智能合约进行交互,下图很好的表达了其作用。不过本文中的功能,主要是使用了web3j中椭圆曲线加密及KeyStore文件的生成与解密。bitcoinj 的功能和web3类似,它是比特币协议的Java实现,他实现了 BIP32、BIP44及BIP39 相关协议。Android使用Gradle来构建,直接在app/build.gradle文件中加入:implementation ‘org.web3j:core:4.1.0-android’implementation ‘org.bitcoinj:bitcoinj-core:0.14.7’提示: 实践中遇到的一个问题,由于bitcoinj 中引入了 com.lambdaworks:scrypt加密库, 它包含的lib/x86_64/darwin/libscrypt.dylib文件,会导致在进行Android App Bundle 编译时会出现错误(好像也会导致某些机型没法安装),解决办法是在 build.gradle 加入一下语句,把这个文件在打包时排除掉。packagingOptions {exclude ’lib/x86_64/darwin/libscrypt.dylib’}创建账号实现通过助记词常见钱包账号这是目前钱包客户端,最常见的一种为用户常见账号的方式,这里会包含一下几个核心步骤:生成一个随机数种子;通过随机数种子得到助记词;通过 种子 + 路径 派生生成私钥;使用KeyStore保存私钥;私钥推倒出账号地址。大家可以在再次阅读分层钱包,理解为何这么做的原因。理解了上面几点,那么代码就容易明白了,代码在代码库中的app/src/pro/upchain/wallet/utils/ETHWalletUtils.java中,关键代码逻辑如下: // 创建钱包对象入口函数 public static ETHWallet generateMnemonic(String walletName, String pwd) { String[] pathArray = “m/44’/60’/0’/0/0”.split("/"); long creationTimeSeconds = System.currentTimeMillis() / 1000; SecureRandom secureRandom = SecureRandomUtils.secureRandom(); DeterministicSeed ds = new DeterministicSeed(secureRandom, 128, “”, creationTimeSeconds); return generateWalletByMnemonic(walletName, ds, pathArray, pwd); } /** * @param walletName 钱包名称 * @param ds 助记词加密种子 * @param pathArray 助记词标准 * @param pwd 密码 * @return */ @Nullable public static ETHWallet generateWalletByMnemonic(String walletName, DeterministicSeed ds, String[] pathArray, String pwd) { //种子 byte[] seedBytes = ds.getSeedBytes(); //助记词 List<String> mnemonic = ds.getMnemonicCode(); if (seedBytes == null) return null; // 衍生推倒key DeterministicKey dkKey = HDKeyDerivation.createMasterPrivateKey(seedBytes); for (int i = 1; i < pathArray.length; i++) { ChildNumber childNumber; if (pathArray[i].endsWith("’")) { int number = Integer.parseInt(pathArray[i].substring(0, pathArray[i].length() - 1)); childNumber = new ChildNumber(number, true); } else { int number = Integer.parseInt(pathArray[i]); childNumber = new ChildNumber(number, false); } dkKey = HDKeyDerivation.deriveChildKey(dkKey, childNumber); } ECKeyPair keyPair = ECKeyPair.create(dkKey.getPrivKeyBytes()); ETHWallet ethWallet = generateWallet(walletName, pwd, keyPair); if (ethWallet != null) { ethWallet.setMnemonic(convertMnemonicList(mnemonic)); } return ethWallet; } @Nullable private static ETHWallet generateWallet(String walletName, String pwd, ECKeyPair ecKeyPair) { WalletFile keyStoreFile; try { keyStoreFile = Wallet.create(pwd, ecKeyPair, 1024, 1); // WalletUtils. .generateNewWalletFile(); } catch (Exception e) { e.printStackTrace(); return null; } BigInteger publicKey = ecKeyPair.getPublicKey(); String s = publicKey.toString(); String wallet_dir = AppFilePath.Wallet_DIR; String keystorePath = “keystore_” + walletName + “.json”; File destination = new File(wallet_dir, “keystore_” + walletName + “.json”); //目录不存在则创建目录,创建不了则报错 if (!createParentDir(destination)) { return null; } try { objectMapper.writeValue(destination, keyStoreFile); } catch (IOException e) { e.printStackTrace(); return null; } ETHWallet ethWallet = new ETHWallet(); ethWallet.setName(walletName); ethWallet.setAddress(Keys.toChecksumAddress(keyStoreFile.getAddress())); ethWallet.setKeystorePath(destination.getAbsolutePath()); ethWallet.setPassword(Md5Utils.md5(pwd)); return ethWallet; }上述代码中,generateMnemonic()是入口函数,最终返回的是一个ETHWallet 自定义的钱包实体类,一个实例就对应一个钱包,ETHWallet保存了钱包相关的属性,后面会详细介绍,如果对它序列化保存钱包账号及多个钱包账号管理。几个注意事项关于助记词及私钥的保存,有几点要特别注意,否则有可能和其他钱包无法兼容或导致私钥泄漏。这部分作为订阅者福利,发表在我的小专栏,趁还未涨价,赶紧订阅吧,超值的!参考文档web3j API 文档bitcoinj 介绍及文档 加入知识星球,和一群优秀的区块链从业者一起学习。深入浅出区块链 - 系统学习区块链,打造最好的区块链技术博客。<!–几个注意事项创建钱包输入的密码,并不是用于生成种子,而是用来做keystore 加密的密码,这是业内的一个常规做法,尽管这个做法会降低一些安全性,但是不遵循行规,会导致和其他的钱包不兼容,及在其他钱包的助记词不能导入到我们钱包,或反之。keystore 文件应该存储在内部存储沙盒类,即应用程序自身目录内,保证其他程序无法读取内容,万万不可存取在外部存储中,如SD卡。商业产品,应该检查手机时候root,如果root,则第2点的安全性无法保证。–> ...

March 17, 2019 · 2 min · jiezi

Nervos 双周报第 5 期:CKB 经济模型提案如约而至

3 月9 日凌晨 Nervos 联合创始人及研究员 Kevin Wang 在 GitHub 上提交了 CKB 经济模型提案《Crypto-Economics for the Nervos Common Knowledge Base》,期待很久的经济模型终于提案了!就在公众号发布这条消息的第一时间,社区伙伴 stwith 在 Nervos Talk 发起话题讨论《Nervos CKB 经济模型提案正式发布 来谈谈你的看法吧》,5 个小时后,一位名叫 Eraser 的伙伴发出了一篇解读文章:《 Nervos CKB经济体系真的很有趣 》。Nervos CKB 经济模型从提案到今天,我们的 talk 论坛和活动答疑群的讨论此起彼伏,我们听到了很多有意思想法。希望未来我们能够和大家一起去完善提案内容,与 Nervos 共同成长。Nervos CKB 经济模型提案之外,我们还有好多进展要告诉大家:Nervos 社区动态美国社区Nervos 架构师 Jan 参加了「MIT Bitcoin Club」Meetup,之后我们会将本场活动内容整理成文稿分享给大家。在纽约和波士顿举办的「Nervos Deep Dive」, Jan 和 Kevin 分别向大家讲解《CKB-The Layer 1 Blockchain》和《Crypto-Economics for the Nervos Common Knowledge Base》。张韧的论文被顶级安全会议 IEEE S&P 接收!这是安全顶会上第一篇来自中国大陆区块链团队的论文,来自 Nervos 研究员张韧发表的《Lay Down the Common Metrics: Evaluating Proof-of-Work Consensus Protocols’ Security》。具体论文内容及更多了解,可点击:https://talk.nervos.org/t/ner…韩国社区线上 AMA2 月 28 日晚 8 点,Nervos 首席宣传员 Daniel 在 Nervos 韩国社区进行了在线 AMA,韩国社区伙伴们竟然连续提出了 30 多个问题,包括 Nervos Network 的分层设计架构的特点和实现方式,Nervos 的项目目标,治理思路,对多种语言的兼容性和 DApp 的友好性,以及对生态建设所做的努力和未来规划等等。感谢韩国小伙伴的热情,期待后续更多更深入的交流。韩国社区小伙伴已整理出 AMA 内容:“레이어 아키텍처의 적합한 플랫폼” — AMA 하이라이트 │Daniel Lv, COO from NERVOS Foundation(널보스 파운데이션)社区受邀参加活动Nervos 社区运营 Ryan 在金色财经主办的「以太坊生态」沙龙活动上,针对以太坊状态问题和公链经济模型设计做了主题分享Nervos 社区运营 Henry& Ryan 出席一块链习主办的《区块链技术公开课 100 讲》线上课程,分别就《从以太坊状态问题看底层公链经济体系设计》和《找寻可以长久运转的加密经济模型之路》的话题做了分享2019 Dev Meetup No.12019 年的第一场 Dev Meetup 上,Nervos 社区运营 Henry & Ryan 就加密经济模型做了结构分析, AMA 环节参与者提出的问题都非常棒。我们已将内容收录整理,请查收:https://mp.weixin.qq.com/s/vc…Fork It 更新《一起来聊一聊 ETC 51% 攻击》,这一期已经发布很久,我们终于整理出文字稿供大家方便阅读,边讲故事边带大家了解 PoW 区块链的安全性。《张韧全面解析 MimbleWimble》,之前就提到过这是一期内容很硬核,这篇文章经过多次校对和讨论,终于定稿!Peter 老师的周四分享程序员中的专业区块链讲解员 Peter 老师每周四晚的千聊直播分享,最近一期内容是《比特币白皮书图解》的第三部分内容:深入 POW 共识机制的底层,聊聊工作量证明在共识投票中扮演的角色,以及 POW 共识抗攻击能力的数学推理过程。感兴趣的伙伴可以关注直播间「Crypto Camp」回听。Nervos CKB 开发动态 Nervos CKB 经济模型提案发布CKB v0.7.0 已冻结为了更好的文档支持,此版本将配置文件格式切换为 TOMLCKB 将统一使用blake2b作为哈希算法P2P 和 CFB 的集成已准备就绪工具链方面的进展实现追踪和 RPC 网络模式Blake2b 替换 SHA3JavaScript SDK 发布 v0.0.1-alpha.3更多更详细的更新,可以查看: Nervos CKB Development Update #6Nervos 的粉丝们近期好玩的推荐Nervos 周边计划正在进行中…….我们从李童小哥哥最新设计的 10 余款 T 恤中甄选出了 5 款 ,也欢迎大家来投票给你喜欢的设计款:https://talk.nervos.org/t/201…平时关注论文比较多的伙伴,推荐一篇科普贴《如何评价区块链论文》Nervos 活动预告3 月 14 日,「 Taipei Nervos CKB Dev Meetup」 ,Nervos 架构师 Jan 和 CKB-VM 开发者肖雪洁分别分享《CKB -The Layer 1 Blockchain》和《Re-design a New Blockchain VM from scratch CKB-VM》3 月 16 日,「Taipei Nervos Meetup」,Nervos 架构师 Jan、Neuron 钱包架构师 Ash 和 Nervos 首席宣传员 Daniel 的分享主题分别为:《CKB - The Layer 1 Blockchain 》、《下一代加密货币钱包》、《加密经济模型解构与未来方向》。感谢台北社区的全力支持,再推一篇台北小伙伴的文章:https://www.blocktempo.com/ne… ,如果你在台北请联系我们面基!3 月 16 日在旧金山, Nervos 白皮书解读活动将继续进行「White Paper Book Club - Blockchain project mapping」关注我们Nervos 官网: https://www.nervos.org Nervos 论坛: https://talk.nervos.org Community blogs: https://medium.com/nervosnetwork Twitter: https://twitter.com/nervosnetwork Reddit: https://www.reddit.com/r/NervosNetwork Telegram: http://t.me/nervosnetwork Github: https://github.com/nervosnetwork 这是 Nervos 双周报的第 5 期,感谢阅读!如有任何建议或者想法,欢迎讨论哦!原文来自 Nervos talk 论坛:https://talk.nervos.org/t/ner… ...

March 14, 2019 · 2 min · jiezi

超级账本-如何贡献

原文地址:https://www.xuanzhangjiong.to…作者:TopJohn超级账本-如何贡献个人感受,文档看的再多,学习的速度也不如参与到项目中去,深入了解实现原理和设计的初衷。文档只能让我们对Fabric的整体运行机制有一个宏观的认识,要进一步深入,就需要从源代码入手,而贡献代码则是一个自然而然的事情,学习的过程中总会发现一些问题和值得优化的地方。所以前阵子顺手翻译了一下Fabric如何贡献相关的官方文档。这篇文章讲解,其中的整体流程和所需用到的工具。如需详细学习,请参考官方文档:官方文档原版官方文档中文版下面是我个人的官方文档中文版本翻译的GitHub仓库,欢迎大家star:https://github.com/TopJohn/fa…同时我会将已经完成的部分同步发Pull Request到hyperledger-labs组织下的fabric-docs-cn仓库中:https://github.com/hyperledge…有兴趣的朋友也可以一起参与超级账本国际化相关的工作中来。贡献的方法不管作为普通用户还是开发者,这里都有很多为Hyperledger Fabric做贡献的方法。作为普通用户:提出功能-改进建议反馈错误帮助测试在release roadmap上即将发布的史诗。将问题通过Jira或者RocketChat反馈给开发者。作为开发者:如果你的时间不多,可以考虑选择一些想要帮助的任务,参考修复问题和认领正在进行的任务 。如果你可以全职开发,可以提一个新的特性(参考提出功能-改进建议)带领一个团队来实现它,或者加入在已经存在的史诗中的团队。如果你在release roadmap发现了一个你感兴趣的史诗,请及时通过Jira或者RocketChat联系分配到任务的人,和他们一起完成这个史诗。获取一个Linux Foundation的账号为了参与到Hyperledger Fabric项目的开发中来,你首先需要一个Linux Foundation账号。你需要使用你的LF ID来访问所有的Hyperledger社区的工具,包括 Gerrit,Jira,RocketChat,和Wiki (仅用于编辑)。项目管理正如我们的章程中描述的那样,Hyperledger Fabric是在一个开放治理的模型下管理的。项目和子项目由一系列维护者主导。一个新的子项目可以指定一些初始的维护者,当项目第一次被批准的时候,由顶级项目的现有维护者所批准。维护者Fabric项目由项目的顶级维护者领导。维护者负责评审和合并提交评审的所有布丁,并在超级账本技术委员会的方针下指导项目的技术发展路线。成为一名维护者项目的维护者会时不时地考虑添加或者删除维护者。现有的维护者可以提交变更到MAINTAINERS.rst文件中。一个提名的维护者可以由大多数现有的维护者批准通过成为正式的维护者。一旦批准通过,变更就会被合并同时个体就会在维护者的组中被添加(或者移除)。维护者可能会因为明确的辞职、长时间的不活动(超过3个月或者更长的时间),或者因为违反相关的行为准则或则持续表现出糟糕的判断而被移出维护者的队列。发布节奏Fabric的维护者已经确定了每个季度大致的发布节奏(请参考 releases。我们也在积极考虑采用LTS(long term support)的发布过程,虽然这些细节需要由具体的维护者决定。相关细节请参考在Chat的#fabric-maintainers中的讨论。提出功能-改进建议首先,请回顾一下JIRA确保之前没有已经开启或者关闭的相同功能的提案。如果没有,为了开启一个提案,我们建议创建一个Jira的Epic或者Story,选择一个最合适的环境,并附上一个链接或者内嵌一个提案的页面,说明这个特性是做什么的,如果可能的话,描述一下它应该如何实现。这有助于说明为什么应该添加这个特性,例如确定需要该特性的特定用例,以及如果实现该特性的好处。一旦Jira的issue被创建了,并且描述中添加了附加的或者内嵌的页面或者一个公开的可访问的文档链接,就可以向 fabric@lists.hyperledger.org 邮件列表发送介绍性的电子邮件,邮件中附上Jira issue的链接,并等待反馈。对建议性的特性的讨论应该在JIRA issue本身中进行,这样我们就可以在社区中有一个统一的方式来找到这个设计的讨论。获得3个或者更多的维护者对新特性的支持将会大大提高该特性相关的变更申请被合并到下一次发布的可能性。维护者会议维护者会在每隔一周的周三的东部时间9点举行双周会议在 Zoom上。请参考community calendar获取具体信息。维护者的会议的目的是为了计划以及审查发布的进度,同时讨论项目或者子项目的技术以及操作方向上的事宜。如上所述的新特性/增强建议应该在维护者的会议上进行探讨,反馈和接受。发布路线Fabric相关的发布路线的史诗维护在JIRA上。交流我们使用 RocketChat来进行交流或者实用 Google Hangouts™ 进行屏幕分享。我们的开发计划和优先级在JIRA上进行发布,同时我们也花大量的时间在mailing list上进行讨论才做决定。贡献指南安装前置条件在我们开始之前,如果你还没有这样做那你可能需要检查一下您是否已经在将要开发区块链应用或者运行Hyperledger Fabric的平台上是否安装了运行所需的环境。获得帮助如果你试图寻找一种途径来寻找专家援助或者解决一些问题,我们的 社区总是会为您提供帮助的。我们在Chat,IRC(#hyperledger on freenode.net) 以及 mailing lists中都可以找到。我们大多数人都很乐意提供帮助。唯一愚蠢的是你不去问。问题实际上是帮助改进项目的很好的方法,因为它们使我们的文档更加清晰。反馈错误如果你是一个用户,并且发现了错误,请使用JIRA来提交问题。在您创建新的JIRA问题之前,请尝试搜索是否有人已经提过类似的问题,确保之前没有人报告过。如果之前有人报告过,那么你可以添加评论表明你也期望这个问题被修复。如果缺陷与安全相关,请遵循Hyperledger安全问题处理流程如果以前没有报告过,请创建一个新的JIRA。请尝试为其他人提供足够多的信息以重现该问题。该项目的维护人员应该在24小时之内回复您的问题。如果没有,请通过评论提出问题,并要求对其进行评审。您还可以在Hyperledger Chat中将问题发布到相关的相关的Hyperledger Fabric的频道中。比如,可以将一个文档问题在#fabric-documentation中进行广播,一个数据存储问题可以在#fabric-ledger中广播,以此类推。提交你的修复如果你在JIRA上提交了你刚刚发现的问题,并希望修复它,我们很乐意并且非常欢迎。请将JIRA问题分配给自己,然后您可以提交变更请求(CR)。如果你在提交第一个CR的时候需要帮助,我们已经为你创建了一个简短的教程。修复问题和认领正在进行的任务查看问题列表找到你感兴趣的内容。您也可以从求助 列表中寻找。明智的做法是从相对直接和可实现的任务开始,并且这个任务是未被分配的。如果没有分配给别人,,请将问题分配给自己。如果你无法在合理的时间内完成,请加以考虑并且取消认领,如果你需要更多的时间,请添加评论加以说明,你正在积极处理问题。审核提交的变更请求(CRs)另一种贡献和了解Hyperledger Fabric的方法是帮助维护人员审查开放的CR。实际上维护者是相对困难的,他们需要审查所有正在提交的CR并且评估他们是否应该被合并。您可以查看代码或则文档修改,测试更改的内容,并告知提交者和维护者您的想法。完成审核或测试后,只需要添加评论和投票,即可完成回复CR。评论“我在系统X上尝试过这个CR,是正确的”或者“我在系统X上运行这个CR发现了一些错误”将帮助维护者进行评估。因此,维护人员也能够更快地处理CR,并且每个人都能从中获益。浏览 Gerrit上开放的CRs开始你的贡献。设置开发环境接下来,在本地开发环境中构建项目,以确保所有配置都是正确的。什么是更好的变更请求?一次只包含一个变更。不是五个,3个,或者10个。仅仅一个变更。为什么呢?因为它变更的影响范围。如果我们有一轮回归,那么将更容易证明一次影响较广的组合提交将是一个罪魁祸首。在JIRA的故事中包含一个链接。为什么?因为 a) 我们希望追踪你的速度以便更好地判断我们可以传递什么信息。b) 因为我们可以证明这次变更是有效的。在很多情况下,会有很多讨论围绕提交的变更,我们希望将它链接到它的本身。每次变更都包含单元或者集成测试(或者对已有测试的修改)。这不仅仅意味着正确的测试。同样包括一些异常测试来捕获错误。在你写代码的时候,你有责任去测试它并且证明你的变更是正确的。为什么呢?因为没有这些,我们无法知道你的代码是否真的正确地工作。单元测试需要没有额外的依赖。你应该使用 go test 或者等价的语言的测试方式来运行单元测试。任何需要额外依赖的测试(例如需要用脚本来运行另一个组件)需要适当的mocking。任何除了单元测试以外的测试根据定义都是集成测试。为什么?因为很多开源软件开发者都实用测试驱动的开发方式。他们关注一个目录下的测试用例,一旦代码变更了他们采用测试去判断他们的代码是否正确。这是非常高效的,相比当代码变更后运行整个项目来说。请参考单元测试的定义在脑海中建立单元测试的标准,以此来写出高效的单元测试。每个CR的最小代码行数。为什么?因为维护者每天同样也有工作。如果你发送1000或者2000行的代码,你认为维护者需要多久才能审查完你的代码?保证你的变更在200-300行左右,尽可能地。如果你有一个比较大的变更,可以将它分解为比较小的几个无关的变更。如果要添加一组新功能来满足一个需求,请在测试中分别添加它们,然后编写满足需求的代码。当然,总会有以外。如果你增加一些小变动然后添加了300行测试,你将会被宽恕;-)如果你需要做一个变更,而且影响比较广或者生成了很多代码(protobufs等)。同样也是个例外。大的变更,例如那些大于300行的CR将更有可能收到-2,并且你可能被要求重构以符合本指南。不要堆叠你的变更请求(例如在先前的变更请求的本地分支提交你的变更)除非它们是相关联的。这将最大幅度减少合并冲突,并且更快地合并。如果你堆叠你的变更请求,由于前面的请求中的审核注释,你后续的请求将被搁置。写一个有意义的提交信息。包括55个或者更少字符的标题,后面跟一行空行,然后跟上更全面的关于变更的描述。每个变更必须包括对应的变更的JIRA标识号(例如[FAB-1234])。这个可以在标题中,但是同样需要包括在消息正文中。Gerrit会自动创建超级链接到JIRA的条目。例如 [FAB-1234] fix foobar() panic Fix [FAB-1234] added a check to ensure that when foobar(foo string) is called, that there is a non-empty string argument.最后,要有回应。不要让一个变更请求因为应为评审意见而不了了之,这样会导致它需要进行rebase。这只会进一步延迟合并,给你带来更多的工作-以修复合并冲突。法律材料注意: 每一个源文件必须包括Apache Software License 2.0。可以参考 license header。我们尽可能努力让贡献边等简单。这个协议为我们提供了贡献相关的法律相关的知识。我们使用和Linux® Kernel社区一样的管理贡献的方法Developer’s Certificate of Origin 1.1 (DCO)来管理Hyperledger Fabric。我们只要求在提交要审查的补丁时,开发者在commit消息中带上他们的sign-off签名即可。这里是一个Signed-off-by line的签名例子,指示了提交者接受DCO约定: Signed-off-by: John Doe <john.doe@example.com>你可以使用 git commit -s 在提交的时候来自动带上你的签名。相关的主题维护者使用Jira来了解当前的工作流项设置开发环境构建Hyperledger Fabric配置申请一个Linux Foundation账号使用Gerrit进行工作使用Gerrit进行审核查看待定的更改提交一个变更到Gerrit审查变更Gerrit 最佳实践编程指南生成 gRPC 代码添加或者更新Go第三方包总结如果需要查看上述相关的文档,我也已经为大家做了翻译,需要详细查看每个细节的朋友可以查看中文文档,或者点击我博客右侧的ARCHIEVEMENT之Fabric官方文档中文版。 ...

March 13, 2019 · 1 min · jiezi

BUTXO详解

在比原链中,每个交易消耗之前交易生成的BUTXO 然后生成新的 BUTXO,账户的余额即所有属于该地址的未花费 BUTXO 集合,BTM 的全局状态即当前所有未花费的BUTXO 集合。我们用一个具体的例子说明。比原的状态是通过BUTXO来实现的。比原的价值转移是通过转账实现的。更特别地是,我们可以通过创建转账花费1个或多个,并且将他们的BUTXO作为转账输入。比原BUTXO不能部分花费。如果我们花费0.5个比原(使用他们仅有的BUTXO,价值1比原),他们需要特意地发回0.5个比原。如果他们不发送这部分,那么这个0.5比原就会丢失,并且给到挖出转账的矿工。过程如下图所示:比原链的BUTXO没有包含用户账户余额。通过比原,用户可以简单地持有私钥,在任何时间点都可以进行一个或者多个BUTXO。如下图:总结:BUTXO = 未花费的交易输出;传统的账户模型一个“账户”的余额就是一个数字;BUTXO模型中余额是由所有和“账户”相关的UTXO组成的;那可能有小伙伴好奇,比原链的BUTXO和UTXO模型有什么区别呢?BUTXO是比原链在UTXO的模型上柔和了支持多资产,从而保证了资产交互操作的原子性,异步交易的时候可以进行验证,支持多资产上链,智能合约结果bool化。由于BUTXO的无状态,所以在一定程度上增强了用户的匿名性。如下图:我们查看了比原的BUTXO结构体,发现比原的结构体中的多了AssetID,ControlProgram等字段。比原链中BUTXO的结构体如下:这是比原链专门为了多资产和智能合约而扩充的,目的是支持多种资产上链,以及智能合约bool化。所以比原链的BUTXO和UTXO的最大区别就是支持多种资产和柔和智能合约。跟UTXO模型比,这是比原链BUTXO的最大优势。此外,计算是在链外的,交易本身既是结果也是证明。节点只做验证即可,不需要对交易进行额外的计算,也没有额外的状态存储。交易本身的输出 的计算是在钱包完成的,这样交易的计算负担完全由钱包来承担,一定程度上减少了链的负担。BUTXO 模型是无状态的,更容易并发处理。所以比原链能更好的支持多种业务场景,能很好的服务多种资产在链发行,流通。

March 13, 2019 · 1 min · jiezi

Python 开发比特币教程汇总

创建一个接受消息的机器人机器人接受比特币并立即退还用户创建比特币钱包其他编程语言比特币开发教程如下:PHP 比特币开发教程Go 比特币开发教程Java 比特币开发教程Node.js 比特币开发教程C# 比特币开发教程Mixin Network 开发者资源汇总

March 13, 2019 · 1 min · jiezi

5 XIN token 悬赏: Mixin Network Java SDK 补完计划

任务目标: 完善现有的Java SDK,使其可以支持Mixin Network所有的API。奖金: 5 XIN (约值 $700) 给最佳方案提供者流程:通过邮件 lilin at mixin.one, 或者 Mixin Messenger ID 31367 联系负责人创建Github开源库,写代码,告诉我库的地址时间安排:请于2019年4月12日之前提交完代码。最终结果将于2019年4月20日之前公布。Mixin Network开发者资源汇总Python 比特币教程PHP 比特币教程Go 比特币教程Java 比特币教程Node.js 比特币教程C# 比特币教程

March 12, 2019 · 1 min · jiezi

如何内行地评价公链(一)从真正的不可能三角谈起

最近几期,Conflux 计划推出一系列的科普文章,从一些简单的技术原理开始,帮助大家辨别一些项目宣传的概念中,哪些概念是可能实现的,哪些概念如果要实现,是需要有妥协的。在第一期,我们从区块链的“不可能三角”谈起,谈一谈如果要追求极致的效率,究竟要牺牲什么。目前在区块链媒体中,有一个流传很广的概念叫“不可能三角”,即效率、安全、去中心化三者不可并存。和“不可能三角”出现同样频繁的概念,是“不可能三角”被公链某个项目打破。在一些媒体宣传 Conflux 的时候,也曾经使用过这个说法。不过,Conflux 从未在官方宣称“打破不可能三角”,我们认为这并不是一个严谨的概念。只能说,这个概念被提出来的时候,还没有人把这三件事情同时做好,并没有人通过严谨的分析证明它不可能。今天,我们来介绍另一个不可能三角。无论一个区块链是公有链还是联盟链,是 PoW 还是 PoS, 是采用中本聪共识还是 BFT 还是其他的什么方式,都绕不开它。这个不可能三角包括三个目标。(为了便于理解,我们避免采取严谨的形式化语言去定义它,而是大概描述一下想法与思路)1. 全部节点同步与验证在公链网络中,公链网络的正确性与安全性依赖于一些节点的背书。例如,在比特币或以太坊中,根据协议,每一个矿工挖出区块时,要保证新区块和历史上的每一个区块每笔交易都是正确的。也就是说,比特币矿工出块时,在为之前所有的区块进行正确性背书。在 EOS 中,超级节点通过签名对区块的正确性背书。我们这里称为“参与共识的节点”。“全部节点同步与验证”要求每一个被确认的交易,都得到过所有参与共识的节点(攻击者除外)的同步与验证。这个目标是和安全相关的。我们想象一个场景,有一个人想通过伪造无效签名,制造非法交易,盗走你的资产。如果只有一小部分参与共识的节点同步和验证了这个交易,而其他节点不同步这个交易,直接采信那一小部分节点的判断结果。如果这样的话,将一笔非法交易混入交易历史的可能性,就会高于每个参与共识的节点都进行同步和验证。二者的安全性是不一样的。2. 超高吞吐率最终确认交易的平均吞吐率超过 11000 TPS 称之为超高吞吐率。 (每笔交易的大小按 250 字节计)3. 低带宽要求对于每一个参与共识的节点,网络带宽的最低配置要求不高于 20 Mbps (2.5 MB/s)。这个目标是和去中心化相关的,参与的门槛越低,能参与共识的人就越多,越有利于去中心化。以上就是这个不可能三角的三个目标。原因理解起来也很简单,如果一个节点只有 20 Mbps 的带宽,那么每秒只能下载 2.5 MB 的数据,大约是 10000 笔交易。如果网络中最终确认交易的平均吞吐率超过 11000 TPS, 这个只有 20 Mbps 带宽的节点是没有能力同步和验证每一笔交易的。那么面对这个困难,做出取舍的方案又有哪些呢?1. 放弃全节点同步与验证在这些方案中,Sharding 是一个很著名的解决方案。Sharding 方案的大体思路是,整个区块链在逻辑上分出若干个 Shard, 将没有关联、互不冲突的交易分到不同的 Shard 中去, 每个 Shard 由一部分矿工负责同步和验证。对于矿工来说,不需要为其他 Shard 中的交易正确性负责。Sharding 方案是一个提高吞吐率的思路,但这个思路牺牲了一部分的安全性。毕竟,如果有一个人想通过伪造签名,制造非法交易盗窃你的资产,全网中每一个节点都帮你防范非法交易,和只有一小部分节点帮你防范非法交易,二者的安全程度是不同的。不过,对于只是存个零花钱的账户地址,相对于安全性,可能用户对交易成本更敏感。所以这一方向是非常有探索价值的。但如果用 Sharding 方案下的 TPS 和别人全节点同步与验证下的 TPS 比,就很不科学了。另外一个思路是,通过零知识证明或可验证计算等密码学工具,允许一个节点不必同步每一个交易,只需要同步区块头及一些密码学的元素,也可以验证一个区块的 Merkle Root 是正确的。当然,这个思路上有很多坑需要去解决,如果有机会,我们会写一篇文章展开讨论一下。2. 放弃高 TPS这里的放弃高 TPS,是指在现有的网络条件下,放弃 10000 TPS 以上的吞吐率。Conflux 保留了去中心化和安全性,就需要保留全节点同步与验证和低带宽要求,以实现家用网络条件也可以当矿工,每一笔交易都得到了每一个矿工的验证。如果要保留这两点,效率是有天花板的。3. 低带宽要求在一些共识机制中,普通用户不参与对交易的同步与验证,而是通过一些方式选出少数特殊的节点来进行共识。这时,我们可以假设每一个参选的节点都准备了足够的计算机资源,例如更好的 CPU, 更大的硬盘, 更大的网络带宽。这时,也就没必要将“最低配置要求”设的很低了。下一次,如果您看到一个项目声称大于 10000 TPS,甚至是喊出无限可扩展的口号时,您就需要来看一下在这个不可能三角中,它放弃了哪一角。是放弃了第一点还是第三点?如果是放弃第一点,项目是采用了 Sharding 方案?还是做出了其他的修改?这种修改会不会带来安全性问题,如何解决?如果是放弃第三点,高 TPS 是否基于更高的网络带宽要求?还是说在网络带宽无限的条件下无限可扩展?顺便推荐一下我们的线下活动~在本期Conflux Meetup(杭州站),我们为大家邀请到了Conflux CTO伍鸣、Conflux研究总监杨光、TOP Network Co-founder & CEO Steve Wei来一起聊一聊《下一代公链和DApps生态前景》。点击报名 ...

March 12, 2019 · 1 min · jiezi

调研的六个开源DevOps平台

项目名称开发语言活跃度文档说明功能描述Walle 瓦力Python活跃、更新及时文档较完善,有官网DevOps代码部署平台:空间管理、服务器管理、项目管理、环境管理、用户管理、部署管理gaiaGolang活跃、更新及时文档较完善,有官网CI/CD:创建主流开发语言的Pipline,包括Golang、Python、Java、C++、Ruby蓝鲸智云配置平台(BlueKing CMDB)Golang活跃、更新及时文档很完善,有官网,有视频教程云CMDB:拓扑化的主机管理、组织架构管理、模型管理、进程管理、事件注册与推送、通用权限管理、操作审计cdsGolang活跃、更新及时有英文文档和官网CD & DevOps自动化:Self-Service、Horizontal Scalability、High Availability、Pipeline Reutilisability、REST API、CustomizablecloudunitJava不活跃,基本停止更新有部分安装和使用文档DevOps平台:CI/CD with Gitlab or Jenkins2、EKL Stack for monitoring users containers、Prometheus for monitoring platform、Sonar to analyse and reports in the future、Mattermost chatHygieiaJava活跃、更新及时文档较完善,有视频一站式DevOps平台:CI/CD、交付管道、数据可视化、看板

March 12, 2019 · 1 min · jiezi

git上传代码到阿里云code的完整教程

1.先code上创建项目2.在新文件里打开git bash here输入以下命令行:git clone git@code.aliyun.com:371854496/test.git //克隆远程连接地址cd test //进入到克隆后的文件夹里 touch README.md // 创建 README.md 文件git add * //提交所有修改的文件git commit -m “add README” //此次操作命名为add READMEgit push //改动后的文件全推向远程的master分支上3.git checkout -b 新分支名 //创建并切换到新分支上4.然后在新分支上添加修改新文件,完毕后输入以下命令git add * //提交所有修改的文件git commit -m “新分支上的修改操作” //此次操作命名为新分支上的修改操作git push origin 新分支名 -u //在远程master分支下创建新的分支并推送最新修改后的所有代码5.git checkout master //切换回master分支上6.合并分支git merge 新分支名 //合并新分支到master分支上,此为合并后的代码7.删除分支git push origin –delete 新分支名 //删除远程分支上的新分支 git branch -d 新分支名 //删除本地上的新分支

March 12, 2019 · 1 min · jiezi

比原链(Bytom)节点接入文档

系统要求我们建议选择主要的几家云主机平台的VPS服务,运行比原链节点对算力没有要求,但是请配置尽可能大的磁盘空间以适应区块链数据未来增长的需要。节点服务器最小配置:操作系统: Windows/Linux/DockerCPU: 2核内存: 2G硬盘: 40G网络: 独立IP,2MB带宽防火墙: 开启46657端口Ubuntu接入文档1 节点服务器部署1.1 安装系统依赖库sudo apt-get updatesudo apt-get install build-essential git unzip wget vim1.2 下载并解压节点wget https://mirrors.tuna.tsinghua.edu.cn/osdn/bytom/70718/bytom-1.0.8-linux.zipunzip bytom-1.0.8-linux.zipchmod +777 ./bytomd2 启动并运行节点./bytomd init –chain_id mainnet./bytomd node –simd.enableWindows接入文档1 安装系统依赖库1.1 安装MinGW官方链接:https://nuwen.net/mingw.html下载链接:https://nuwen.net/files/mingw/mingw-16.1.exe1.2 安装Golang官方地址:https://golang.org/下载链接:https://studygolang.com/dl/golang/go1.12.windows-amd64.msi参考链接:https://studygolang.com/dl1.3 安装Git官方地址:https://git-scm.com/下载链接:https://git-scm.com/download/win2 下载并解压节点下载链接:https://mirrors.tuna.tsinghua.edu.cn/osdn/bytom/70718/bytom-1.0.8-linux.zip解压zip文件,并右键文件夹权限修改成可读写3 启动并运行节点./bytomd.exe init –chain_id mainnet./bytomd.exe node –simd.enableDocker接入文档1 获取Docker镜像docker pull bytom/bytom:latest2 初始化节点docker run -v ~/Bytom:/root/.bytom bytom/bytom:latest bytomd init –chain_id mainnet3 运行节点docker run -d -p 46657:46657 -v ~/Bytom:/root/.bytom bytom/bytom:latest bytomd node –web.closed –auth.disable

March 11, 2019 · 1 min · jiezi

华为云区块链服务全球发布,加速技术行业落地

华为云区块链服务全球发布,加速技术行业落地华为云区块链服务(Blockchain Service)上线华为云国际站点,面向全球用户发布。此举标志着华为云区块链走向海外,帮助全球企业及开发者在华为云上快速、低成本地创建、部署和管理区块链应用,为打造分布式全球区块链平台提供基础。积极推动构建产业生态 区块链具有技术去中心化、不可篡改和可追溯的特点,让参与者与主体之间建立更强的信任。这种特点与企业应用、行业场景相结合才能真正产生价值,是一种技术生态。目前,各行业企业都在对区块链技术进行积极探索。然而,在云环境下部署区块链并非易事,需要开发者对于区块链技术有深度认知,并且部署费工耗时。早在2016年,华为就开始积极参与区块链技术领域最具影响力的开源项目——Linux基金会下的Hyperledger(又称“超级账本”)项目,并在两个热度最高的子项目Fabric和STL中持续做出技术和代码贡献,同时被社区授予Maintainer职位,也是两个项目中唯一来自亚洲的Maintainer。华为云区块链服务基于华为云容器、安全等服务和多年技术积累,是一种开放易用、灵活高效的通用型基础解决方案,可用于数据应用、IoT、金融等领域,具体场景如数据交易、身份认证、房产/学历等信息证明、远程医疗、食品溯源、车联网、IoT设备管理等,可以很好地与行业场景相结合,助力构建技术生态与行业数字化转型。华为云区块链服务的四大主要优势华为云区块链服务聚焦区块链平台建设,为开发区块链应用和方案的企业提供高性能、高可用、高安全的区块链技术服务,其主要优势如下:1、开放易用基于Hyperledger1.1、Kubernetes搭建,配置简单,数分钟内即可完成部署,提供全流程、多维度的自动化运维服务。2、灵活高效支持多种高效共识算法,切换灵活,秒级共识(5000TPS+),多角色节点和成员可动态加入/退出,采用容器化物理资源管理。3、高性价比一键上链,节约开发、部署成本;按需付费,减少使用成本;统一运维,节约监控和运维成本;可根据用户需求进行弹性伸缩、升级回滚。4、安全隐私保障完善的用户、秘钥、权限管理和隔离处理,多层加密保障,国密和同态加密等隐私处理,可靠的网络安全基础能力,运营安全无忧。华为云区块链服务致力于将自身技术使能企业的创新成长,与企业携手共建可信社会体系,使用华为云区块链服务,最快5-10分钟即可搭建一套基于企业自身业务的区块链系统,目前已向全球用户发布。更多华为云区块链服务信息,尽在华为云学院https://edu.huaweicloud.com/。

March 11, 2019 · 1 min · jiezi

QuarkChain主网Singularity上线倒计时启动:引爆下一代区块链的奇点 全新区块链宇宙的开篇

QuarkChain成立一年多以来,经过不断的的设计、开发与测试,今天,QuarkChain团队正式向社区公告:QuarkChain主网 v1.0 版 Singularity(奇点)将于北京时间2019年4月30日正式上线,超提前实现以太坊2.0的技术构想,成为第一个将状态分片技术落地实现的项目。主网上线,将是QuarkChain全新的开始,未来璀璨的区块链世界,将自此开启。QuarkChain的技术实力和设计理念将得到真正的展现,社区开发者和用户将可以正式融入QuarkChain生态之中。届时,QuarkChain将成为第一个实现高并发分片功能的公链,以及目前仅有的支持多共识、多虚拟机、多原生代币的公链,更好的达到扩容,去中心化和安全的平衡。让QuarkChain实现了通过高并发分片功能提升区块链系统吞吐能力的“刚需”之后,更提升了对众多应用场景的适应能力。为配合主网上线,我们将启动“守护者计划”:由于早期QuarkChain主网算力有限,为了保护QuarkChain社区所有人的利益,确保根链有足够算力来保证全网安全,QuarkChain将依靠守护者计划,为根链提供算力保护,并将挖矿所得分发给守护者计划的参与人,具体方案将于近日公布。请关注我们官方微信获取第一手资讯。主网 v1.0 版 Singularity(奇点)启动时间北京时间2019年4月30日主网开发工作,将严格按照路线图于3月底完成。为保证主网安全性与守护者计划,为网络提供足够的算力保护,我们预留一个月时间进行相关工作。QuarkChain主网相关特性介绍如下主网功能特点QuarkChain主网开发自2018年6月首发币安后,与同类型公链相比主网上线时间最快,开发时间最短,不仅100%完成了白皮书中承若的所有功能,更增加了新的特性,比如更加安全的先压币,再挖矿的PoSW共识,使其更加去中心化,更安全,可扩展、更灵活。支持状态分片技术QuarkChain主网落地实现了分片技术中最具备挑战性,也最具有价值的状态分片技术,可以将不同账本状态分别存储在不同分片上,只需要让整个集群拥有全网完整的数据即可。让单一分片上的节点节约更多的存储空间和计算资源,让整个系统效率更高。而依靠创新性的集群设计,使得多台配置普通的电脑可以组合成一个运算能力相当于超级节点的集群,降低了投入成本。这样一来,整个网络将更高的灵活性与可扩展性同开发者、用户以及各种规模的记账者友好性融为一体。独创分片共识算法:玻色子共识和算力复用技术QuarkChain主网采用独创的玻色子共识算法,使得在不同分片上的独立运行不同共识算法与不同回报成为可能,并且使得单个区块链系统支持多种挖矿算法。其算力调节机制能让哈希算力在分片之间灵活分配。通过算力复用技术,能够让新添加的分片能够立即被根链算力保护。从而兼顾安全与去中心化,更可以提高整个系统的扩展能力。高效,安全的跨分片交易QuarkChain依靠全新的架构设计保障了跨片交易的高效和安全实现。QuarkChain保证了跨片交易的原子性,即每笔跨片交易将完整的执行,不会因为故障导致财产丢失。更重要的是,QuarkChain依靠玻色子共识,所有的跨分片交易的安全都会被根链保障,使得跨片交易享受跟片内交易一样的安全强度。另外,QuarkChain的跨片交易的吞吐能力,随着分片数目的增加和增加,通过动态燃料市场调节,使得交易不会集中于一个分片(即“分片过热”),解决了困扰分片技术进一步应用的问题。多原生代币支持现有主流区块链系统对于多种代币的生态不提供支持,或支持不够完善。针对这个问题,QuarkChain支持独特的多原生代币结构,只要用户愿意支付足够的手续费(由已经存在原生代币来支付),任何用户都能够创建一种新的原生代币。通过使用原生代币,用户可使用一步支付给智能合约并触发合约自动生成所有计算,而不会发生类似“明明是ERC 20代币的交易,却需要支付ETH作为GAS费”的情况。这种更加高效灵活的设计理念,已经得到了众多QuarkChain生态合作伙伴和DApp开发者的高度认可。代币经济学QuarkChain的代币产量将保持100亿不变。主网上线第一年,挖矿记账奖励流通量约为2.46亿个QKC,产量每年递减,每年产量将只有上一年的88%。主网上线时将有8条分片,每年计划可动态添加一条分片。根据设计,每个分片出块时间为10秒,根链出块时间为60秒。分片的初始记账奖励为3.25QKC基本奖励加上交易的GAS费用。GAS计算方式和以太坊很类似,但由于QuarkChain实现了状态分片技术,有效缓解了网络拥堵,GAS费用暴涨的情况。在加上独特的多原生代币结构,使得GAS费用支付方式灵活多样。根链的初始记账奖励为156QKC基本奖励加上包含分片区块头数量奖励。例如某个根链区块,它包含了48分片区块头,即每个分片平均6块,则该根链区块的记账奖励将为156 + 3.25 * 48 = 312QKC,其中3.25为分片的记账奖励。通过上述所示的代币经济模型,激励根链矿工尽可能多的包含分片的区块头(有包含数量的上限)。共识机制与守护者计划QuarkChain采用完全原创共识机制:在拥有权益下的工作量证明 Proof of Staked Work。简单而言,PoSW融合了PoW和PoS的两大特点,押币挖矿,算力占全网的比例越高,需要的压币的数目也就越多。QuarkChain主网采用了根链+分片结构,上线早期,为避免因验证分片交易的根链算力不高而产生遭到算力攻击的潜在风险,QuarkChain根链将暂时使用简化版PoSW,即守护者共识。此阶段,根链算力保护工作完全交由守护者们来进行,待根链运行稳定后,逐渐过渡至PoSW共识。守护者计划只针对根链,各个分片挖矿难度完全由哈希算力决定。守护者节点的挖矿所得,将全部用于QuarkChain生态和社区建设。用户可以通过申请参加守护者计划或者参与投票的方式获得收益,关于守护者计划的参加和奖励分配方式,我们后续将发布专题文章,敬请关注。分片挖矿算法QuarkChain主网上线后开放分片挖矿,根据PoSW共识机制,记账者可以直接依靠算力挖矿,但押币再挖矿效率更高。目前QuarkChain分片支持的算法如下:原创挖矿算法——QKChash为了可以抵御ASIC矿机对挖矿工作的垄断地位,我们自主研发了最新抵制ASIC的挖矿算法QKChash, 该算法使得挖矿的效率与CPU息息相关,从而更有效保证共识机制的公平和安全。EthashEthash是以太坊的PoW挖矿算法QuarkChain主网币换币方案我们预计将在主网稳定运行至少三个月后,启动主网币更换工作。请密切关注QuarkChain官网公告,切勿相信第三方不实信息,慎防诈骗。官方换币将在手机钱包qPocket中进行,交易所换币方案正在积极接洽中。Singularity(奇点)上线,将成为QuarkChain开启未来如群星般浩渺的区块链宇宙的全新起点。QuarkChain团队将沿既定路线继续前进,并将继续在区块链生态的多个领域持续发力,同社区支持者一道,让高效、灵活的区块链系统更快普及。Quark(夸克)虽渺小,但自宇宙开篇起就一直存在于此永续不灭,经过漫长的演化,构成了如今夺目璀璨一切。我们希望,通过此次并不伟大的一步,加以不懈的努力,让未来的区块链世界也如同现实世界一般群星闪耀。备注:此次事件解释权归QuarkChain官方所有。

March 11, 2019 · 1 min · jiezi

登链钱包(一款功能强大的以太坊钱包)完全开源

你是否和我前段时间一样,苦苦的寻找一款好用的开源以太坊钱包,你会发现可用都很少,因为很多钱包说开源,仅仅是开源部分代码,现在不需要再找了,登链钱包完全开源,登链钱包完全开源,登链钱包完全开源,重要的事情说三遍。再也不用傻乎乎找人开发以太坊钱包了, 直接拿去用吧;再也不用担心私钥会被上传到别人的服务器上。<!– more –>写在前面区块链是开放的,很难想象一个封闭的项目如何产生信任,开源一直是区块链社区所倡导的行为准则。我们也希望开源能够降低行业的开发门槛,吸引更多的开发者和公司能够利用我们的代码,找到更多落地的应用场景,一起来推动行业的发展。同时我们也相信开源可以是产品更加的安全,我们也邀请专业的区块链安全团队零时科技来为钱包做安全审计。效果演示先来看看钱包长什么样吧,我制作了一个gif图片:<p align=“center”> <img src=“https://wiki.learnblockchain….; width=“450”></p>Gif 图片比较简陋,见谅见谅,可以看的出来界面参考了现在的主流钱包,感谢imToken及ETHWallet,大家可以戳链接下载APK体验,Google play 也已经上架,正在审核中。功能介绍目前版本支持一下功能:[x] 支持通过生成助记词、Keystore文件、私钥 创建钱包账号;[x] 支持导出钱包账号助记词、私钥、Keystore文件;[x] 账户余额查询及转账功能;[x] 支持多个钱包账号管理;[x] 支持ERC20 代币(余额显示、转账、代币币价显示);[x] 历史交易列表显示;[x] 二维码扫描,兼容imToken格式;[x] 支持用法币(美元和人民币)实时显示币价;[x] 支持以太坊官方测试网络(Infura Koven及Ropsten)及本地测试网络。功能够全面吧,尤其是最后一个功能支持以太坊官方测试网络(Infura Koven及Ropsten)及本地测试网络,估计是开发者的最爱,做为开发者的我,懂你们的痛(可以获取到免费的以太币用于测试)。代码的讲解和相应的课程,我们后面会陆续放出,在还没有放出之前,先提醒大家几个注意的点:使用本地网络测试的时候注意Geth 或 Ganache 设置下可接收RPC连接的地址,因为默认情况下只支持本地连接,这样手机上就无法连接。显示交易记录功能需要自己搭建一个服务器提供API接口,这个接口来自TrustWallet,为了和本应用保持版本一致,我Fork了一份,地址为trust-ray,这个库会解析区块,并把交易信息存到MongoDb数据库里,然后用API提供给客户端使用。实时币价的显示其实也是使用trust-ray提供的接口,trust-ray 使用的是CoinMarketCap的数据,目前使用的是CoinMarketCap免费提供的数据,CoinMarketCap现在有一套新的付费接口,免费的数据可能在将来会停用,到时需要使用CoinMarketCap 的apikey来访问。代码中ERC20_Contract目录提供了一个ERC20合约给大家部署测试Token功能。其他的代码介绍及环境搭建大家就只有等我的文章了,大家也可以学习网页钱包开发课程,课程详细介绍了开发钱包必备的理论知识。有什么需要的功能,可以提issue或加我微信留言。对了本项目的GitHub地址为:Upchain-wallet, 点 Star 的同学都会发大财,哈哈哈~~~参考的开源项目本钱包在开发是站在巨人的肩膀上完成,特别感谢以下项目:web3jbitcoinjTrust-walletETHWalletBGAQRCodeTrust-ray## 再啰嗦几句本次开源也是受到区块链社区的影响,尤其是HiBlock区块链社区一些朋友坚持布道和开源的精神影响。HiBlock区块链社区 是国内最大的区块链开发者社区,社区已经聚集了数千名区块链开发者。登链钱包是由登链学院出品,希望大家知道登链学院不单出品优质课程,我们也为行业发展贡献一份力量,感谢大家转发。PS: 我们提供专业的钱包定制开发,欢迎咨询微信:xlbxiong深入浅出区块链 - 系统学习区块链,打造最好的区块链技术博客。

March 10, 2019 · 1 min · jiezi

Nervos CKB 经济模型提案正式发布

今天,Nervos 联合创始人及研究员 Kevin Wang 在 GitHub 上提交了 CKB经济模型提案《Crypto-Economics for the Nervos Common Knowledge Base》。区块链是加密算法和经济学的奇妙融合,由此产生了一个新的研究领域,即加密经济学。这个领域现在还处在早期。Nervos Network 的目标是为下一代的基于密码学保护的加密经济生态建设基础设施,生态中会有不同角色来承担不同的功能,上至上层应用,下至底层网络,俨然成为一个整体。一个好的加密经济设计就如同设计一个复杂的社会体系,它能够使得体系中不同角色分工协作。而加密经济的意义在于能够对不同角色进行恰当的激励,实现激励相容,促进生态良性循环。在 CKB 经济模型设计中,我们讨论了比特币和以以太坊为代表的智能合约平台,根据它们的经济模型设计,提出了 CKB 经济模型设计的目标,并针对这些目标提出了我们的解决方案。大家可能不了解 RFC 是什么?RFC 是 Request for Comments(意见征求)的缩写,它的建立是为新协议的改善和最佳实践提供一个开放的社区驱动路径。就像以太坊有 EIP(以太坊改进提案),比特币有 BIP,而我们希望在 Nervos 项目成立之初就建立完善的社区提案、讨论以及实施流程。在过去的一年中,分散在世界各地的小伙伴因为 RFC,顺利地参与到我们项目的立项、代码开源,现在的经济模型,甚至未来的测试网络中来。在 GitHub 上,每天都会产生非常多的 Issue / PR(Pull Request)讨论。我们将我们对技术的沉淀,对经济的思考,以及对整个行业的探索,通过 RFC 的方式提交到 GitHub 上。当然,我们也会有我们的局限性,一个完善的加密经济设计,需要汇聚更多社区成员的智慧。因此,我们希望有更多的小伙伴加入进来,和我们共同完善这份提案。你的每一个宝贵意见,都会推动 Nervos 的成长,甚至推动整个行业的进步!在 CKB 经济模型将近一年的研究过程中,有许多行业内的专家与朋友深入参与了讨论,提出了大量宝贵的意见和改进建议,在此,我们向各位老师表示衷心的感谢:哈佛大学 梅森学者邹传伟老师乔治梅森大学 金融系助理教授李家荪教授北京大学 前沿计算研究中心邓小铁教授Nervos Team2019.3.9PS:RFCs 是所有提案的总入口,其中最新提交的经济模型是以 Pull Request 方式提交,编号为 78。欢迎大家复制此链接至浏览器,或点击「阅读原文」,直达 Nervos CKB 经济模型提案。链接地址:https://github.com/nervosnetw…Nervos 社区志愿者已经完成了对 CKB 经济模型提案中文版的翻译初稿,希望可以借此帮助大家了解这份白皮书的研究方向,以及 CKB 经济模型的设计思路。欢迎复制此链接至浏览器,查看提案翻译:https://github.com/nervos-com…

March 9, 2019 · 1 min · jiezi

基于Mixin Network的Go语言比特币开发系列教程汇总

创建机器人机器人收比特币,发比特币创建独立的比特币钱包,查余额,转账其他编程语言比特币开发教程如下:PHP 比特币开发教程Python 比特币开发教程Java 比特币开发教程Node.js 比特币开发教程开发者资源汇总

March 9, 2019 · 1 min · jiezi

基于Mixin Network的PHP比特币开发教程: 创建比特币钱包

我们已经创建过一个回复消息的机器人和一个能自动支付比特币的机器人.通过本教程的学习,你可以学到如下内容如何创建一个比特币钱包.如何读取比特币钱包的余额.如何支付比特币并即时确认.如何将Mixin Network的比特币提现到你的冷钱包或第三方交易所.前期准备:你要有一个Mixin Network账户。如果没有账户,一行代码就能创建一个$user_info = $mixinSdk->Network()->createUser(“Tom cat”);上面的语句会在本地创建一个RSA密钥对,然后调用Mixin Network来创建帐号,最后输出帐号信息.//Create User api include all account informationprint_r($user_info);print($user_info[“pubKey”]);$newConfig = array();$newConfig[“private_key”] = $user_info[“priKey”];$newConfig[“pin_token”] = $user_info[“pin_token”];$newConfig[“session_id”] = $user_info[“session_id”];$newConfig[“client_id”] = $user_info[“user_id”];帐号创建成功后结果如下:Array( [type] => user [user_id] => de06f952-6ec7-3789-8467-9aa79869a6ef [identity_number] => 0 [full_name] => Tom cat [avatar_url] => [relationship] => [mute_until] => 0001-01-01T00:00:00Z [created_at] => 2019-02-20T12:29:29.86008273Z [is_verified] => [session_id] => bc9293e5-ed9a-48da-99f9-915f561a1c60 [phone] => [pin_token] => TIPyCtRTTYOg2sr+lu0z2D3xS8SOtQAy0ZDnacRrn6u2ytutZinzeEpRTD9N1+DS/T1zJ8VoX4ED19nhF5SApjqjUaRjKI5lga4rQGcePjCvM0D89FdpmKJzNMLjzV2DglKFMPbnJTu1btfILc0XWiSNEiiFr2mHuLI7bYuQzWI= [invitation_code] => [code_id] => [code_url] => https://mixin.one/codes/ [has_pin] => [receive_message_source] => EVERYBODY [accept_conversation_source] => EVERYBODY [priKey] => —–BEGIN PRIVATE KEY—–MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALh0dSy2GcKek/Jp4lTMZxJ30AWP+inZ4c+FG+3ch3fenmXysCyM56hgvVZwh4RrRpvVjRt/NNE3k2WgN9LNZqWXCmo4ae/hJjpwuj/EVR/1/HSebF9hcvMoTre8D0iLlk+rf1tgr/ZHmIoa8ef45xMBDargfsF4b5k7kUavU9/xAgMBAAECgYB1ShBMOwsMVxvKdIvn0gXkl20ebFvtis9szr5gtO8rSNK+DuD5oyuXRNSAh5OUn0ZJxzQv/OZP9x/x6jw0/kk7Aj6cjjN3beC7UoayDYms4yNFoWNPqZEXkQ0b2tRsF3mdNj6LVm6Gq7FPDD1TYJ4GR4eOcWHCkZWym26HbZ30AQJBAPNFeZ7nd9wQIzu0wN9isrZebnCko3yax64MDsUAsrmPB1wdHkdX0tJpCldighYD10Cyi+nSz3ODmmbPbLu8AjECQQDCGyi0lpCoV+skLVR04weU99Msz1neqOw1khQCJLzUW8UdDhsVwfCdzCeuZrCz+gl/aZaJ6d+6rNTMp1hLionBAkBEs34hTiUfVL9egTFm5KyrrAdscFJrQhraIDWblRLkLGxbqy194GN9YIS3IO6z4OnNL58rrYlAig30sud2LSZBAkEAjuNXT7kWvBYcbwE/jtwhlLPqrK3nRlWrrLPgLsPEjb8Ql5busVGXQ1IqU+QcaCDEJRshSlzz6YOZEx6NjO5rAQJAejvW3DmTRjUSDJD8hGr9eCpKQTBDXyUEvyLIMCuRmm9Cbz0HRl4aVXOVblVWoJ6YsGvbCkSlLQCrPL2T58JTkg==—–END PRIVATE KEY—– [pubKey] => —–BEGIN PUBLIC KEY—–MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4dHUsthnCnpPyaeJUzGcSd9AFj/op2eHPhRvt3Id33p5l8rAsjOeoYL1WcIeEa0ab1Y0bfzTRN5NloDfSzWallwpqOGnv4SY6cLo/xFUf9fx0nmxfYXLzKE63vA9Ii5ZPq39bYK/2R5iKGvHn+OcTAQ2q4H7BeG+ZO5FGr1Pf8QIDAQAB—–END PUBLIC KEY—–)现在你需要小心保管好你的帐号信息,在读取该账户的比特币资产余额或者进行其他操作时,将需要用到这些信息.给新建的帐号创建一个比特币钱包新账号并不默认内置比特币钱包, 现在读一下比特币余额就可以创建一个比特币钱包。$asset_infoNew = $mixinSdkNew->Wallet()->readAsset(“c6d0c728-2624-429b-8e0d-d9d19b6592fa”);echo “BitCoin wallet address is :”.$asset_infoNew[“public_key”];创建的帐号的比特币资产详细信息如下,其中public key就是比特币的存币地址:Array( [type] => asset [asset_id] => c6d0c728-2624-429b-8e0d-d9d19b6592fa [chain_id] => c6d0c728-2624-429b-8e0d-d9d19b6592fa [symbol] => BTC [name] => Bitcoin [icon_url] => https://images.mixin.one/HvYGJsV5TGeZ-X9Ek3FEQohQZ3fE9LBEBGcOcn4c4BNHovP4fW4YB97Dg5LcXoQ1hUjMEgjbl1DPlKg1TW7kK6XP=s128 [balance] => 0 [public_key] => 195p8R8Y15uzDGMrdVkELVUW2444psqiSq [account_name] => [account_tag] => [price_btc] => 1 [price_usd] => 3928.11498197 [change_btc] => 0 [change_usd] => -0.006841408545228452 [asset_key] => c6d0c728-2624-429b-8e0d-d9d19b6592fa [confirmations] => 12 [capitalization] => 0)这个API能够提供若干与比特币有关的信息:存币地址:[public_key]Logo: [icon_url]资产名字:[name]资产在Mixin Network的uuid: [asset_key]对美元的价格(Coinmarketcap.com提供): [price_usd]存币时确认的区块数量:[confirmations]比特币私钥呢?比特币的私钥呢?这个私钥被Mixin Network通过多重签名保护,所以对用户来说是不可见的,比特币资产的提现和转账都需要用户提供正确的的RSA签名,PIN代码与会话密钥才能完成.不只是比特币,还有以太坊,EOS等这个帐号不只支持比特币,还支持以太坊,EOS等, 完整的区块链支持列表. 这个账户同时也支持所有的 ERC20 代币与 EOS 代币.创建其它的币的钱包与创建比特币钱包过程一样,读对应的资产余额就可以.Mixin Network 当前支持的加密货币 (2019-02-19)cryptouuid in Mixin NetworkEOS6cfe566e-4aad-470b-8c9a-2fd35b49c68dCNB965e5c6e-434c-3fa9-b780-c50f43cd955cBTCc6d0c728-2624-429b-8e0d-d9d19b6592faETC2204c1ee-0ea2-4add-bb9a-b3719cfff93aXRP23dfb5a5-5d7b-48b6-905f-3970e3176e27XEM27921032-f73e-434e-955f-43d55672ee31ETH43d61dcd-e413-450d-80b8-101d5e903357DASH6472e7e3-75fd-48b6-b1dc-28d294ee1476DOGE6770a1e5-6086-44d5-b60f-545f9d9e8ffdLTC76c802a2-7c88-447f-a93e-c29c9e5dd9c8SC990c4c29-57e9-48f6-9819-7d986ea44985ZENa2c5d22b-62a2-4c13-b3f0-013290dbac60ZECc996abc9-d94e-4494-b1cf-2a3fd3ac5714BCHfd11b6e3-0b87-41f1-a41f-f0e9b49e5bf0EOS的存币地址与其它的币有些不同,它由两部分组成: account_name and account tag, 如果你向Mixin Network存入EOS,你需要填两项数据: account name 是eoswithmixin,备注里输入你的account_tag,比如0aa2b00fad2c69059ca1b50de2b45569. EOS的资产余额返回结果如下:Array( [type] => asset [asset_id] => 6cfe566e-4aad-470b-8c9a-2fd35b49c68d [chain_id] => 6cfe566e-4aad-470b-8c9a-2fd35b49c68d [symbol] => EOS [name] => EOS [icon_url] => https://images.mixin.one/a5dtG-IAg2IO0Zm4HxqJoQjfz-5nf1HWZ0teCyOnReMd3pmB8oEdSAXWvFHt2AJkJj5YgfyceTACjGmXnI-VyRo=s128 [balance] => 0 [public_key] => [account_name] => eoswithmixin [account_tag] => 0aa2b00fad2c69059ca1b50de2b45569 [price_btc] => 0.00097367 [price_usd] => 3.87734515 [change_btc] => 0.05950956117519646 [change_usd] => 0.07238079041492786 [asset_key] => eosio.token:EOS [confirmations] => 64 [capitalization] => 0)存入比特币与读取比特币余额现在,你可以向比特币的钱包存币了。当然,在比特币网络里转币,手续费是相当贵的,费用的中位数在0.001BTC,按当前4000美元的价格,在4美元左右,有一个方便的办法,如果你有Mixin Messenger帐号,里面并且有比特币的话,可以直接提现比特币到新创建的帐号的比特币充值地址,它们在同一个Mixin Network网络内,手续费为0,而且1秒到账。下面的代码,可以读取比特币钱包余额.$btc = $mixinSdkNew->Wallet()->readAsset(“c6d0c728-2624-429b-8e0d-d9d19b6592fa”);print_r($btc);Mixin Network网内免手续费的,并且即时确认任何币在Mixin Network内部的交易,都是无手续费的,并且立刻到账。前期准备: 账户设置了PIN对于新创建的帐号,我们通过updatePin来设置新PIN码, 代码如下://Create a PIN.$pinInfo = $mixinSdkNew->Pin()->updatePin(’’,PIN);print_r($pinInfo);Mixin Network帐号之间的比特币支付通过Mixin Messenger,我们可以先转比特币给机器人,然后让机器人转币给新用户。$mixinSdk = new MixinSDK(require ‘./config.php’);//$user_info[“user_id”] generated by create user;$trans_info = $mixinSdk->Wallet()->transfer(BTC_ASSET_ID,$user_info[“user_id”], $mixinSdk->getConfig()[‘default’][‘pin’],AMOUNT);print_r($trans_info);读取Bitcoin的余额,来确认比特币是不是转成功了! 注意$mixinSdkNew是新用户的。$btc = $mixinSdkNew->Wallet()->readAsset(BTC_ASSET_ID);print_r($btc);如何将比特币存入你的冷钱包或者第三方交易所如果你希望将币存入你的冷钱包或者第三方交易所, 先要得到冷钱包或者你在第三方交易所的钱包地址,然后将钱包地址提交到Mixin Network.要点提示: 提现是需要支付收续费的,准备好比特币包地址!增加目的钱包地址到Mixin Network调用createAddress API, 将会返回一个address_id,下一步的提现操作会用到这个id。$btcInfo = $mixinSdkNew->Wallet()->createAddress(“c6d0c728-2624-429b-8e0d-d9d19b6592fa”, “14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C”, $mixinSdkNew->getConfig()[‘default’][‘pin’], “BTC withdral”,false);这里的 14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C 就是一个比特币钱包地址, 如下所示,提现费用是0.0025738 BTC, address_id 是"345855b5-56a5-4f3b-ba9e-d99601ef86c1".Array( [type] => address [address_id] => 345855b5-56a5-4f3b-ba9e-d99601ef86c1 [asset_id] => c6d0c728-2624-429b-8e0d-d9d19b6592fa [public_key] => 14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C [label] => BTC withdral [account_name] => [account_tag] => [fee] => 0.0025738 [reserve] => 0 [dust] => 0.0001 [updated_at] => 2019-02-20T01:47:56.44067294Z)创建提现地址成功后,你可以用readAddress读取最新的提现费。$wdInfo = $mixinSdkNew->Wallet()->readAddress($btcInfo[“address_id”]);提交提现请求,Mixin Network会即时处理提现请求.提交提现请求到Mixin Network, $btcInfo[“address_id”]就是createAddress创建的。$wdInfo = $mixinSdkNew->Wallet()->withdrawal($btcInfo[“address_id”], “0.01”, $mixinSdkBot->getConfig()[‘default’][‘pin’], “BTC withdral”);可以通过blockchain explore来查看进度.完整的代码在这儿 ...

March 8, 2019 · 2 min · jiezi

Conflux 吐槽君:Hashgraph 是一个真正的企业级去中心化平台吗?

亲爱的好朋友们:上期小C吐了一下 IOTA。说实话,刚开始小C还有些忐忑,毕竟是小C出道的第一篇文章,文章内容也可能会引起一些激烈的辩论。结果,有非常多的朋友给了我点赞关注加鸡腿,这让小C非常受宠若惊。感谢大家对小C的支持和关注,小C一定会更加努力地为大家写出更多更好的文章,不辜负大家对小C的信任!今天小C又新鲜出炉一篇新的文章——想跟大家一起分享一下 Hashgraph 这个项目。Hashgraph 是什么?这个名为 Hashgraph 的分布式账本于 2016 年横空出世,稍晚于上次讲过的“第一个使用了 DAG 技术”的公链项目 IOTA——如果 DAG (Directed Acyclic Graph,有向无环图)也可以被称为一种“技术”的话。Hashgraph 项目团队宣称:“这不是区块链,这是市场上第一个(甚至唯一一个)‘银行级’的共识技术。” ¹ 江湖传闻 Hashgraph 可以拳打比特币,脚踢以太坊,靠的就是不分片即可高达 50 万 tps 的硬实力 ² ,唯一的限制只有网速和想象力……顺便说一下,小 C 听说18年天猫双11的交易量峰值是 49.1万笔/秒,17年时候才 25.6 万笔/秒。1:https://www.thestreet.com/story/14385913/1/is-hashgraph-technology-just-hype-or-can-it-dethrone-blockchain-.html2: https://www.hedera.com/whitepaper随手放狗搜一下 Hashgraph 就可以发现,无论是在 Wikipedia 还是在其他各种媒体上,这个项目的口气都大得吓人: “How Hedera Hashgraph is building a fast and secure blockchain alternative.”(Hashgraph 如何建造一个快速且安全的区块链替代者)这样的说法,已经算是非常谦虚的了,其他的还有以下这些:“Hedera Hashgraph Thinks It Can One-Up Bitcoin And Ethereum With Faster Transactions”(Hashgraph 自认为胜过比特币和以太坊一筹)“Hashgraph vs. Blockchain Is the end of Bitcoin and Ethereum near?”(Hashgraph 对区块链!比特币和以太坊的末日指日可待?)“Hashgraph wants to give you the benefits of blockchain without the limitations”(Hashgraph 想要给你们带来无限牛逼的分布式账本)……简直一个项目要单挑所有区块链了!开头说的“拳打比特币,脚踢以太坊”已经算是非常谦虚的口号了。不过仔细研究以后,小 C 发现 Hashgraph 项目团队确实没有骗我——Hashgraph 真的是一个“银行级”的公用账本,一个只有银行级用户才用得起的账本。Hashgraph是怎么做的?小 C 在这里先来简单介绍一下 Hashgraph 的共识算法,对这部分比较熟悉或者不感兴趣的观众可以直接跳到下一节。与 IOTA 所用的 Tangle 账本不同,Hashgraph 用了一种更规整的图结构“哈希图”去存储包含交易的区块(每个区块在 Hashgraph 中记为一个“事件”(event)),并通过一个 aBFT (Asynchronous Byzantine Fault Tolerant, 异步的拜占庭容错,指系统在不超过三分之一的节点被攻击者控制,且诚实的节点之间通信延迟可以被任意延长的情况下仍可以保证安全性)的共识算法来保证所有人对整个账本达成共识。简单来说,Hashgraph 共识算法的基本逻辑就是:假设大多数参与者都是好人,那么当交易被足够多数人(比如三分之二以上的比例)见证以后,就可以确认这些交易的顺序以及它们是否有效了。只要系统里大部分人都是诚实的,那么多数人见证过的历史就可以沉淀为无法改变的共识。Hashgraph 共识算法采用了一种“见证即投票”的方式对交易历史排序。当一个参与者 Alice 看到有新鲜事发生的时候,比如一笔新的交易 T,就把这些新鲜事打包到一个区块 B 里;除了亲眼所见的以外,Alice 构造的区块还需要引用两个更早的区块,其中一个是 Alice 自己生成的前一个区块,另一个是从其他参与者那里收到的最新的区块。然后再给 B 加上时间戳和 Alice 的签名,就可以把区块 B 悄悄地告诉另一个随机选择的参与者 Bob 了。将来 Bob 就可以再通过引用区块 B 的方式,作为见证者把 “Alice 告诉我某时某刻发生了一笔交易 T” 的信息继续传播给其他人。于是,Alice 发起的这笔交易 T 就能以八卦的形式在参与者之间飞快地传播,只需要大约 log(N) 次就可以传遍 N 个参与者。果然,八(yao)卦(yan)传播的速度就是比正经的广播要快得多呢~Hashgraph 将所有区块按照他们之间的哈希引用关系组织成 DAG ,称为一个“哈希图”。哈希图不同于一般的有向无环图, 它有着非常鲜明的结构特征,即每个参与者都有一条链,同时链上的每个区块都引用一个别的链的区块。哈希图实际上描述了“事件”在“八卦网络”(Gossip Network)中传播的路径。通过观察本地存储的哈希图我们不仅可以判断一个事件是否已经被大多数参与者见证,还可以确定每个参与者见证不同的事件的先后顺序。Hashgraph 的通信比传统 BFT 少?Hashgraph 相对于传统 BFT 算法最大的优势,就在于 N 个参与者只需要每人发送大约 log(N) 条消息就可以完成一轮投票。要知道,在普通的 BFT 算法里,每个参与者可是要发 N-1 条点对点的消息才能做完成一轮投票的。听上去是不是很厉害?简直 too good to be true!为什么 Hashgraph 可以做得这么好呢?其实有一个比较微妙的小问题,只是因为 Hashgraph 相关的文档写到这里都是一笔带过的,所以小 C 至今没有看明白:传播八卦的时候,一条消息到底有多长?按照 Baird 2016年的 Hashgraph 论文的说法(“… Alice will choose another member at random, such as Bob, and then Alice will tell Bob all of the information she knows so far”)似乎是要 Alice 把所有知道的信息都告诉 Bob。所以,Alice 发给 Bob 的信息可能不止是一个区块 B,还包括这个区块 B 直接间接引用的的所有其他区块——难道要把整个账本的历史都放在一条消息里发出去?即使 Alice 非常聪明,记得她上次都告诉了 Bob 哪些八卦,每次只需要同步新八卦,那么每条消息的长度也依然会达到参与者人数的线性量级。如此看来, Hashgraph 可以少发很多条消息就没那么神奇了。因为虽然条数少了,但是新包装的一条消息的内容可能就长得可以绕地球1圈~最后算下来,Hashgraph 似乎也就是一个没有比传统的 BFT 算法节约什么的 BFT 算法。Hashgraph 的“银行级”性能接下来,小 C 来给大家算一下 Hashgraph 的几十万 tps 到底是什么概念。如果按照 Hashgraph 的测试网数据 25万 tps,每笔交易按 250 字节计算, 仅同步交易就需要 250000*250=62500000 B/s=62.5 MB/s 带宽。如果按照官网白皮书所说的 50万 tps,则需要 125MB/s 带宽。注意,这还没有计算除了交易本身以外的任何开销。所以在 5G 普及之前,普通用户下载速度都赶不上 Hashgraph 增长的速度。姑且先不讨论带宽,那么什么样的机器才能处理每秒数十万笔交易呢?以现在典型的机器配置,单核 CPU 每秒钟也就能验证几千笔交易的签名,强如 EOS 的超级节点在峰值时刻处理的交易数量也不过每秒四千笔左右。而 Hashgraph 除了处理账本上的每笔交易以外还要维护八卦图和虚拟投票,这又是一笔不小的开销。综上所述,只有银行级或者企业级的硬件才配得上 Hashgraph 了。Hashgraph 的“银行级”安全性Hashgraph 超高的安全性要求三分之二以上的参与者见证才能确认一笔交易,这样少数坏人再也无法修改公共账本。但是另一方面,这个机制也有非常严重的缺点——共识参与者的活跃性问题。Hashgraph 共识参与者们必须非常活跃,否则就会因为见证人数不够而无法达成任何共识。在现实中任何一个去中心化的系统中,普通用户一般都是长期不在线的,能长期活跃在线的只有:1)银行和交易所;2)庄家;3)矿工(Hashgraph 没有 PoW,没有矿工) 以上都是。所以,一个由银行级和企业级用户维护共识的公共账本,当得起一句“银行级”的安全性。对 Hashgraph 项目的建议小 C 建议 Hashgraph 项目也不要总拿着“银行级”联盟账本的性能去找比特币和以太坊等公链碰瓷,都不是一个赛道上有什么好比的。还不如好好跟别的基于 pBFT(实用拜占庭容错)的公共账本比比孰优孰劣更有意义。如果 Hashgraph 实在眼红公链这块蛋糕,也应该严谨地分析 Hashgraph 在公链环境下的安全性,然后用同口径的性能数据去跟别人比较,否则再怎么比也只是鸡同鸭讲罢了。本来嘛,如果 Hashgraph 只是做一枚安安静静的 BFT 账本,不要出来喊打喊杀地要做颠覆区块链的“Blockchain killer”,我们也不会想起来要拍它不是吗?就像裘千丈裘老前辈的职业规划如果是做一名魔术师或者杂技演员,那绝对是一位德艺双馨的老艺术家,也不会挨打对不对?事实上,Hashgraph 项目也确实是按照联盟账本搞的,他们组织了一个由 39 个组织和企业构成的委员会去维护和运行这个分布式的账本。至于开不起银行的普通用户嘛……我觉得支付宝和微信都是不错的企业级账本和 APP 平台。他们如果愿意把各地的机房拆分成不同的公司分别运营甚至卖掉几个的话,应该也能达到不输 Hashgraph 的“去中心化”程度。好了,这一期的内容就先到这里了!小伙伴们,如果你们看后感觉到了欢乐,觉得内容充实又有趣的话,记得多都支持我呀!动动手指点个赞,关注一下我们公众号吧~顺便推荐一下我们的线下活动~在本期Conflux Meetup,我们为大家邀请到了Conflux CTO伍鸣、Conflux研究总监杨光、Cobo钱包高级副总裁李尧来一起聊一聊《下一代公链和DApps生态前景》。点击报名 ...

March 7, 2019 · 2 min · jiezi

理想终将照进现实,算法也终将回归本来之美

江湖传闻:2010年,也就是比特币创立初期,BM向中本聪发难,认为必须改变比特币的共识机制并提出改进方案。不过,傲娇的中本聪本尊并没有采纳,他在强调了比特币去中心化的重要性和必要性之后,霸气回应:If you don’t believe me or don’t get it, I don’t have time to try to convince you, sorry.(看不懂就算了,我没时间搭理你,不好意思。)若干年后,BM创立EOS,实现了他自己的共识机制。既然是传闻,我们姑且听听就好。不过说到共识机制,倒是有诸多可探讨之处。随着技术的发展和演变,当前比较主流的共识有PoW、PoS和 PoS的变种,如DPoS,哪种共识更好,一直是大家热衷于讨论的话题。众所周知,“不可能三角”问题已成为区块链发展的重要掣肘之一,因此,谁能更好的解决该问题,谁就能成为最理想的共识机制。谁才是共识的“理想国”?背离中本聪精神的PoW在比特币挖矿中,中本聪设计了PoW(工作量证明机制)。每隔10分钟,伴随着新的区块的产生,比特币网络会发行一定数量的比特币,并把它奖励给当选的记账节点。从这个机制的表面来看,PoW是一种多劳多得的模式,算力高,花费的时间多,能获得的数字货币就越多。但它在运行过程中需要消耗大量的能量来计算哈希函数的结果,容易造成算力资源浪费,因为这些运算本身和区块链本身的价值没有关联。而且区块的确认时间难以缩短,容易产生分叉,需要等待多个确认。新的区块链必须找到一种不同的散列算法,否则就会面临算力攻击。同时每次达成共识需要全网共同参与运算,性能效率较低。此外,随着比特币减少,对算力要求越来越高,人们为了加速获取比特币的速度,催生了矿池挖抗的新玩法。矿池的出现,一定程度上破坏了比特币等加密数字货币体系的平衡,马太效应逐渐显现。至此,单纯的 PoW 机制已无 SHD 完备性可言,也背离了中本聪的设计初衷。“完美替代方案”PoS于是被认为能够替代PoW的PoS (权益证明机制)出现了。PoW和PoS的主要区别在于,如何确定区块链共识中的投票权。在PoW中,投票权与节点的计算能力成正比;而在PoS中,系统的投票权与持有的股权比例成正比。PoS一经提出,便受到人们的青睐。相对于PoW,PoS虽在性能上会有较大提升,但也是有限的。而且受到TOKEN发行问题、确定记账节点数量困难等缺陷的限制,它仍然无法成为PoW的完美替代方案。其次,PoS 系统需要一个高度安全的网络来抵抗黑客攻击,当前并没有一个具备如此实力的公链。更为致命的是,在PoS 公链中,区块链的出块权只能由头部玩家决定,这使得 PoS公链沦为一个本质上由巨头垄断和支配的网络。由此看来,PoS无法成为PoW的完美替代方案,于是人们开始思考是否可以在原有机制上进行改变,包括当初被中本聪怼的BM。披着“去中心化”外衣的DPoS在得到中本聪消极的回复后,BM没有放弃自己的想法,而是在PoS基础上进行了改进,推出了DPoS(委托权益证明机制),并创立了EOS。在EOS网络中,最终会选出21名主节点,他们被称为区块生产者, 简称BP (Block Producor)。EOS由 21 名BP轮流产生新的区块,并获得EOS网络的奖励。这种机制可以清除不良生产者,并识别其他有价值的成员,既降低了中心化风险又提高了性能。遗憾的是,由于投票所需要的时间和精力,绝大部分普通用户是没有投票热情的。此外DPoS延续了PoS的弊端,只有持币者才可以获得区块链奖励,这就带来了一种制度性门槛,最终导致DPoS币的流动性大大减少,强者恒强,贫富差距逐渐变大。DPoS 大幅提高了系统性能,却忽视了去中心化的根本意义,由少数权益拥有者掌握系统的发展方向,本质上和现有的中心化系统并没有太大区别。所以,共识机制还是没有找到它的“理想国”,BM当初怼中本聪的底气,也渐渐演化成了社区接连不断的怨气。难道,共识理想真的要败给现实了?NO,幸运的是,那些仍怀有“共识理想”的人们从未停止过探索,其中就有ETM的科学家们,他们提出的UPoS机制或许能够成为点燃我们共识理想的希望之火。UPoS:回归算法本来之美回首共识机制的进化规律,我们发现,没有一种共识机制可以解决SHD完备性问题,那么是否可以将两种共识混合,从而做到融合二者优势,同时规避掉某些弊端?ETM首席科学顾问Dr.Aaron Yuan在最近的一篇文章《ETM, 及谈谈比特币的精神内核》中,介绍了ETM 项目提出的统一权益证明算法(Unified Proof ofStake, UPoS)。ETM 科学家创造性地将 DPoS 与 PoW 算法改进并结合在一起,形成双稳态 UPoS 共识机制。简单来说,其工作原理如下图所示:UPoS一方面回归比特币的原始精神内核——去中心化,另一方面,基于博弈论机制设计和纳什均衡思想,解决“不可能三角”的问题,实现安全性、高效性、去中心化的兼容,最终构造出一个“比原始比特币算法机制更符合当前经济金融结构需求的区块链技术体系”。共识算法本身很美,只是我们日渐看不清它的本来面目。正如Dr.Aaron Yuan在以上提到的文章中说到的那样,我们之所以觉得算法面目模糊是因为:“数学算法的可靠性要基于其前提条件。数学的精确性是有条件的,每一个定理都有确定的前提条件和假设,而这些前提条件是不能通过数学本身证明的而需要通过对现实世界的分析来建立和验证。在不断变化的现实世界中这些前提条件也会受到考验。”如今,基于UPoS共识机制的ETM已经对代码进行了多次内测和公测,并针对出现的问题进行了相应的优化和改进,主网也将不日上线正式运行。理想终将照进现实,算法也终将回归本来之美。未来,也许有一天,它会披着五色霞光,踩着七彩祥云,朝我们走来。

March 7, 2019 · 1 min · jiezi

【Filecoin源码仓库全解析】第五章:检索市场及检索矿工

对不起,你们可能关注了一个爱拖更的公众号…不过不拖更,可能这篇也不会有这么多 猛料…欢迎大家来到第五章,经过前章 《【Filecoin源码仓库全解析】第四章:存储需求方(用户)的配置操作》的内容阅读后,我们应该对存储需求方(用户)的配置操作有了系统的了解,并在实践中反过来验证了第三章中所描述的存储矿工挖取新块的过程以及整个的生命周期。我们将在这一章《【Filecoin源码仓库全解析】第五章:检索服务(矿工)的配置操作》中介绍与存储市场并驾齐驱而又息息相关的检索市场,以及Filecoin体系中另一重要角色:检索服务(矿工) 的基本配置操作。5.1 检索市场小编认为,检索市场协议在当下的互联网环境中,是非常非常关键,且有潜力的,这也是Filecoin体系设计中的一大亮点。为什么这么说?太远的就不追溯了,一起来看下,这两天发生在我们身边,与我们(公司或者个人)息息相关的事件:事件一:3月2日23点55分阿里云出现大规模宕机故障这种事这几年好像越来越频繁了,作为一个感同身受的企业客户(以下称为甲方),想吼一句:如果有一次让你重新上谈判桌的机会,你愿意吗?你可能会在谈判桌上看到一份这样的不平等协议:甲方重金购置XXX服务器或者XXX对象存储服务之前,先冻结乙方一部分的抵押金,并同时委托其他方为甲方生成多副本数据冷存。检索数据时,乙方出事了,宕机超过阈值了,甲方可无条件没收抵押金,还有一堆丙丁戊方抢在乙方之前,第一时间立即为您恢复副本数据,并继续提供实时检索服务。(小编猜测,Filecoin未公布的Repair Miner角色设定正是为了平衡这块:你不干,别人抢着干,抵押金会分给最先帮助修复的朋友)说到这里:是不是比差遣研发运维兄弟来得省心?是不是比事后看阿里云脸色来获得理赔更值得推崇?是不是更能保障甲方的利益?不知道你怎么想,真有这种好协议,反正我是签定了…你说巨头们会不会改?我觉得短时间内(也可能是十几年)、体制难改革…毕竟这是道人性题,和技术无关…阿里云做不到,腾讯云也做不到,亚马逊应该根本不Care…但把人性和市场经济研究透了的Filecoin,或许真做得到…事件二:感谢黑客0xDUDE让我们知道中国普通民众的明文聊天记录情理之中,有数据黑产的利益驱动,有实力的黑客们都很难淡定。而且,以现在网民的平均素质,关于自身数据有多值钱这件事,大部分是意识不到的…身处于目前互联网体制下的巨头们都建立在"网络中间商"的基础上,中间商赚的不仅是差价,还有大量的用户数据。毕竟大部分投资人都比你精明,你就不好奇,那些年的补贴大战,大家究竟烧钱是为了争夺什么?领完红包的你,究竟是得了便宜,还是被人套路?我们真的能够相信,中间商有意愿,有能力善待网民的数据?至少我不相信,大部分"被害人"不相信,协议实验室更不相信…不仅不信,还设计了IPFS+Filecoin这套体系,毕竟 “请把你的脏手从我的隐私数据上拿开” 这件事总归还是有人带头做的,而且,还做得这么认真且彻底…Filecoin的检索市场则是其中最重要的一环:帮助数据确权和去中间商交易。5.1.1 定位看完慷慨激昂的,我们来点内涵的:正如Star Li在《Filecoin逻辑梳理及源代码导读》06小节所描述的一样,Filecoin在协议层目前设计的模块有:Hello协议,Storage协议以及Retrieval协议。(PS:小编通读完一遍,觉得很棒,作者同样花费了很多心血研究Filecoin源码和架构,并为大家梳理好了其中最为重要的一些关键点,值得大家仔细阅读。)Retrieval协议用以规范检索市场,负责文件检索读取等交易事务,与负责区块同步的Hello协议和之前详细介绍的Storage市场协议并驾齐驱,分别发挥不同的专属职能(与存储市场协议不同,检索市场协议的实时并发响应要求更高,参与链上的事务会更少)。5.1.2 职能Filecoin体系下的检索市场(Retrieval Marketing Protocol)是未来真正意义实现Web3.0目标的一个产品雏形。Web3.0我理解为:消灭网络中间商,建造可信互联网基础设施,让用户真正拥有数据自主权,保障用户身份安全以及数据交易。5.2 实现程度需要注意的是,协议实验室目前在这块的开发进度还处于比较早期,优先级并不如其他模块,仅支持检索订单的正常交易和数据响应,版本号也因此暂设为0。为了搭建一个完善的检索市场,已经部分实现的依赖功能有:链下支付通道的Actor扩展基于libp2p的检索服务链上内容寻址接口节点客户端的相关命令行操作下面将分别介绍每个子模块的细节:5.3 链下支付通道的Actor扩展Filecoin的交易市场将承载大量的实时交易,因此,订单撮合和支付渠道被设计为链下事务,同时在未来,除了使用FIL作为支付媒介,还将使用比特币、以太坊等其他跨链支付方案作为支持。下面是支付通道的相关源码结构://通道IDtype ChannelID *big.Int//区块高度type BlockHeight *big.Int//签名type Signature []byte//支付收据type SpendVoucher struct { Channel ChannelID Amount *TokenAmount Sig Signature}type PaymentBroker interface { //用以创建微支付通道 CreateChannel(target Address, eol BlockHeight) ChannelID //用以更新微支付通道金额数量 Update(channel ChannelID, amt *TokenAmount, sig Signature) //用以关闭微支付通道 Close(channel ChannelID, amt *TokenAmount, sig Signature) //用以增加资金 Extend(target Address, channel ChannelID, eol BlockHeight) //用以收回未使用的资金 Reclaim(target Address, channel ChannelID)}// 生成收据信息func MakeSpendVoucher(ch ChannelID, amt *TokenAmount, sk PrivateKey) *SpendVoucher { data := concatBytes(ch, amt) sig := sk.Sign(data) return &SpendVoucher{ Channel: ch, Amount: amt, Sig: sig, }}5.4 基于libp2p的检索服务在第三章3.2节中,我们介绍了检索矿工(Retrieval miners)的角色和职能:比较像内容分发网络CDN的作用,负责“就近”检索和抓取数据,使得更快更好地把数据文件直接通过P2P链接,传输给需求方用户。而在IPFS和Filecoin的体系下,不光大文件的传输,所有的协议通信基本都是通过P2P的方式。而这一切都被封装在libp2p模块之中,而libp2p的职责就是负责节点之前的网络发现,协议通信,数据传输和响应。检索服务很大程度上也是依赖于libp2p的,在V0版本下的检索市场实现中,基于libp2p,新加了两个与业务强相关的服务功能:1)基于libp2p的检索消息的响应特征type RetDealProposal struct { //被检索数据的CID Ref Cid //支付金额 Price TokenAmount //检索订单的支付通道 Payment PaymentInfo}type ResponseStatus uintconst ( Unset = ResponseStatus(iota) Accepted Rejected Error)type RetDealResponse struct { //响应体包括状态码和数据详细信息 Status ResponseStatus Message string}2)基于libp2p的检索矿工报价查询响应特征type RetQuery struct { //按数据CID信息进行查询请求 Piece Cid}type RetQueryResponse struct { //响应体包括状态码和最低报价 Status RetQueryStatus MinPrice TokenAmount}type RetQueryStatus uintconst ( Unset = RetQueryStatus(iota) OK PieceUnavailable)5.5 链上内容寻址内容寻址是延用了IPFS协议的设计思想,即我只关心我所要检索的内容,并不关心底层路由系统和网络链接,系统默认会以最优的线路和速度帮我获取。与现有HTTP路径寻址的方式呈现根本的不同,更具创新性。Filecoin的检索市场也是使用内容寻址,并且会根据区块链上记录的信息来匹配对应存储了该内容的矿工ID集合(保证数据确权),然后解析成peerID和multiaddress,交给底层libp2p来负责网络路由和建立传输链接。接口定义如下:type ChainContentRouting interface { FindProvidersAsync(ref Cid, count int) <-chan pstore.PeerInfo}5.6 命令行操作目前V0版本的节点客户端设计集成关于检索市场协议的三个命令行功能操作(但是小编亲测的客户端Demo,在工程上实现与设计有一些出入),这三个功能分别是:5.6.1 通过CID检索数据内容USAGE filecoin retr get <piece-cid> - Retrieve a piece from a miner.SYNOPSIS filecoin retr get [–price=<amt>] [–miner=<peerID>] [–] <piece-cid>ARGUMENTS <piece-cid> - Content ID of piece to retrieve.OPTIONS –price string - Amount of filecoin to offer for this data. –miner string - Optional Peer ID of miner to connect to. (If unspecified, the chain routing service will be used)5.6.2 根据CID查看被检索数据的所有检索报价USAGE filecoin retr lookup <piece-cid> - Print a list of miners who have the given piece.SYNOPSIS filecoin retr lookup [–sort=<sorttype>] [–] <piece-cid>ARGUMENTS <piece-cid>… - Content ID of piece to find.OPTIONS –sort string - Output sorting scheme.5.6.3 通过矿工ID查询该检索矿工的信息USAGE filecoin retr query <minerID> [<piece-cid>] - Query the given retrieval miner.SYNOPSIS filecoin retr query [–] <miner-id> [<piece-cid>]ARGUMENTS <miner-id> - ID of miner to query. [<piece-cid>] - Optional cid of piece to query for.5.6.4 案例我们试着检索查询一下,于 第四章4.2节 中所导入并成功被存储的文本数据 QmRxRSrZgFfRc…7s1o 来试试:当存储订单的状态变为posted时,就可以进行被存储数据的检索响应了,需要矿工worker地址和对应数据CID信息:go-filecoin retrieval-client retrieve-piece <minerAddress> <CID> 此过程有一定网络时延,查询成功效果如下图所示:至此,无论从定位职能,还是从设计原理,还是从工程操作角度,我们应该对目前的Filecoin检索市场都有了更加深入的了解。我们将在下一章《【Filecoin源码仓库全解析】第六章:如何组建多节点矿工集群》中介绍如何在一台机器上构建多节点的方案。参考文献:https://github.com/filecoin-p…https://github.com/filecoin-p…往期系列文章回顾:【Filecoin源码仓库全解析】第一章:搭建Filecoin测试节点【Filecoin源码仓库全解析】第二章:如何创建账户钱包并获取FIL Mock代币【Filecoin源码仓库全解析】第三章(上):存储提供方(矿工)的配置操作【Filecoin源码仓库全解析】第三章(下):存储提供方(矿工)的配置操作【Filecoin源码仓库全解析】第四章:存储需求方(用户)的配置操作本章赞助品牌:深圳牛链科技有限公司 ,是一家专注存储类IPFS矿机研发、生产、销售、托管为一体的高科技企业。 目前技术团队包括IPFS硬件技术研发,IPFS协议研究,IPFS底层程序开发,IPFS应用程序研发,并在成都专门成立研发中心。2018年,研发中心团队在研究IPFS底层协议的基础上,开始搭建并运营IPFS高速网络系统,并正积极研发基于IPFS的网络应用。牛链科技的技术研发团队全力以赴研究Filecoin的运行机制,优化矿场配置,作为一家区块链技术服务提供商,致力于为广大用户提供优质的信息技术服务。牛链希望以技术驱动效率,为Filecoin落地提供基础设施。感谢 深圳牛链科技有限公司 对嘉乐SOHO的原创内容提供支持。联系作者:本人从业经验有限,不免有不足之处,欢迎指正和更多讨论,可私信微信公众号:jialesoho,或者加我微信:daijiale6239,如果觉得对您有帮助,可以帮点击好看推广和打赏支持噢,感激不尽!(识别图中二维码,关注嘉乐SOHO微信公众号) ...

March 7, 2019 · 2 min · jiezi

【Filecoin源码仓库全解析】第四章:存储需求方(用户)的配置操作

欢迎大家来到第四章,经过前章 【Filecoin源码仓库全解析】第三章(下):存储提供方(矿工)的配置操作的内容阅读后,我们应该会对Filecoin市场机制中的矿工对象有了更详细的认知,对矿工事务的生命周期有了具象化地理解。本章,我们将重点介绍存储需求方(用户)的配置操作,并反过来验证第三章中存储矿工后续挖取新块的过程,帮助大家融会贯通,并在工程上验证整个挖矿行为的生命周期。4.1 存储需求方(用户)我们在3.2章节中,描述了Filecoin体系下的各个身份和角色,其中,存储客户(Storage clients)定位为想存储数据的需求方用户,也是Filecon所期望构建的双边市场中十分重要的一环,类比滴滴打车的乘车者。Filecoin存储市场(上帝)将以公开透明的方式,搭建一个被记录在链上的订单池,供所有存储需求方(客户)选择和匹配存储提供方(矿工)。4.2 导入数据资源并获取CID在Filecoin存储网络之上,我们需要先将所存数据导入自身Filecoin节点客户端,并按照与IPFS很类似(应该是复用了)的处理流程进行了文件切片、散列处理和DAG建立,并生成子文件索引和内容ID(即:CID,在2.2章详细介绍过)。4.2.1 导入文本echo “Hi my name is jialesoho”> jialesoho.txtexport CID=go-filecoin client import ./jialesoho.txt# 反向验证是否成功导入go-filecoin client cat $CID4.2.2 导入图片export CID=go-filecoin client import ~/Desktop/your_test_img.jpggo-filecoin client cat $CID > image.png && open image.png4.2.3 导入视频export CID=go-filecoin client import ~/Desktop/your_test_video.mp44.3 查看Ask订单池在3.5章节中,我们模拟了矿工角色,并成功发送了ask订单至Filecoin存储市场之中,这里,我们再启动一台机器模拟用户节点,对全网的Ask订单池进行查询,并根据存储端(矿工)报价选择交易对象:go-filecoin client list-asks –enc=json | jq执行上述命令,遍历订单池后,会得到形如下方的json对象,解释一下每个字段意义:{ “Miner”: “fcqllepeqmcq9qnjff3rqfaz02ks8dvmandx4sa2d”,//矿工ID “Price”: “2.5”,//价格,单位FIL/byte/block “Expiry”: 588,//多少区块高度后订单过期 “ID”: 0,//同一个矿工ID可能具备多个Ask订单,用ID区分 “Error”: null//}如果需要在终端中依赖矿工ID来进行control+F快速选定,建议直接键入go-filecoin client list-asks4.4 选订存储协议当我们在Ask订单池上选定好心仪的订单和矿工ID后,便可通过如下指令签约了:go-filecoin client propose-storage-deal <miner> <data> <ask> <duration>miner:心仪的矿工ID信息data:4.2中所存数据的CID信息ask:同一个矿工ID可能具备多个Ask订单,此数据在订单池中可查duration:持续存储所经历的区块个数(平均30s一个新块产生,一天有效期大约需2880个新块)注意:因为是自己给自己灌数据,所以小编测试使用的是自己搭建的存储矿工节点,minerID:fcqllepeqmcq9qnjff3rqfaz02ks8dvmandx4sa2d,对应节点名称:jialesohoHK小编资源有限,尽量保证这台机器(还是友商好心赞助的)能稳定在线,并将本节点所获取的所有Mock FIL收益用以长期创建Ask订单,便于大家可以直接接入测试,不需要再自己模拟一个存储端(矿工)机器了(经济下行,能帮大家省一些是一些)。如下图所示,若选定存储协议成功,将直接更新订单状态为accepted,并返回DealID。问题与勘误如上图所示,大部分朋友可能会遇到:Error: error creating payment: context deadline exceeded这边小编复现了这个场景,并针对这个问题,和一些热心的读者交流(感谢詹总,东方风来、chinmusic),分析了一些可能造成的原因和解决方案,大家可以对号入座试试:1)检查是否FIL金额足够用户子弹不够…自然无法支付订单…,请检查余额,或者不要传太大的数据,注意单价是按照 byte (FIL/byte/block)来计算。2)检查矿工节点状态确保矿工节点在线,且是mining状态。3)检查P2P连接状态Filecoin体系中,节点网络与IPFS节点网络拓扑类似,每一个节点的邻居集群是有限的,通过彼此的邻居来间接建立联系是很常见的,因此,很有可能矿工节点和用户节点彼此并不直接相连,而需要吐槽的是,在测试网阶段,官方建议我们在确保矿工节点在线的同时,也需要直接将两个节点相连接。我们可以通过minerAddrsID来搜索矿工节点ID,并通过节点ID搜索其网络地址multiAddrs,并直接建立P2P连接操作如下:export peerID=go-filecoin addresss lookup minerIDexport multiAddrs=go-filecoin swarm findpeer $peerIDgo-filecoin swarm connect $multiAddrs注意:目前测试网的出块收益是直接划到worker矿工账户下的,而我们看到,通过刚才上方描述的p2p连接过程,是可以通过worker矿工的minerAddrsID层层索引到对方节点的IP地址,这对于收益方是存在相当大的安全隐患。这不,官方这段时间就做了如下调整,未来,将出块收益直接划到owner账户下,账户ID并不用暴露在交易市场中,提高了账户的安全性。5)确保所存单份数据大小小于扇区容量如果是devnet-user,小于单个扇区所分配的256MB即可。6)清空消息池go-filecoin mpool ls | xargs -L1 go-filecoin mpool rm具体缘由可追踪此 issue:https://github.com/filecoin-p…4.5 发送数据并建立微支付通道当我们使用go-filecoin client propose-storage-deal <miner> <data> <ask> <duration>接受订单后,用户节点将与存储端矿工节点建立微支付传输通道(防止单点故障,尽可能保证双方权益),即:传输百分之多少的piece数据,才支付对应百分之多少的FIL金额,这种微支付过程相当于把一手交钱一手交货这件事又做到了极致,拆分得更细小了,一直到最终整个文件传输完成。我们可以来看一下微支付中每个细分Payments的接口实现:type Payments interface { //建立每个pieceID所对应的微支付事务 Setup(target Address, piece Cid, value TokenAmount) ID //生成链上支付凭证 MakeVouchers(id ID, start, end BlockHeight, count int) []Voucher //异常后恢复支付凭证 RedeemVoucher(v Voucher, proof Proof)}同时,为了防止女巫攻击,Filecoin中节点与节点之间的数据传输,也会使用到IPFS中的bitswap模块(信用分系统)来过滤恶意节点和作弊节点。之后,存储端矿工节点会在一定时间间隔(可配置,默认为120秒)自动启动密封(seal)过程,即:获取之前微支付通道中暂存区域的所有数据,并将其密封到矿工的承诺存储区域中。此时,订单状态将转为staged。 注意,此过生成PoRep和PoSt的生成,比较耗存储端矿工机器资源:在密封完成并且矿工在链上生成凭证信息后,订单状态将移至posted。我们可以通过go-filecoin client query-storage-deal <dealID>来查询订单状态,也可以通过go-filecoin client payments <dealID>来查询这笔订单的链上凭证信息:如下图所示:4.6 在仪表盘中回看存储端状态登录Filecoin网络仪表盘:http://user.kittyhawk.wtf:8010/由于在第一章中,我们对存储端矿工节点设置了心跳链接,存储端矿工节点的数据信息会不间断地同步至Filecoin全网监控仪表盘上:搜索了一下jialesohoHK,找到了我们的存储端矿工节点信息,值得关注得是StoragePower与ProvenStorage两个参数此时都有了数值,我们的存储端矿工节点此时拥有了自己的算力:0.05%,即参与新块的生成的权益概率为万分之五,此值计算与存储量证明(Proof of Storage)逻辑强相关。有机器资源多的朋友,可以在测试过程中增加存储交易订单成单量,从而拉高ProvenStorage数值,进而提高StoragePower算力,这样,后续参与出块的概率将大大增加。同时,仪表盘也带给了我们许多其他统计,例如:近30天,IPFSMain(星际大陆团队)是测试矿工的主力军(有资源真心好),并且算力增长集中在2月18-20号左右,出块率提升显著,为优秀的中国矿工团队点赞!扩展:PoSt与PoRep的生命周期这块还没深挖,后面值得单独开章节研究,这里留个口子。至此,我们也通过工程操作,反向验证了第三章中所描述的存储矿工生命周期。我们将在下一章《【Filecoin源码仓库全解析】第五章:检索服务(矿工)的配置操作》中介绍与存储市场并驾齐驱而又息息相关的检索市场,以及检索服务(矿工)的基本配置操作。参考文献:https://github.com/filecoin-p…https://github.com/filecoin-p…往期系列文章回顾:【Filecoin源码仓库全解析】第一章:搭建Filecoin测试节点【Filecoin源码仓库全解析】第二章:如何创建账户钱包并获取FIL Mock代币【Filecoin源码仓库全解析】第三章(上):存储提供方(矿工)的配置操作【Filecoin源码仓库全解析】第三章(下):存储提供方(矿工)的配置操作本章赞助品牌:矿世大陆:一家专业的制造IPFS智能挖矿设备科技企业,提供智能硬件的设计、开发、制造及OEM 生产服务,同时满足客户在挖矿环节的配套需求,提供轻钱包支持、POC 矿池支持、存证算力合约平台支持、矿场托管等综合性服务。为企业级客户提供整套商业模式输出、运营指导、市场指导、市值管理、商业落地方案,提供专属挖矿软件开发,系统维护、ERC20代币制作、钱包开发、POC矿池开发、算力合约平台开发等区块链矿业技术开发服务。公司总部位于华中地区最大的城市武汉,拥有最成熟完整的产业供应链,我们的服务辐射全球,用户遍及世界。我们置身于区块链革命的第一线,投身IPFS生态建设,我们坚信IPFS将为世界带来更好的上网体验,创造更大的商业价值。感谢 矿世大陆(http://www.ksminer.com/) 对 嘉乐SOHO的原创内容提供支持。联系作者:本人从业经验有限,不免有不足之处,欢迎指正和更多讨论,可私信微信公众号:jialesoho,或者加我微信:daijiale6239,如果觉得对您有帮助,可以帮点击好看推广和打赏支持噢,感激不尽!(识别图中二维码,关注嘉乐SOHO微信公众号) ...

March 7, 2019 · 1 min · jiezi

【Filecoin源码仓库全解析】第三章(下):存储提供方(矿工)的配置操作

不好意思,这篇加了点八卦:本来是不太想说这事的,从18年看到现在,不少见圈里的朋友和友商互相吐槽乃至攻击…最近还闹得比较大。这里说两句:区块链存储在中国是一个刚诞生的新兴领域,探索阶段有错误是常态,至少大家都愿意把脸放下地在盘活这个行业。今天小编看到一句很深刻的话:强者互持,弱者互撕,希望大家能意识到:因为同行者,你的存在和你所做的事情才有意义…欢迎大家来到第三章的下篇,经过前章 【Filecoin源码仓库全解析】第三章(上):存储提供方(矿工)的配置操作的内容阅读后,我们应该能会对Filecoin存储市场机制和市场中的各角色职能有了更深刻的认知,并且可以配置自身节点角色,成为存储提供方(矿工),参与挖矿了。上一篇,我们讲解了如何在工程上申请存储矿工角色,本篇,我们将深度剖析存储矿工对象的源码结构,方便大家从根本上理解矿工的事务,并对一次挖矿的生命周期做一个总结。3.6 存储矿工对象剖析首先,我们来深度剖析一个存储矿工对象的源码结构,这样便于大家从根本上理解矿工的事务。3.6.1 StorageMinerActor我们在链上成功注册一个新的矿工身份后,Filecoin存储市场Actor(上帝)将调用CreateMiner()方法为我们生成一个新的存储矿工实例对象(StorageMinerActor),并返回其地址,这个新的实例对象结构如下:type StorageMinerActor interface { //矿工向存储市场发送订单的方法。 AddAsk(price TokenAmount, expiry uint64) AskID //提交扇区的方法。 CommitSector(commD, commR, commRStar []byte, proof SealProof) SectorID //用于向链上提交时空证明的方法,证明矿工已实际存储了其声称的文件。 SubmitPoSt(p PoSt, faults []FailureSet, recovered SectorSet, doneSet SectorSet) // 允许矿工为网络提供更多存储空间的方法 IncreasePledge(addspace Integer) // 若缺乏复制证明证据,将用此方法惩罚矿工 SlashStorageFault()3.6.2 StorageMinerState存储矿工会有自己的链上状态,仅在创建新区块时更新,并全网同步可追溯,可以理解为这是Filecoin网络为矿工们所维护的一组状态账本:type StorageMinerState struct { //Owner 是拥有此矿工节点的账户地址 Owner Address //Worker 是此矿工节点的工作账号地址 Worker Address //PeerID 是应该用于连接这个矿工节点的libp2p对等身份 PeerID peer.ID //PublicKey是矿工用于对区块进行签名的密钥的公共部分 PublicKey PublicKey //PledgeBytes是此矿工提供给网络的空间量 PledgeBytes BytesAmount //被锁定的抵押金额 Collateral TokenAmount //当前抵押金额 ActiveCollateral TokenAmount //未提取的抵押金额 DePledgedCollateral TokenAmount //提取抵押币的时间 DePledgeTime BlockHeight //Sectors 扇区集合 Sectors SectorSet //提交PoSt证明的扇区 ProvingSet SectorSet //在上一次PoSt提交期间状态变更为“完成”的一组扇区。 NextDoneSet SectorSet //矿工所拥有的算力算量 Power BytesAmount}3.6.3 Owner与Worker存储矿工角色有两个不同的地址:一个是Worker:负责完成所有事务活动,参与Ask订单、提交证明,提交新扇区等。另一个是Owner:地址是创建矿工的地址,支付抵押品,并获得出块奖励。小编认为需要这样区别和设计的原因归结为八个字:各司其职,安全第一。例如:Owner适合冷存密钥,安全级别更高,Worker常迁移和变更,安全级别更低。如下图所示,我们可以在~./filecoin/config.json下分别获取到worker和Owner的地址数据:Worker => minerAddressOwner => defaultAddress注意:查询Ask订单,选择交易时一定注意用worker地址来检索3.7 存储矿工的生命周期画了一个脑海中的草图,方便大家理解和记忆:如图所示,存储矿工的生命线主要有四条:存储交易创建区块停止挖矿失责惩罚(WIP)下面依次来介绍其生命周期中的这几个过程:3.7.1 存储交易Step1:操作节点参与链上身份注册,提交抵押与存储容量,成为一个存储矿工Step2:创建Ask订单,与用户节点交易。Step3:密封数据并提交复制证明(PoRep)于链上,更新订单状态,完成交易,并开启PoSt证明周期(证明期是矿工必须向网络提交空间时间证明的固定时间。)备注:这块内容可以继续深挖,后面有时间考虑单开一章节:与FilecoinProof相关Step4:存储矿工收集证明集合,创建PoSt,计算ProveStorage和StoragePower(算力)。备注:在证明期内,证明集会始终保持一致。在此期间系统增加的任何扇区都将顺延至下一个证明期内。Step5:当矿工完成他们的PoSt时,调用SubmitPoSt将其提交给网络,并伴随区块更新同步状态。3.7.2 创建区块当经历完存储交易的过程后,存储矿工已经具备了参与创建区块节点的竞选了,选票的生成逻辑如下所示://这块函数体内部逻辑官方提示将改动,就不一一解析了func IsTicketAWinner(t Ticket, minersPower, totalPower Integer) bool { return ToFloat(sha256.Sum(ticket)) * totalPower < minersPower}pTipSet := getHeaviestTipSet()smallestTicket := selectSmallestTicket(pTipSet)var tickets []SignaturebaseTicket := smallestTicketfor { challenge := sha256.Sum(baseTicket.Bytes()) postCount := estimator.GetPostCount(chain, pTipSet) proof := post.Prove(storage, challenge, postCount) ticket := minerPrivKey.Sign(sha256.Sum(proof.Bytes())) tickets = append(tickets, ticket) totalPower := getTotalPower(pTipSet) ourPower := getMinerPower(pTipSet, minerID) if IsTicketAWinner(ticket, ourPower, totalPower) { return tickets } else { baseTicket = ticket }}同时,为了防止女巫攻击,选票需要被其他节点验证,同时,自身也将验证其他节点的选票://这块函数体内部逻辑官方提示将改动,就不一一解析了func VerifyTicket(b Block) error { curTicket := selectSmallestTicket(b.Parents) for _, ticket := range b.Tickets { challenge := sha256.Sum(curTicket) if !VerifyProof(b.Proof, b.Miner, challenge) { return “Proof failed to validate” } pubk := getPublicKeyForMiner(b.Miner) if !pubk.VerifySignature(ticket, sha256.Sum(b.Proof.Bytes())) { return “Ticket was not a valid signature over the proof” } curTicket = ticket } state := getStateTree(b.Parents) minersPower := state.getPowerForMiner(b.Miner) totalPower := state.getTotalPower() if !IsTicketAWinner(curTicket, minersPower, totalPower) { return “Ticket was not a winning ticket” } return nil}创建区块之前,首先要赢得选票,令所有对等节点之间达成一致。这里涉及到预期(Expected Consensus)共识,简而言之:是Filecoin基于拜占庭容错基础上的改进版,策略是每一轮里选举出来一名或者多名存储矿工来创建新的区块,赢选票的可能性和矿工已分配的存储(即与上文中ProveStorage、StoragePower强相关) 成比例。备注:这块内容也可以继续深挖,后面有时间考虑单开一章节:与Expected Consensus相关当你侥幸获得一张优胜选票时,将创建新块,结构体如下所示://这块函数体内部逻辑官方提示TODO,应该后期改动会比较大type Block struct { Parents []*cid.Cid Tickets []Signature Proof post.Proof Ticket Signature MsgRoot *cid.Cid ReceiptsRoot *cid.Cid StateRoot *cid.Cid BlockSig Signature}当完成区块创建之后,随之而来的是丰厚的上帝奖励(FIL分发),具体的分发策略也处于WIP状态,目前测试网阶段是1000FIL/Block。3.7.3 停止挖矿如果需要停止采矿,矿工必须履行完所有存储订单(即:名下所有Ask订单状态为Poster),并在PoSt提交期间将其从证明集中删除。之后,可通过客户端指令调用DePledge()来取回他们的抵押品,并停止挖矿进程。备注:此过程也会参与链上操作。3.7.4 失责惩罚(WIP)如果矿工因未能按时提交PoSt而被slashed,他们将失去所有抵押品。备注:官方仍在Work in Process之中,需要更多社区的建议和讨论,目前设置了多种保险和重新验证机制,可见Filecoin也非常重视矿工的利益。参考文献:https://github.com/filecoin-p…https://github.com/filecoin-p…本章是一个基础铺垫,深挖了底层的原理,这是为了让我们对Filecoin系统的理解,不光只停留在工程指令集的操作上面。我们将在下一章《【Filecoin源码仓库全解析】第四章(下):存储需求方的配置操作》中重点介绍存储需求方(用户)的配置操作,并反过来验证第三章中存储矿工后续挖取新块的过程,帮助大家融会贯通,并在工程上验证整个挖矿行为的生命周期。本章赞助品牌:搜搜IPFS:是专注于IPFS生态的垂直媒体。内容涵盖IPFS的行业资讯、新闻动态、项目评测、人物专访等。我们努力为IPFS用户们创造更丰富,更有趣,更靠谱的媒体服务,致力于成为IPFS爱好者服务的媒体。目前已成为华中区最大、最具影响力的IPFS垂直媒体。感谢 搜IPFS 对嘉乐SOHO的原创内容提供支持。联系作者:本人从业经验有限,不免有不足之处,欢迎指正和更多讨论,可私信微信公众号:jialesoho,或者加我微信:daijiale6239,如果觉得对您有帮助,可以帮点击好看推广和打赏支持噢,感激不尽!(识别图中二维码,关注嘉乐SOHO微信公众号) ...

March 7, 2019 · 2 min · jiezi

【Filecoin源码仓库全解析】第三章(上):存储提供方(矿工)的配置操作

欢迎大家来到第三章,经过 前章《【Filecoin源码仓库全解析】第二章:如何创建账户钱包并获取FIL Mock代币的内容阅读后,我们应该能顺利在Filecoin系统中创建自己的账户钱包,并获取参与测试的FIL Mock代币了,本章,我们将配置自身节点角色,成为存储提供方(矿工),参与挖矿。第三章部分内容和数据来源于星际大陆(IPFSMAIN)詹总的私下交流,感谢星际大陆(IPFSMAIN)团队在此方面投入的机器资源成本和分享。由于这块周边内容比较多,因此拆为上下篇两部分来介绍。3.1 前章问题补充这几天后台收到了不少朋友的建议和求助,在linux环境上编译go-filecoin源码和安装遇到了大量的问题。别着急,别沮丧,毕竟juanbenet(协议实验室创始人)本人配置的过程也都不是一帆风顺:好消息是,晨雾科技团队为大家拉取了最新的源码,针对不是macOS的用户,编译好了一份目前(2月19日)最新的filecoin-Linux.tar.gz release包(内涵彩蛋,欢迎体验),免去了编译环节的繁琐步骤,下载渠道如下。下载地址:晨雾科技(mornmist.tech)linux版:https://github.com/mornmist/Filecoin-For-Chinese/releases/tag/0.0.23.2 身份与职能在第二章中,我们通过区分各个ID的概念知道了Filecoin体系中节点所扮演的两重角色,四重身份。而Filecoin作为一个去中心化的存储解决方案,对比目前成熟的中心化存储解决方案,这几种身份的职能可以类比为:存储矿工(Storage miners):比较像传统互联网中,负责专门存储数据的Web服务器检索矿工(Retrieval miners):比较像内容分发网络CDN的作用,负责检索抓取数据,服务于存储需求方用户。存储客户(Storage clients):想存储数据的需求方用户。检索客户(Retrieval clients):想检索数据的需求方用户。Filecoin体系中的节点同时具备这四重身份,并且集其身份所对应的功能于一身,在整个网络中发挥着对应的职能。这也是区块链网络区别于传统互联网的精髓之处。大家清楚了节点所承载的角色之后,会更加好理解后续的一些测试点和操作,也能同时从产品、技术等多个角度,更加理性地去分析和评判Filecoin的系统设计。3.3 Filecoin存储市场(上帝)节点之所以有多重身份与职能,主要是源于Filecoin体系中设计的市场机制。在这样的一个机制中,需求者和提供者基于存储合约(storage contracts)进行订单的发现、协商(双向选择)和交易。Filecoin中存在与以太坊中智能合约比较相似的设计,这块被定义为Actor,Actor在程序设计上是一个具有自己状态和方法集的链上对象。这个对象将被矿工、账户、存储市场 等多角色所继承。没错,存储市场(storage market)本身也是一个Actor。 为方便理解,可以类比为比特币系统中的 “上帝” (考虑到检索市场并不参与链上出块)。这是继承Actor后,存储市场(上帝)的部分接口实现:type StorageMarket interface { //通过指定公钥和自定的抵押FIL金额以及libp2p所要连接的节点ID,来创建存储矿工角色 CreateStorageMiner(pubk PublicKey, pledge BytesAmount, pid libp2p.PeerID) Address //检测到矿工存在作弊行为时,需要削减奖励 SlashConsensusFault(blk1, blk2 BlockHeader) //在规定的时间内无法提供PoSt证明,抵押代币将被削减 SlashStorageFault(miner Address) //动态更新当前存储市场参与者数据与总存储量等数据 UpdateStorage(delta BytesAmount) //全网总算力计算 GetTotalStorage() BytesAmount}3.4 成为一名存储矿工成为存储矿工:意味着默认接受Filecoin存储市场Actor的规则,进行挖矿行为。即 Code is law。意味着将是推动Filecoin网络共识处理流程的积极参与者,也是期望共识(EC)的区块提议者。意味着随时在线,等待接受客户的存储订单,并提供存储服务,并密封扇区数据,赚取FIL。意味着应该不断地执行时空证明(PoSt),以证明能否参与出块竞选。还意味着,你规规矩矩地做了这么多事情后,到头来!!!真得能得到Filecoin存储市场Actor(上帝)所分配的额外出块奖励。创建矿工ID创建矿工身份,获取ID,需要承诺能提供存储服务的10个扇区(扇区大小和测试网络环境相关,如下),在【Filecoin源码仓库全解析】第一章:搭建Filecoin测试节点中,测试网络有多种类型:devnet-user :针对普通用户,扇区(SECTORS)为256MiBdevnet-nightly :针对开发者用户,扇区(SECTORS)为1KiB,可节约封闭扇区耗时,便于测试。测试网络的选择,在初始化的时候指定,并在启动daemon过程时,需要加上:env FIL_USE_SMALL_SECTORS=true go-filecoin daemon承诺能提供存储服务的扇区之后,需要抵押100FIL,设置消息的gas price为0FIL/unit,限制1000 gas units(和以太坊的gas类似,合约函数的防死循环限制)。brew install jqgo-filecoin miner create 10 100 –price=0 –limit=1000 –peerid QmQ43XdtJAmSwZMA8QijJd4Zo1fT9YgsKevNbr158aAmif这样的设置缘由是:除了抵押之外,这样不需要额外花费FIL。执行成功后,将等待一段时间,此过程耗时取决于网络环境,小编耗时12分钟左右:之后,会返回给你生成好的矿工ID,并且系统中多出了一部分的磁盘空间被此程序虚拟化成扇区空间。启动挖矿进程go-filecoin mining startFilecoin区块链浏览器验证我们可以登录:http://nightly.kittyhawk.wtf:8000/在Filecoin区块链浏览器中查询验证我们的矿工Actor:结束挖矿进程go-filecoin mining stop3.5 设置并发送Ask订单在创建好矿工身份之后,我们可以初始化一个Ask订单配置,启动挖矿进程后,Filecoin存储市场中的用户,可以根据网络中矿工们的众多Ask订单价格和容量来自由选择。Ask订单配置项:矿工worker地址矿工owner地址FIL/byte/block的单价适用于此后多少个区块生成的时间gas单次燃烧所需的FIL费用值(参考以太坊)gas limit总数(参考以太坊)我们通过命令行来创建一个Ask订单,并发送至区块链网络:export MINER_ADDR=go-filecoin config mining.minerAddress | tr -d \" export MINER_OWNER_ADDR=go-filecoin miner owner $MINER_ADDRgo-filecoin miner set-price –from=$MINER_OWNER_ADDR –miner=$MINER_ADDR –price=0 –limit=1000 0.0001 1000如下图所示:拿到askid和chain block值后,等待区块同步一会(一般2分钟左右),我们可以通过如下方式,确认我们的Ask订单是否更新完成:go-filecoin client list-asks –enc=json | jq 也可以double check一下本地的config.json中的storagePrice属性值是否已经更新:vim ~/.filecoin/config.json目前测试网在创建完成订单后的交易过程是自动化的,同时交易的用户方目前在选择矿工时,是处于定向连接选择,并不像如设计方案中的自由选择, 可以想象为:矿工需要在早期自己模拟多个身份节点,自己给自己灌数据来测试。“灌数据“的整个过程也非常重要,在此期间,存储订单会经历三种状态:第一种是接收订单后,accepted第二种是密封过程中,staged第三种是posted,达到posted,说明成功了存储订单的交易成功,将会决定存储算力Storage Power和Proven Storage这两个重要的参数,这与矿工后续参与出块的权益概率直接挂钩。我们会在后面的《【Filecoin源码仓库全解析】第三章(下):存储提供方(矿工)的配置操作》章节重点介绍这个过程。参考文献https://github.com/filecoin-p…https://github.com/filecoin-p…本章赞助品牌:深圳牛链科技有限公司 ,是一家专注存储类IPFS矿机研发、生产、销售、托管为一体的高科技企业。 目前技术团队包括IPFS硬件技术研发,IPFS协议研究,IPFS底层程序开发,IPFS应用程序研发,并在成都专门成立研发中心。2018年,研发中心团队在研究IPFS底层协议的基础上,开始搭建并运营IPFS高速网络系统,并正积极研发基于IPFS的网络应用。牛链科技的技术研发团队全力以赴研究Filecoin的运行机制,优化矿场配置,作为一家区块链技术服务提供商,致力于为广大用户提供优质的信息技术服务。牛链希望以技术驱动效率,为Filecoin落地提供基础设施。感谢 深圳牛链科技有限公司 对嘉乐SOHO的原创内容提供支持。联系作者:深夜写作,不免有不足之处,欢迎指正和更多讨论,可私信微信公众号:jialesoho,或者加我微信:daijiale6239,如果觉得对您有帮助,可以帮点击好看推广和打赏支持噢,感激不尽!(识别图中二维码,关注嘉乐SOHO微信公众号) ...

March 7, 2019 · 1 min · jiezi

EOS钱包区块链核心业务开发详解

区块链钱包是什么?很多人会把它理解为微信支付宝钱包等,然而区块链钱包里没有数字货币,数字货币存储在区块链上,钱包作为公私钥的管理工具,用户通过钱包与区块链平台上的DApp 进行交互。区块链钱包对于区块链而言好比浏览器对于互联网一样。早期人们对于在浏览器上输入url和域名访问互联网都很陌生,但现在浏览器已经成为互联网的重要入口,被几十亿人使用。在区块链上也将会发生同样的一个演变过程,对大多数人来说,现在区块链是陌生的,随着区块链用户从数百万人激增到数千万人,那么许多团队对钱包的这个入口战略资源的争夺将比互联网时代 的浏览器更加激烈。在区块链领域,钱包毫无疑问有举足轻重的地位,很容易理解区块链钱包的应用价值:作为支付的入口随着闪电网络、雷电网络等链外支付以及分片、子链等技术的成熟,未来一旦数字代币支付成为主流的支付方式之一。那么钱包作为入口,就有很大的想象空间。作为资产管理的入口目前比特币、以太坊、EOS等公链越来越多,协议和应用越来越多,token也越来越多,中心化交易所、去中心化交易所、量化交易等都在发展。现在,一些钱包提供了理财的功能,一些长期价值投资的用户把代币存入钱包进行理财。作为交易的入口对于用户来说,在钱包就可实现快速的交易。钱包由于沉淀了很多用户的数字资产,当用户需要进行交易时,钱包与一些去中心化或中心化的交易所结合,用户输入自己的理想价格,可以实现尽快的撮合交易。作为DApp市场入口随着公链的成熟,尤其是EOS、以太坊等区块链基础设施的逐步完善,一些游戏类、金融类、社交类、泛娱乐类的DApp应用逐步发展起来。随着成千上万,甚至是几十万上百万的DApp,用户需要有一个地方去发现和下载。对于钱包来说,DApp市场入口绝对是最具想象力的前景。为什么要了解EOS钱包?有着区块链3.0之称的EOS拥有庞大的用户群体,自2018年6月份主网上线以来,注册帐户已经达到60万,而算上没有EOS帐户但在交易平台持有EOS代币的用户,可能这个数字已经超过百万:在EOS平台上开发的DApp如雨后春笋般纷纷出世,主网上现在跑的DApp已经超过了200个,其活跃量、交易量也早已超越了以太坊。这些开发团队以及个体开发者选择基于EOS开发,首先是EOS网络对开发者友好,适宜DApp应用程序开发;其次开发者对于EOS生态的未来有信心。钱包作为数字货币资产的存储和Dapp的超级流量入口,其市场需求较大,创建和管理钱包是进入区块链领域的必修课。因此我们推出本课程,自己来开发一个EOS钱包,旨在帮助区块链用户 和应用开发者全面快速地掌握区块链钱包开发的知识技能与业务流程。课程项目简介课程项目是一个手机EOS钱包,最终的实现效果如下图所示:用户可以导入自己的账号,也可以创建新的测试网账号,可以在钱包的多个账号间切换活动账号。一旦选中的当前活动账号,用户就可以查看自己的资产总览信息,也可以向其他账号转账,或者浏览自己的转账历史记录。钱包也提供了DApp开发者关心的资源管理功能。使用钱包可以购买或者出售内存资源,也可以抵押EOS获取CPU或者NET资源。作为区块链的入口,我们的钱包不仅提供了管理自己EOS账号的能力,还可以提供更多的增值服务,例如DApp推荐、市场行情、新闻动态等。课程项目技术栈概述本课程项目采用NodeJS的全栈式开发模式,基于npm+webpack的工作流,为了顺利地完成本课程的学习,你应该对以下语言/技术有一些了解:本课程采用Webpack把项目当做一个整体,从一个给定的主文件(如:index.js)开始找到项目的所有依赖文件(JavaScript,CSS和Fonts以及Image等等),通过合适的loaders处理它们,最后打包为一个浏览器可识别的JavaScript文件。本课程使用Facebook的Web App解决方案React技术栈(react+redux+react-router)以及基于React实现的UI框架Antd-Mobile,帮助学员快速完成前端H5页面的开发并提供给用户优质的用户体验。Eosjs是访问EOS区块链的JavaScript库,提供了大量简单易用的EOS的HTTP API封装方法, 其作用就像web3.js对于Ethereum或者neon-js对于Neo一样。课程内容概述本课程面向广大对EOS开发感兴趣的朋友,是目前市面上理论与实战相结合最全的EOS开发项目,内容涵盖EOS开发相关的基本概念,并围绕EOS钱包项目开发逐步进行讲解,最终实现一个EOS钱包。第一章:概述介绍什么是区块链钱包;分析区块链钱包的应用价值,阐述本课程的目的;并介绍课程项目使用的技术栈,引入对学习者基础知识技能的要求。第二章:理解EOS账户与钱包引入EOS账户、密钥、钱包等概念。介绍如何获取第一个EOS账号,以及如何查询账号信息。解释为什么主网中创建账户的是需要费用的。阐述助记词、keystore、密码与私钥的关系。并通过账户权限与钱包相关的操作,学习EOS账户权限和官方钱包命令等知识。第三章:需求分析与总体设计项目需求分析与总体设计,阐述项目功能模块划分、系统整体架构、前端服务层设计、前端状态机、第三方服务清单等。第四章:前端服务组件实现实现前端服务组件,封装手机钱包的核心功能,例如账号创建、账号导入、转账交易、交易历史查询、资产管理、资源管理等。第五章:前端UI组件实现学习如何利用React实现钱包的前端UI组件,如何利用React-Router前端路由切换组件,如何使用Redux状态库实现前端状态管理。感兴趣的同学可以试试,深入浅出玩转EOS钱包开发,本课程以手机EOS钱包的完整开发过程为主线,深入学习EOS区块链应用开发,课程内容即涵盖账户、计算资源、智能合约、动作与交易等EOS区块链的核心概念,同时也讲解如何使用eosjs和eosjs-ecc开发包访问EOS区块链,以及如何在React前端应用中集成对EOS区块链的支持。课程内容深入浅出,非常适合前端工程师深入学习EOS区块链应用开发。

March 6, 2019 · 1 min · jiezi

与 Rust 社区亲密接触!首届 RustCon Asia 来了

首先抢票:www.huodongxing.com/event/64794…大会官网:rustcon.asia2019 年 4 月 20 日在北京望京凯悦,在秘猿科技与 PingCAP 携手下,我们开始即将开启第一场 RustCon Asia。大会为期 4 天,1.5 天主题演讲,2 天动手研讨 workshop。Rust 是一门比较现代的,吸收了最近几十年在语言设计和编译器方面的优秀精华的语言。我们非常喜欢他的设计,尤其是 Rust 在工程方面展现出的强大优势:Performance 高性能!Reliability 可靠!Productivity 效率!Rust 是被生产环境验证并且取得成功的语言,秘猿科技基于 Rust 开发的系统在国内最顶级的金融系统中跑的一些项目,已经充分验证了 Rust 的能力。另外,Rust 社区是一个我们最推崇的那种包容、开放的社区,Rust 的每一项改进,都是通过 RFC 去讨论、去达成共识再实现。Rust 这种基于 RFC 的机制给了这门语言极为旺盛的生命力和开放度,我们信仰开放的文化更有机会成功,所以我们在做自己的项目的时候,也借鉴了 RFC 机制。Rust 海外社区非常活跃,我们一直在吸收,现在是合适的时间去反哺社区。从去年开始,我们趁着各种机会开始投入 Rust 社区。我们开始了每月一次的 Rust Dev Sharing,第一场的直播达到了 2000 人同时在线;第二次,Bilibili 的雪松老师在工作日从上海跑来杭州加入了分享。我们感受到了 Rust 社区的激情,看到国内越来越多的 Rust 项目,也笃定 Rust 是未来。去年 11 月,秘猿科技赞助并参与了罗马的 RustFest 为期 4 天的大会,会上我们碰到了 Rust team 的 Aaron、Pascal、Steve、Florian,社区活跃开发者,当然还有 PingCAP 的伙伴 Ana(Hoverbear)。即便有着跨文化沟通的障碍存在,大家对亚洲的 Rust 大会都表达出非常地期待,以至于在活动官网还没上线的时候,欧美的 Rust 社区就已经知晓并传播中国 Rust 大会的声音。Rust Language 的 Twitter @rustlang 还在除夕夜发了一条「猪年大吉」的推文!经过春节假期,我们在 2 月 15 日上线 RustCon Asia 官网(http://rustcon.asia),接下来 2 周时间我们的 CFP(Call For Proposals) 流程共计收到中英文 proposal 50 份。社区小伙伴热情帮推,除了各种群、朋友圈、知乎、Twitter 帮扩散,《Rust 编程之道》作者汉东老师将大会信息发到了 Rust 的每日订阅频道,有国外来不了的小伙伴购买了 donation 票,作为对大会的支持。与其说这是我们组织的大会,不如说是社区驱动的结果。在此也特别感谢帮助推广 RustCon Asia 信息的社区合作伙伴我们在此再次介绍一下大会详情安排: 4.20-21 为一天半的 keynote 演讲——要从 50 份 proposal 里面评选出 14 位优秀讲师!不用担心语言问题,我们有同传!4.22-23 为两天的 workshop,3 个房间同时进行——你可以有更丰富更自由的选择!这是一场属于社区的大会,除了正经的大会安排,我们也强烈建议现场及时行乐,各种组小队约饭、约咖啡、约酒,其它约什么我们不管(邪恶微笑)。毕竟一年仅此一次!扩散起来,邀请更多的小伙伴一起来嗨!Rust 爱好者、开源爱好者、技术社区贡献者、来旁观大家怎么嗨的,就是你们了!Rust 可以让人重新爱上编程!请肆无忌惮地炫耀,Rust 社区真的很棒。另外八卦一下大会门票 399,包含大会的 350 自助午餐!限额四百张,购票进行中~ ...

March 6, 2019 · 1 min · jiezi

喜报!Nervos 研究员张韧论文被顶级安全会议 IEEE S&P 接收!

近日,Nervos & Cryptape 研究员张韧发表的《Lay Down the Common Metrics: Evaluating Proof-of-Work Consensus Protocols’ Security》被 IEEE S&P(Oakland)接收,这也是中国大陆的区块链团队第一次在区块链行业核心会议上发表相关论文。IEEE S&PIEEE S&P 全称 IEEE Symposium on Security and Privacy(IEEE 安全与隐私研讨会),是计算机安全领域的四大安全会议(CCS、S&P、USENIX、NDSS)之一,也被认为是计算机安全领域的最高级别会议。为了与一个叫做 IEEE Security & Privacy 的期刊做区分,也有人用 Oakland 代指该会议,因为该会议每年都在美国 Oakland 举行。该会议在 CCF 推荐列表中是 A 类会议。CCF(中国计算机学会)是计算机领域的全国性权威学术组织,其评定的计算机学会推荐国际刊物会议列表是国内最权威的计算机学术会议级别列表。该列表将计算机各领域方向划分成 10 个类别,每个类别选取高水平的会议和刊物并由专家组评定级别,分 A、B、C 三级,A 类会议级别最高,论文发表的难度和论文水平也相对最高。由于区块链与计算机安全以及密码学的天然联系,四大安全会议、三大密码学会议(CRYPTO、EUROCRYPT、ASIACRYPT)以及 FC 构成了行业中最重要的学术会议,区块链领域中最重要的论文都发表在这几大会议上,S&P 因此也是区块链行业的核心会议之一。关于论文张韧是鲁汶大学 COSIC 在读博士,前 Blockstream 研究员,长期专注于区块链共识协议、安全和隐私研究。在该论文中,张韧介绍了一种用于定量分析 PoW 协议的链质量和抗攻击性能的多指标评估框架,提出了 PoW 安全分析中的几个常见缺陷,并指出了更安全的 PoW 协议未来的发展方向。我们截取了《Lay Down the Common Metrics: Evaluating Proof-of-Work Consensus Protocols’ Security》论文的摘要。论文链接如下:https://www.esat.kuleuven.be/…论文摘要:数百种加密货币参照比特币的 Nakamoto Consensus 协议(NC,中本聪共识),采用工作证明(PoW)机制来维护其网络。然而,研究表明,NC 无法实现完美的链质量,它允许恶意矿工改变公共账本,以便发起多种攻击,即自私采矿,双花攻击和羽毛分叉。以以太坊,比特币 NG,DECOR +,Byzcoin 为代表的一些后期设计(还有一些做出来的,有一些销声匿迹的设计),旨在通过提高链的质量来解决问题;以 FruitChains,DECOR +、Subchains 为代表的其他协议声称,它们可以在链的质量并不完美的情况下抵御攻击,因此它们不需要提高链的质量。由于它们的自称未得到有效性证实,社区对是否存在安全的 PoW 协议存在分歧。为了解决这种分歧并且制定通用的标准,本篇论文介绍了一种用于定量分析 PoW 协议的链质量和抗攻击性能的多指标评估框架。随后,我们利用此框架,通过马尔可夫决策过程法,评估这些改进方案的安全性。我们得出的结论是,到目前为止,没有任何一种 PoW 协议能够实现理想的链质量或抵抗以上三种攻击。我们将现有 PoW 协议链质量的不完美归因于不切实际的安全假设,不完善的攻击抵抗能力则是由于「奖励作恶」和「惩罚好的」的两难困境。此外,我们的分析还列举了多种新的、针对特定协议的攻击策略。根据分析,我们提出了 PoW 安全分析中的几个常见缺陷,并指出了更安全的 PoW 协议未来的发展方向。如果您对本篇论文有任何的想法,欢迎和我们一起讨论。推荐阅读:张韧的共识安全性分析文章《制定通用的标准:评估 PoW 共识协议的安全性》张韧从带宽利用率角度分析共识协议文章《Nervos CKB 共识协议 NC-Max:突破 Nakamoto Consensus 吞吐量的极限》关于 NervosNervos Network 由 Nervos 基金会推动,通过分层架构为未来加密经济提供基础设施。其底层公有链 CKB (Common Knowledge Base)作为核心的信任基础设施,用于支撑二层扩展方案,保证了安全和去中心化。Nervos Network 通过分层设计,兼顾性能、安全以及去中心的特性,从而满足多样化的商业应用。活动预告4 月 20 日至 23 日,亚洲第一届 Rust 大会将在中国·北京正式开启。届时,Nervos 团队也会参加,欢迎扫码直达链接报名,我们期待和大家见面!这是一场属于社区的大会,请来和我们一起肆无忌惮地炫耀,Rust 社区贼棒!中外 Rust 爱好者、开源爱好者、社区技术贡献者齐相聚~ ...

March 5, 2019 · 1 min · jiezi

基于Mixin Network的Go语言比特币开发教程 : 用 Mixin Messenger 机器人接受和发送比特币

基于Mixin Network的Go语言比特币开发教程 : 用 Mixin Messenger 机器人接受和发送比特币在 上一篇教程中, 我们创建了自动回复消息的机器人,当用户发送消息"Hello,World!“时,机器人会自动回复同一条消息!按本篇教程后学习后完成后,你的机器人将会接受用户发送过来的加密货币,然后立即转回用户。完整代码如下:main.gofpackage mainimport ( “context” “encoding/base64” “encoding/json” “log” “github.com/MooooonStar/mixin-sdk-go/messenger” mixin “github.com/MooooonStar/mixin-sdk-go/network”)type Listener struct { *messenger.Messenger}// interface to implement if you want to handle the messagefunc (l *Listener) OnMessage(ctx context.Context, msg messenger.MessageView, userId string) error { data, err := base64.StdEncoding.DecodeString(msg.Data) if err != nil { return err } if msg.Category == “SYSTEM_ACCOUNT_SNAPSHOT” { var transfer messenger.TransferView if err := json.Unmarshal(data, &transfer); err != nil { return err } log.Println(“I got a coin: “, transfer.Amount) mixin.Transfer(msg.UserId,transfer.Amount,transfer.AssetId,”",messenger.UuidNewV4().String(), PinCode,PinToken,UserId,SessionId,PrivateKey) return nil // return l.SendPlainText(ctx, msg.ConversationId, msg.UserId, string(data)) } else if msg.Category == “PLAIN_TEXT” { log.Printf(“I got a message, it said: %s”, string(data)) if string(data) == “g” { payLinkEOS := “https://mixin.one/pay?recipient=" + msg.UserId + “&asset=” + “6cfe566e-4aad-470b-8c9a-2fd35b49c68d” + “&amount=” + “0.1” + “&trace=” + messenger.UuidNewV4().String() + “&memo=” payLinkBTC := “https://mixin.one/pay?recipient=" + msg.UserId + “&asset=” + “c6d0c728-2624-429b-8e0d-d9d19b6592fa” + “&amount=” + “0.001” + “&trace=” + messenger.UuidNewV4().String() + “&memo=” log.Println(payLinkBTC) BtnEOS := messenger.Button{Label: “Pay EOS 0.1”, Color: “#0080FF”, Action: payLinkEOS} BtnBTC := messenger.Button{Label: “Pay BTC 0.0001”, Color: “#00FF80”, Action: payLinkBTC} if err := l.SendAppButtons(ctx, msg.ConversationId, msg.UserId, BtnEOS, BtnBTC); err != nil { return err } return nil } else if string(data) == “a” { card := messenger.AppCard{Title: “Pay BTC 0.0001”, Description: “topay”, Action: “http://www.google.cn”, IconUrl: “https://images.mixin.one/HvYGJsV5TGeZ-X9Ek3FEQohQZ3fE9LBEBGcOcn4c4BNHovP4fW4YB97Dg5LcXoQ1hUjMEgjbl1DPlKg1TW7kK6XP=s128"} if err := l.SendAppCard(ctx, msg.ConversationId, msg.UserId, card); err != nil { return err } return nil } else if string(data) == “r” { mixin.Transfer(msg.UserId,“0.0001”,“c6d0c728-2624-429b-8e0d-d9d19b6592fa”,”",messenger.UuidNewV4().String(), PinCode,PinToken,UserId,SessionId,PrivateKey) return nil } else { return l.SendPlainText(ctx, msg.ConversationId, msg.UserId, string(data)) } } else { log.Println(“Unknown message!”, msg.Category) return err }}const ( UserId = “21042518-85c7-4903-bb19-f311813d1f51” PinCode = “911424” SessionId = “4267b63d-3daa-449e-bc13-970aa0357776” PinToken = “gUUxpm3fPRVkKZNwA/gk10SHHDtR8LmxO+N6KbsZ/jymmwwVitUHKgLbk1NISdN8jBvsYJgF/5hbkxNnCJER5XAZ0Y35gsAxBOgcFN8otsV6F0FAm5TnWN8YYCqeFnXYJnqmI30IXJTAgMhliLj7iZsvyY/3htaHUUuN5pQ5F5s=” //please delele the blank of PrivateKey the before each line PrivateKey = -----BEGIN RSA PRIVATE KEY-----MIICXQIBAAKBgQCDXiWJRLe9BzPtXmcVe6acaFTY9Ogb4Hc2VHFjKFsp7QRVCytx3KC/LRojTFViwwExaANTZQ6ectwpAxIvzeYeHDZCXCh6JRFIYK/ZuREmYPcPQEWDs92Tv/4XTAdTH8l9UJ4VQY4zwqYMak237N9xEvowT0eR8lpeJG0jAjN97QIDAQABAoGADvORLB1hGCeQtmxvKRfIr7aEKak+HaYfi1RzD0kRjyUFwDQkPrJQrVGRzwCqGzJ8mUXwUvaGgmwqOJS75ir2DL8KPz7UfgQnSsHDUwKqUzULgW6nd/3OdDTYWWaNcDjbkEpsVchOpcdkywvZhhyGXszpM20Vr8emlBcFUOTfpTUCQQDVVjkeMcpRsImVU3tPYyiuqADhBTcgPBb+Ownk/87jyKF1CZOPvJAebNmpfJP0RMxUVvT4B9/U/yxZWNLhLtCXAkEAnaOEuefUxGdE8/55dUTEb7xrr22mNqykJaax3zFK+hSFBrM3gUY5fEETtHnl4gEdX4jCPybRVc1JSFY/GWoyGwJBAKoLti95JHkErEXYavuWYEEHLNwvmgcZnoI6cOKVfEVYEEoHvhTeCkoWHVDZOd2EURIQ1eY18JYIZ0M4Z66R8DUCQCsKiKTR3dA6eiM8qiEQw6nWgniFscpf3PnCx/Iu3U/m5mNr743GhM+eXSj7136b209IYfEoQiPxRz8O/W+NBV0CQQDVPxqJlFD34MC9aQN42l3NV1hDsl1+nSkWkXSyhhNRMpobtV1a7IgJGyt5HxBzgNlBNOayICRf0rRjvCdw6aTP-----END RSA PRIVATE KEY-----)func main() { ctx := context.Background() m := messenger.NewMessenger(UserId, SessionId, PrivateKey) l := &Listener{m} go m.Run(ctx, l) select {}}你好, 比特币!在项目目录下编译并执行cd mixin_labs-go-botgo build./mixin_labs-go-bot开发者可以通过消息面板,给机器人转比特币,当机器人收到比特币后,马上返还给用户!事实上,用户可以发送任意的币种给机器人,它都能马上返还!源代码解释if msg.Category == “SYSTEM_ACCOUNT_SNAPSHOT” { var transfer messenger.TransferView if err := json.Unmarshal(data, &transfer); err != nil { return err } log.Println(“I got a coin: “, transfer.Amount) mixin.Transfer(msg.UserId,transfer.Amount,transfer.AssetId,”",messenger.UuidNewV4().String(), PinCode,PinToken,UserId,SessionId,PrivateKey) return nil // return l.SendPlainText(ctx, msg.ConversationId, msg.UserId, string(data))}调用SDK的 mixin.Transfer 将币返还用户!高级用法APP_BUTTON_GROUP在一些应用场景,比如:有一个交易所想提供换币服务,将比特币换成以太坊,EOS,比特币现金等,你想显示给用户一组按钮,它们分别代表不同的币与不同的数量,APP_BUTTON_GROUP可以帮你做到这一点.payLinkEOS := “https://mixin.one/pay?recipient=" + msg.UserId + “&asset=” + “6cfe566e-4aad-470b-8c9a-2fd35b49c68d” + “&amount=” + “0.1” + “&trace=” + messenger.UuidNewV4().String() + “&memo=“payLinkBTC := “https://mixin.one/pay?recipient=" + msg.UserId + “&asset=” + “c6d0c728-2624-429b-8e0d-d9d19b6592fa” + “&amount=” + “0.001” + “&trace=” + messenger.UuidNewV4().String() + “&memo=“log.Println(payLinkBTC)BtnEOS := messenger.Button{Label: “Pay EOS 0.1”, Color: “#0080FF”, Action: payLinkEOS}BtnBTC := messenger.Button{Label: “Pay BTC 0.001”, Color: “#00FF80”, Action: payLinkBTC}if err := l.SendAppButtons(ctx, msg.ConversationId, msg.UserId, BtnEOS, BtnBTC); err != nil { return err}这里演示给用户BTC与EOS两种,你还可以增加更多的按钮.APP_CARD如果你觉得一组按钮太单调了,可以试一下APP_CARD,它提供一个图标的链接card := messenger.AppCard{Title: “CNB”, Description: “Chui Niu Bi”, Action: “http://www.google.cn”, IconUrl: “https://images.mixin.one/0sQY63dDMkWTURkJVjowWY6Le4ICjAFuu3ANVyZA4uI3UdkbuOT5fjJUT82ArNYmZvVcxDXyNjxoOv0TAYbQTNKS=s128"}if err := l.SendAppCard(ctx, msg.ConversationId, msg.UserId, card); err != nil { return err}Full source code ...

March 4, 2019 · 3 min · jiezi

Bytom的链式交易和花费未确认的交易

当我们基于比原做应用的时候,在构建交易过程中会遇到以下两种情况。多个地址向一个地址转账,还有一种就是从一个地址分批次向多个地址转账。那我们今天就来介绍一下这两种交易构建的具体流程,以及贴出具体实现的代码。链式交易当我们从多个钱包地址一次性转到一个地址的时候,为了提高用户体验。我们可以选择链式交易,把多笔交易一次性打包。那我们下面就来看一下链式交易的流程。接下来我们来看一下build-transaction接口的代码实现过程,代码如下:// POST /build-chain-transactionsfunc (a *API) buildChainTxs(ctx context.Context, buildReqs *BuildRequest) Response { //验证请求id subctx := reqid.NewSubContext(ctx, reqid.New()) //构建交易,方法的具体过程在下面 tmpls, err := a.buildTxs(subctx, buildReqs) if err != nil { return NewErrorResponse(err) } return NewSuccessResponse(tmpls)}核心的实现方法,buildTxs方法的实现如下:func (a *API) buildTxs(ctx context.Context, req *BuildRequest) ([]*txbuilder.Template, error) {//验证参数的合法性if err := a.checkRequestValidity(ctx, req); err != nil { return nil, err}//合并处理交易输入输出的类型组合actions, err := a.mergeSpendActions(req)if err != nil { return nil, err}//构建一笔新的交易模板builder := txbuilder.NewBuilder(time.Now().Add(req.TTL.Duration))//声明交易模板tpls := []*txbuilder.Template{}//遍历交易的输入输出类型组合for _, action := range actions { //类型组合的输入为apend_account if action.ActionType() == “spend_account” { //构建花费的输入输出类型组合并且自动合并UTXO tpls, err = account.SpendAccountChain(ctx, builder, action) } else { //构建交易输入输出类型组合 err = action.Build(ctx, builder) } if err != nil { //回滚 builder.Rollback() return nil, err }}//构建交易tpl, _, err := builder.Build()if err != nil { //回滚 builder.Rollback() return nil, err}tpls = append(tpls, tpl)return tpls, nil}build方法的实现过程:// Build build transactions with templatefunc (b *TemplateBuilder) Build() (*Template, *types.TxData, error) {// Run any building callbacks.for _, cb := range b.callbacks { err := cb() if err != nil { return nil, nil, err }}tpl := &Template{}tx := b.baseif tx == nil { tx = &types.TxData{ Version: 1, }}if b.timeRange != 0 { tx.TimeRange = b.timeRange}// Add all the built outputs.tx.Outputs = append(tx.Outputs, b.outputs…)// Add all the built inputs and their corresponding signing instructions.for i, in := range b.inputs { instruction := b.signingInstructions[i] instruction.Position = uint32(len(tx.Inputs)) // Empty signature arrays should be serialized as empty arrays, not null. if instruction.WitnessComponents == nil { instruction.WitnessComponents = []witnessComponent{} } tpl.SigningInstructions = append(tpl.SigningInstructions, instruction) tx.Inputs = append(tx.Inputs, in)}tpl.Transaction = types.NewTx(*tx)tpl.Fee = CalculateTxFee(tpl.Transaction)return tpl, tx, nil}到此,我们的链式交易的代码到此就讲解到这儿。如果感兴趣想仔细阅读源码,点击源码地址:https://git.io/fhAsr花费未确认的交易下面我们来介绍一下花费未确认的交易,我们首先介绍一下什么是花费未确认的交易。我们知道UTXO模型在交易的过程中,如果交易未打包确认。再进行第二笔转账就会存在“双花”问题,就不能再发起交易或者需要等一段时间才能再发起一笔交易。如果使用花费未确认的交易就可以避免这个问题。那么花费未确认的交易实现机制是什么样的呢?我们在创建第一笔交易的时候,会找零,此时交易是未确认的状态。找零存在交易池中,我们发第二笔交易的时候就直接使用在交易池中找零地址里面的资产。那我们来看一下花费未确认交易的代码实现过程,花费过程结构体如下:type spendAction struct { accounts *Manager //存储账户及其相关的控制程序参数 bc.AssetAmount //资产id和资产数量的结构体 AccountID string json:"account_id" //账户id UseUnconfirmed bool json:"use_unconfirmed" //是否未确认}方法如下:// MergeSpendAction merge common assetID and accountID spend actionfunc MergeSpendAction(actions []txbuilder.Action) []txbuilder.Action { //声明变量,map resultActions := []txbuilder.Action{} spendActionMap := make(map[string]*spendAction) //遍历交易的输入输出类型组合 for _, act := range actions { switch act := act.(type) { case *spendAction: //actionKey字符串拼接 actionKey := act.AssetId.String() + act.AccountID //遍历spendActionMap if tmpAct, ok := spendActionMap[actionKey]; ok { tmpAct.Amount += act.Amount tmpAct.UseUnconfirmed = tmpAct.UseUnconfirmed || act.UseUnconfirmed } else { spendActionMap[actionKey] = act resultActions = append(resultActions, act) } default: resultActions = append(resultActions, act) } } return resultActions}上面只是简单的贴出了核心的实现代码,如果感兴趣想仔细阅读源码,点击地址:https://git.io/fhAsw这一期的内容我们到此就结束了,如果你感兴趣可以加入我们的社区一起讨论。如果在阅读的过程中有什么疑问可以在下方给我们留言,我们将第一时间为你解答。 ...

March 1, 2019 · 2 min · jiezi

一块听听:Mixin 主网上线语音直播文字稿

本文是在一块听听上的语音直播的文字精简版。Mixin Network的成绩,主网和展望大家好,我是Mixin Network 的李林。非常高兴能在这里跟大家分享一下Mixin Network。第一次做语音直播,很紧张,难免会讲错,如果有错,请大家指出来,我努力改正。今天会讲4个主题mixin 是什么主网启动的一些细节,主网上线之后的计划。我个人关于mixin和比特币闪电网络的思考Mixin Network 是什么Mixin Network是一个面向数字资产的转账网络,转账免费,1秒到账。为什么要设计一个数字资产转账网络呢?这里首先我们先明确两个我们认为一定发生的事情:区块链经济一定会指数级别增长。从比特币的价格,到后来以太坊的ICO,ERC20代币,eos上的智能合约,波场的发展都得出这个结论。智能手机时代的用户需要一个快速,便宜的数字资产支付系统。大家体验过微信,支付宝的支付体验之后是回不去的来。现在看看现实情况:无论是比特币和以太坊,转账有转账费,而且比特币转账费很贵,而且到账时间很长。既然在现实和大趋势之间有巨大的鸿沟。这意味着谁能填平这个鸿沟,谁就有巨大的利益。因此,CEO冯晓东就决定做一个技术方案,这个方案的名字叫做Mixin,意思是链接一切数字资产。既然是面向大趋势设计的方案,不仅仅是免费和快速到账这么简单,Mixin还有一个设计目标就实现匿名支付。为什么支付要匿名?大家想一下你用微信在超市买个口香糖,你楼下的邻居肯定不知道。只有你,卖家,微信,银行才知道。其他人是无法知道你的购买记录的。这是大家的隐私信息,受法律保护。 但是比特币和以太坊在设计之初没有将隐私放在第一位,你把比特币转给谁,全世界都知道。 这对于消费者和商家来说太可怕了。因此我们将隐私加入我们的设计目标。因此我们的设计目标是转账免费,1秒到账,支付匿名,支持极多的资产。那么我们是如何实现的呢?验证一笔交易是否有效使用拜占庭和POS机制。不是POW,也不是DPOS。交易存储使用DAG(有向无环图)。Mixin里面不出块。使用了与门罗币一样的匿名交易机制(CryptoNote)。目前为止做到的成绩支持13个主链,比特币,比特现金,以太坊,以太坊经典,莱特币,达世币,狗狗币,EOS,瑞波币,USDT,Horizen, Nem, Sia, Zcash。在这13个主链本身还没有实现1秒到账的闪电网络之前,Mixin Network帮助他们实现了1秒到账,免费转账,匿名交易。支持基于比特币发的USDT和以太坊发的USDT支持基于以太坊发的16万9千2百27种erc20代币。以太坊上的ERC20代币目前是很靠谱的发币方式,缺点是以太坊上确认交易特别慢。那么只要你用Mixin Network,就能为你的代币用户提供免费转账,1秒到账,而且匿名交易。支持基于EOS发的3千2百98种代币。虽然EOS代币本身不如ERC20代币那么稳固,但是由于EOS确认交易比以太坊快很多,所以有些项目选了EOS发代币。但是EOS钱包需要质押资源才能用。这种设计让用户很不舒服:普通用户很难理解开户花钱,转账还花钱,昨天能转账,今天就不能转的逻辑。如果使用Mixin Network,那么EOS代币转账可以1秒确认,同时免费使用钱包,不需要额外抵押资源。目前Mixin Network上的主要资产有1100多比特币,1800多以太坊,130万EOS,150万USDT,110多万瑞波币,300多比特现金,不包括我们自己发的XIN token在内,有6千多万美金的资产。如果包括我们自己发的XIN token,资产总额超过1.3亿美金总计持有6万多种资产。总计发生了2亿笔交易,真实网络峰值达到了168。大家都知道一个区块链项目产品需要有开发者来做产品才有价值。针对开发者工作针对在mixin network初期就看好mixin并且义务为mixin提供开源SDK的作者提供了特殊贡献奖,每人50 xin token,价值7300美金。相关SDK资源在2018年末到2019年初举办了一次开发者大赛,吸引了全球的开发者。获奖团队来自全世界,第一名来自澳大利亚,奖金是300 xin token,如果获奖团队没有卖xin token,现在价值4万多美金。 作品是一个在安装在谷歌浏览器上的mixin 钱包。我们在春节前针对c sharp编程语言发布了SDK悬赏,被mixin 团队选定的作品可以获得50 xin token,目前价值7千多美金。在开源SDK的支持下我们还专门针对不同种类的编程语言提供了入门教程,现在入门教程已经覆盖了PHP, Nodejs, Python和Java go几种语言。如果你会编程,在mixin的支持下,可以30分钟搭建一个区块链应用。基于Mixin Network的应用Mixin 团队自己的产品Mixin Messenger这是一个通过记住手机号和6位数字密码就可以管理无限种资产的钱包。同时还是一个安全快速的聊天工具。用过比特币钱包,以太坊钱包和EOS钱包的朋友肯定知道一个东西叫做助记词,就是一堆没啥关联的单词,记住就好了。但是大家知道人类记忆是非常耗费能量的,特别是毫无关联内容的记忆。所以助记词基本上只能拍照,或者打印在纸上藏起来。最开始几天你肯定忘不了,但是过了1年你肯定忘了,如果你换手机或者不小心格式化电脑,你就再也无法动用你的钱。除了助记词,还有通过强密码保护的方法,就是通过组合使用数字,字母,特殊符号来保护钱包。但是这个密码太难记住了,如果你两个星期不用,就很容易忘记。会发现自己明明有钱,但是取不了。 我们认为这两种方案是给专业人士设计的。在智能手机时代应该有一个方便又足够安全的手机钱包这就是Mixin Messenger : 只要记住手机号和6位数字pin码就可以管理钱包,这和手机银行是一样的体验。 只要你有手机,安装我们的App,就同时免费拥有13种主链钱包,比特币,以太坊,eos,波场。这个钱包可以装下16万种以太坊ERC20代币,3千种EOS上的代币。就连你自己发的币都可以随意转入,转出,不用审批,来去自由。根本不用提交任何申请。Oceanone交易撮合引擎这是一个去中心化交易所引擎,可以交易所有在mixin network上的资产。我们工程师基于这个引擎搭建了一个完全自由的交易所,所有的Mixin network上的资产都可以自由挂单买卖。就是以太坊上发行的16万种资产你都可以自由的充值到你的mixin 账户,在交易所卖掉,同时永远不会丢币。因为交易完毕后资产就回到了你自己的账户而不是交易所账户。你自己发一个币也可以去交易所买卖,不需要审批,来去自由。开发者和社区作品我们的开发者也很给力,基于Mixin Network做了很多游戏,应用。充分的体现了Mixin Network的实力。包括 pressone,exinone,Fox等等。主网上线的细节:Mixin Network主网在北京时间2019年2月28日早上8点正式完成了上线。创世节点已经有15个, 分别来自bigone,eoslaomao,exin,ss,fox,candy以及Mixin Network技术团队。目前主网上线工作已经完成,正在把测试网上的资产迁移到主网上。Mixin的节点的选择过程成为Mixin Network主网节点的方法与EOS,波场 IOST等差别很大。成为Mixin Network节点不需要投票,只需要质押10000个XIN token,并且有一台服务器就可以,服务器费约一个月500美金。节点奖励Mixin Network在主网上预留了XIN token奖励池。每年会把奖励池中的十分之一拿出来奖励给节点。当然做Mixin Network节点是需要认真负责,如果节点故意做恶,那么节点质押的10000 token就会被主网没收。主网上线意味着什么Mixin Network真的是一个去中心化的区块链项目了。仅仅关掉一台服务器,关闭一个域名,或者团队跑路已经伤害不到Mixin Network了。冯晓东和Mixin Network团队是一个说到做到的靠谱团队。Mixin Network的很多决策将由开发团队和社区共同商议决定。mixin主网上线对mixin network来说只是一个起点。未来要做的工作技术开发方面继续开发工作,把技术细节完善并开源。支持更多的主流币种,目标是https://coinmarketcap.com上的…。升级交易所技术方案,形成交钥匙方案。Mixin Messenger会开发桌面版,成为全平台的钱包和聊天工具社区推广方面:将内容分发到其他非英语国家,包括日本,印尼,巴西,俄罗斯。Mixin Network的发展前景比特币和闪电网络Mixin Network也常常被人质疑为什么在比特币闪电网络已经存在的情况下还要做一个闪电网络。我们的答案如下:比特币有闪电网络,可是以太坊,dash,莱特币,狗狗币没有。一个帮助别的区块链实现闪电网络的区块链是有价值的。我们会发现,闪电网络这种业务场景是非常适合商业机构来运营。举个例子,比特币转账非常简单,有台手机,就可以生成比特币钱包,就可以收款,找到全节点就可以转账。但是比特币的闪电网络需要用户有一台随时可用的服务器才行。很明显闪电网络是牺牲了一部分去中心化特性的。其次闪电网络的到账时间是不固定的,可能大部分时间很快,3秒左右,少部分时候需要几分钟甚至几天。而且闪电网络基于安全原因没有办法支付太多的比特币,大额转账实现不了。这对于商业运营来说就很痛苦。尽管有这样的问题,但是闪电网络依然是一个非常优秀的技术发明。事实也证明了这个结论,现在比特币闪电网络已经持有700多个比特币。这个网站分享给大家,http://1ml.com/ 可以看到比特币闪电网络的进展。那么mixin作为一个1秒到账的通用闪电网络会如何发展呢?我认为在比特币转账市场上,Mixin Network和闪电网络会占据前三名。以太坊,莱特币其他币的转账市场上,mixin会成为第一名,并且占有超过50%的市场份额。Mixin Network靠什么赚钱我个人喜欢把Mixin Network比作一个商业运作的转账服务公司,通过为用户提供快速可靠的转账服务赚服务费。回想一下我们最初为什么做Mixin Network:区块链经济一定会指数级别增长。智能手机时代的用户需要一个快速,便宜的数字资产支付系统只要Mixin Network始终为客户提供优质的服务,占据足够的市场份额,就能够赚取足够多的钱,来回报持有Mixin Network。那么CEO 冯晓东和mixin开发团队是否擅长提供优秀的产品和服务呢?冯晓东和Mixin Network开发团队过去开发过的产品包括安卓系统的播放器内核,已经被一下科技收购,至今仍在服务很多app。手机游戏直播app也是在没有市场推广的情况下就能突破千万级用户。因此我们有充足的信心说,Mixin Network能实现自己吹过的牛逼。今天的我的分享到此结束。 ...

March 1, 2019 · 1 min · jiezi

今年的LC3大会没了?

2019年6月24-26日,由Linux基金会在2017和2018年主办的LinuxCon + ContainerCon + CloudOpen大会(简称LC3)将正式更名为Open Source Summit(简称OSS),并与CNCF主办的KubeCon + CloudNativeCon大会合体,在上海世博中心盛大召开。2018年6月27日,由Linux基金会主办的LC3大会又一次在北京国家会议中心完美收官。本次盛会聚集了来自36个国家382个组织的2024名与会者。其中,86%的与会者来自中国各地的公司和组织,包括开发人员、工程师、架构师、技术管理人员在内的技术类参会者更是占到了62%的高席。在历时三天(2018年6月25-27日)的时间里,100多家国内外开源技术领先企业的300多位技术大咖齐聚一堂,通过主题演讲、全方位互动、展览展示等多种形式,与全球的开发人员、运营专家、企业合规人员、法律界相关人士等不同行业、不同层级的观众,再次分享了一场开源盛宴。有150场精心策划的分享,内容涵盖云原生应用程序、云基础设施、Linux系统、区块链、AI、物联网和M2M、开源领导力和社区、人工智能和深度学习、区块链和网络等不同领域,让与会者深入了解了开源领域的最新趋势和主题。此外,本届盛会与2017年相比,提交提案的人数增加了37%;大会盛况被中外50多家媒体争相报道,550余篇次的文章曾与读者见面;更有91%的受访者认为本届会议内容既有信息性又有实用性…其实,早在2017年6月的时候,也是在北京国家会议中心,LC3在中国的首秀就已经相当成功了。当时,有数据表明,首秀中国的LC3大会,到现场参观的观众就已经达到二千人之多。2017年的LC3大会,不仅汇聚了开源界的世界级顶尖专家莅临现场为参会观众解惑,更是邀请到了Linux之父 - Linus Torvalds先生,以及Linux基金会执行董事 - Jim Zemlin先生,到现场为LC3在中国的首秀助威。在大会上,中国开源软件推进联盟主席 - 陆首群教授,获得了由Jim Zemlin先生亲自为其授予的“终身成就奖”。众多国内外知名企业,如华为、阿里巴巴、Intel、腾讯、微软、思科等也悉数亮相会场,并将开源成果对企业运用的意义做了深度分享。在本次大会上,当Jim Zemlin先生郑重的宣布Linux基金会培训认证项目在中国落地的消息的时候,现场响起了热烈的掌声,这不仅是Linux基金会对中国开源界的重视,对于广大中国技术人员来说,更是切实的福利,这也意味着我国的技术人员将有更多的机会接受到更多更专业的国际技术培训。在2018年北京的LC3大会期间,Linux基金会公布了2019年LinuxCon+ ContainerCon + CloudOpen大会将正式升级为Open Source Summit,加入Linux基金会在北美、欧洲和日本举办的具有行业领导意义的开源峰会序列,并与CNCF主办的KubeCon + CloudNativeCon大会合体,把两场盛会融合成一款更加精品的活动,为观众带来全方位的技术分享与开源盛宴。KubeCon + CloudNativeCon和Open Source Summit大会日期:会议日程通告日期:2019 年 4 月 10 日会议活动举办日期:2019 年 6 月 24 至 26 日KubeCon + CloudNativeCon和Open Source Summit赞助方案KubeCon + CloudNativeCon和Open Source Summit多元化奖学金现正接受申请KubeCon + CloudNativeCon和Open Source Summit即将首次合体落地中国KubeCon + CloudNativeCon和Open Source Summit购票窗口,立即购票!

February 28, 2019 · 1 min · jiezi

Fabric架构演变之路

作者: TopJohn原文连接:https://www.xuanzhangjiong.to…Fabric架构演变之路Hyperledger Fabric是目前主流的开源联盟链产品之一,自2016年5月12日开辟代码仓库之日起,已有快3年的时间了,产品趋于稳定,功能也越来越完善,正在适配不同业务场景下的需求。纵观Fabric的发布历程,在v0.6.1-preview版本至v1.0.0的版本迁移过程中架构发生了明显的变化,在v1.0.0之后每个小版本中加入了一些新的feature,来支持不同的业务场景以及完善相应的功能。接下来从个人角度来谈谈Fabric架构变迁过程中的一点思考。Fabric v0.6v0.6版本的技术架构在整个发展过程中停留的时间较短,相对目前v1.x版本来说,不太稳定,适合做poc阶段的测试。下图是Fabric v0.6版本的架构图在v0.6版本中,主要分为Membership、Consensus、Chaincode、Ledger、P2P、Event Stream等核心模块。Membership:负责签发相应的E-cert、T-cert、TLS-cert等证书。Consensus:负责整个区块链的共识,统一交易顺序,保证区块链的一致性。Chaincode:即链码(Fabric中的智能合约),用于执行区块链网络中的交易。Ledger:用于存储Transaction log以及交易中的Key-Value。P2P:基于Google的Grpc框架的底层网络通信层。Event Stream:事件订阅发布组建,用于接收交易及区块事件。在Fabric v0.6中采用的共识算法是PBFT算法(Practical Byzantine Fault Tolerance),可以在信任程度较低的场景下避免拜占庭问题。但是由于算法本身特性限制,n>=3f+1,才能容忍一个拜占庭节点,因此在v0.6版本下,vp节点数量至少是4个。在v0.6版本中,节点角色分为VP(Validating Peer)、NVP(None validating Peer)以及用于签发证书的Membership节点3种。当然Fabric从第一个版本v0.6.0-preview开始就采用基于docker的运行时环境,为部署减少了许多麻烦,屏蔽了操作系统的差异。当然最主要的一点也许是由于Chaincode的设计机制导致的,整套生产环境的链码的部署和运行都是基于docker的,也许是出于docker稳定以及相对安全的运行环境的考量。Fabric的智能合约设计理论上可以支持认可开发语言,只要实现了相应的接口。因为它是基于Peer节点和链码容器的一个双向通信完成相应的交互的。下图是一张Fabric v0.6版本的网络拓扑图在这张图中包含了VP和NVP 2种角色,NVP在这里会分担VP的部分工作,接收来自客户端发过来的交易进行校验同时将交易请求转发至共识节点VP,由VP节点进行真正的共识,将交易写入区块。在这里NVP可以分担共识节点VP的处理交易的压力,可以提升共识的性能。下图为Fabric v0.6的交易流程图应用程序需要先向Membership申请E-cert,通过E-cert去申请T-cert,由T-cert对应的私钥进行签名客户端交易发送至VP节点进行三阶段共识,完成之后各个节点会通过Chaincode按顺序执行区块中的交易,并更新账本。小结Fabric v0.6版本可能由于1.0架构重构的原因,没有继续维护推进,但是相对于1.0版本的架构来说,这种设计来说,区块链角色相对对称,相对于1.0-1.4版本来说,不存在中心化的Kafka的存在,在实际场景中拥有更合理对等的节点设计。Fabric v1.xFabric在1.0版本的时候,架构进行了重构,相比于v0.6版本来说,有了颠覆性的变革,功能模块进行了结偶,具有了更好的可伸缩性、性能,进行了channel级别的安全隔离,共识算法可插拔,具备了更高的可操作性,具备了更丰富的功能,给开发者更好的体验,v0.6版本中的Membership也升级为了一个独立的Fabric CA项目。Fabric v1.x版本中,对节点进行了功能的拆分,明确了各个节点的指责,将背书的信任假设和排序的信任假设进行了拆分。变动最大的地方在于,在共识流程中将交易的执行进行了提前,由Endorser节点进行模拟执行,并进行背书,排序节点Orderer会对所有的交易进行统一的打包排序,将其分发给Committer节点。这种设计的优势在于可以将前后无关联的交易以及不同Channel中的交易进行并行执行,提高交易的执行速度。在v0.6版本中是无法做到并行执行的,0.6中是统一进行排序打包,然后按序执行交易,即使交易前后是无关的。下图也很好地体现了Fabric v1.x中的一个网络拓扑。下图是Fabric v1.x版本的架构图在v1.x版本中,主要分为Fabric CA、Endorser、Committer、Orderer、Application等角色。Fabric CA:负责维护整个Fabric网络中的证书,主要包括签发、吊销、续签证书等操作。Endorser:负责对客户端发过来的交易提案进行背书。Comitter:负责对区块进行有效性校验并将区块写入账本。Orderer:负责对所有的交易进行全局唯一的排序打包工作。Application:用于发送交易提案,收集响应,封装交易发送至Orderer排序服务节点。在1.0及以后的版本中,客户端应用会先向Fabric CA申请用户所需要的Fabric中的准入证书,用于签名提案以及交易,然后由客户端(Application)端生成一个提案(Proposal)(一般应用程序会借助于目前Fabric提供的一系列SDK生成Proposal)发送至背书节点进行模拟执行并进行背书,背书节点Endorser会进行相应的校验,然后将提案交由对应的链码Chaincode进行模拟执行,之后背书节点Endorser会对执行结果进行背书,将背书的Response返回至客户端程序Application,随之,客户端程收集到符合背书策略的提案响应(Proposal Response)之后,将其封装成一个交易Transaction,调用排序节点Orderer的Broadcast接口,进行发送交易至Orderer,在v1.0-v1.4版本中,生产环境只有基于分布式消息队列Kafka的排序打包方式,Orderer作为生产者将交易统一发送至每个通道Channel对应的Topic的Partition当中进行全局统一地排序,同时每个排序节点基于同样的切块规则从Kafka中将区块切下推送Deliver至与之连接的Leader Peer(在网络环境良好的情况下,每个组织只有一个leader),Leader Peer收到区块后,会将区块通过Gossip协议广播至组织内其余节点。每个Committer在收到区块之后会对区块进行校验,包括签名、背书策略以及读写集的校验,在校验无误的情况下进行commit,提交到账本,同时更新世界状态,同时订阅了相应事件的应用程序会收到来自Event Hub的消息通知。下图是一个Fabric v1.x的简化版本的交易流程。此外,在v1.0之后,Fabric强调了组织的概念,在Peer节点的层级上,每个组织需要配置一个或者多个Anchor Peer节点,来代表组织在整个区块链网络启始之处与别的组织交换节点信息,使得每个节点都能够掌握整个网络的节点信息。同时,在v1.0之后,Fabric加入了多通道技术(Muti-channel),使得一个Fabric网络中能够运行多个账本,每个通道间的逻辑相互隔离不受影响,如下图所示,每种颜色的线条代表一个逻辑上的通道,每个Peer节点可以加入不同的通道,每个通道都拥有独立的账本、世界状态、链码以及Kafka中的Topic,通道间消息是隔离的,互不影响的。在Fabricv1.x中,多通道技术是用于在业务逻辑层面做的一个全局的,用于隔离不同业务的通道,使得不同业务的交易存储在不同的通道对应的节点中,通道技术的实现主要在Orderer中实现,Orderer对来自不同通道的交易做区分,同时在Peer节点中会采用MSP对不同通道的消息做校验,用于判断消息是否属于某个通道,通过Orderer以及Peer相结合,形成一个逻辑上的通道技术。在背书和提交校验阶段,Fabric提出了2个系统链码,ESCC和VSCC:ESCC:用于为链码执行结果进行背书。VSCC:用于对接收到的区块中的交易进行校验。在存储方面,v1.0也进行了优化,存储的设计分为2个部分,一个部分是区块的存储,采用的是File System即传统的文件系统,这里设计成采用文件存储的原因在于:区块链中的区块是不断向后追加的,即不断append的,不存在随机写的情况,如果采用Key-Value数据库可能会存在数据压缩或者相关的索引算法的消耗,在这种场景下,File System会优于K-V数据库,因此不管是Orderer还是Peer,对于区块存储部分,均采用File System进行存储,对于Block的索引,则采用Level DB进行存储维护,会根据BlockHash、BlockNumber、TxId等作为Key进行存储,而Value则是区块或者交易所在的Segment号+offset(偏移),用于快速根据Key来定位所需要的区块或者交易。此外,对于世界状态的存储,这里指State DB,在v1.0以后可以用Level DB或者Couch DB进行存储,根据存储的数据的复杂程度,以及链码的业务逻辑可以选择不同的数据库,比如需要针对Json数据进行索引则可以采用Couch DB来进行存储,如果是普通的Key-Value则可以采用Level DB进行存储。下图是Fabric v1.0以后的存储的设计图。Fabric v1.0之后的CA,从Fabric v0.6到v1.0,Fabric CA是从Membership这个模块所衍生出来的,承担整个Fabric网络数字证书的签发、续签以及吊销等工作,作为一个独立的服务存在。同时Fabric CA支持多级CA,以保证根CA的绝对安全,同时存储部分也是可插拔的,可以选择MySQL、LDAP、Postgres等,可以采用HA Proxy做负载均衡。Fabric v1.1Fabric v1.1版本主要的新特性包括:Fabric CA的CRL区块以及交易的事件推送增加了所有组建间的双向TLS通信Node.js Chaincode链码的支持Chaincode API新增了creator identity性能相对v1.0有了明显的提升Fabric v1.2Fabric v1.2开始有了比较大的feature开始出现:Private Data Collections:这个特性不得不说在隐私保护上解决了不少项目的痛点,也减少了许多项目为了隐私保护在业务层做的复杂设计。Service Discovery:服务发现这个特性,使得客户端拥有了更多的灵活性和可操作性,可以动态感知整个Fabric网络的变化。Pluggable endorsement and validation:可插拔的背书及校验机制,采用了Go Plugin机制来实现,避免了之前需要重新编译源代码的操作,提升了灵活性。Fabric v1.3Fabric v1.3中,同样增加了十分有用的feature:基于Identity Mixer的MSP Implementation:基于零知识证明实现的身份的匿名和不可链接,这个feature替代了v0.6版本中的T-cert。key-level endorsement policies:更细粒度的背书策略,细化到具体的key-value,更加灵活,不仅限于一个链码程序作背书。新增Java Chaincode:至此,v1.3之后支持了Go、Node.js、Java 三种Chaincode,为开发者提供了更多的选择。Peer channel-based event services:Channel级别的事件订阅机制,早在v1.1版本中已经亮相了,在v1.3版本中正式发布,至此,旧的Event Hub正式宣告弃用。Fabric v1.4Fabric v1.4是一个里程碑式的版本,是首个LTS的版本(Long Term Support的版本):可操作性和可维护性的提升:开放日志级别设置的接口开放节点健康状态的检查接口开放节点数据指标的收集接口改进了Node SDK的编程模型,简化开发者的代码复杂度,使得SDK更加易用Private Data的增强:对于后续添加的允许访问节点能够获取之前的隐私数据添加客户端层面的隐私数据的权限控制,不需要添加链码逻辑总结对于Fabric的架构变迁,从v0.6版本到v1.0版本有了相对较大的变动,而v1.0—>v1.4之间,也收集了来自业界的不少需求,进行了完善,增加了许多实用的功能,目前v1.4版本后续的小迭代会对目前存在的bug进行fix,而新的大feature则会在未来的v2.0版本中发布,敬请期待吧!欢迎关注我的公众号:AwesomeBlockchain,获取更多技术文章! ...

February 27, 2019 · 1 min · jiezi

一幅图解释区块链结构

先看比特币的核心特点:1)基于时间戳的链式区块结构;2)分布式节点间的共识机制;3)基于共识算力的经济激励;4)灵活可编程的智能合约机制。再来谈区块链的重要特性:1)去中心化、完全分布式;2)点对点;3)共识机制;4)加密算法。我认为区块链的基础技术两点:1、区块链结构;2、全网广播机制。先看区块链结构:再说全网广播机制:“全网广播”的前提问题是“拜占庭问题”(自行Google)我们刚才讲到矿工挖矿时说,当取得一个区块的记账权后,要向全网广播,此时所有人都知道了这个区块被占了,停止找哈希散列,开始以你这个区块为前一个区块,再次准备抢占链接的区块。里面的信息也被记在了所有人的“账本”上。放在将军身上就是,所有将军们开始解题,题目的答案就是行动时间。当每个将军接收到任何表达形式的第一个攻击时刻时,他都会设置他的计算机来求解一个极其困难的“工作量证明”问题,对这个问题的解答是一个哈希(Hash)散列,里面也将包含着这次的攻击时刻。由于这个“工作量证明”问题,非常难解,一般而言,就算所有人收到这个问题后同时求解,也至少需要10分钟才能产生解答。一旦一个将军解出了“工作量证明”,他将会把这个算出来的“工作量证明”向整个网络进行传播,每一个接收到的人,将在他们当前正在做的“工作量证明”计算的散列中附加上刚刚被求解出来的那个工作量证明。如果任何人正在计算他收到的其他的一个不同的攻击时刻,他们将会转向新的更新后的“工作量证明”计算当中,因为他现在的“工作量证明链”更长了。两个小时后,将有一个攻击时刻被散列在一个有12个“工作量证明”的链中。每个将军只要通过验证(这条工作链的)计算难度,就能估算出平均每小时有多少CPU算力耗费在这上面,也就会知道:这一定是在分配的时间段内,绝大多数将军的计算机共同协作才能生成的结果。如果“工作量证明链”中展示出来的算力足够强大,那么他们就可以在一致同意的时间内安全地展开攻击。我再分享一个知乎的回答:https://www.zhihu.com/questio…

February 27, 2019 · 1 min · jiezi

DApp引荐机制正式上线 | IOST开发者赏金计划

2月25日IOST主网正式上线!上线前期,我们发布过一系列面向开发者的赏金开发项目。随着IOST主网生态提上日程,我们欢迎广大Dapp团队能够与我们进行合作。什么是IOST DApp引荐机制?如果你:来自一个DApp团队,有意向与IOST合作(将DApp迁移到IOST主网)认识一个DApp团队,能够为我们引荐DApp团队对接人员(例如:DApp项目技术负责人,商务合作负责人等)拥有有趣的DApp创意,想寻求IOST在DApp开发和运营上的支持通过向IOST项目自荐/引荐相应的DApp项目和对接人员,在双方合作意向达成后(IOST会进行公告发布),IOST会根据该DApp在引荐当日于DAppReview上的全部类DApp排名给予相应等级的赏金!DAppReview网址:https://dapp.review/ 引荐流程是什么?1.在线填写DApp基本信息、DApp亮点和推荐合作理由。2.将DApp项目合作负责人引荐给IOST官方,协调IOST与DApp团队的线上/线下细节沟通。3.引荐是否成功以IOST和DApp团队双方是否确认合作意向并发布公告为标准,随后IOST将会对推荐人进行奖励发放。**引荐人赏金奖励和福利引荐成功你将获得:**1.丰厚赏金引荐当日排名1-15的DApp将获得:120,000 - 200,000 IOST引荐当日排名16-30的DApp将获得:80,000 - 120,000 IOST引荐当日排名31-45的DApp将获得:50,000 - 80,000 IOST引荐当日排名46-60的DApp将获得:25,000 - 50,000 IOST引荐当日排名60之后的DApp将获得:25,000 IOST2.IOST周边福利年历、抱枕、杯子、T恤、卫衣系列酷炫周边任你选!引荐表格:https://www.wjx.top/jq/343240…扫描二维码填写引荐表格如有更多疑问,请邮件咨询:tech_support@iost.io加入Slack开发者群组与IOST团队进行直接对接:https://invite.iost.io/-END-官方网站http://iost.io社交平台Weibo https://weibo.com/u/6502023048Twitter http://twitter.com/iostokenTelegram http://t.me/iost_announcementsGitHub https://github.com/iost-officialMedium http://medium.com/iostZendesk http://iost.zendesk.com商务合作contact@iost.io

February 27, 2019 · 1 min · jiezi

深度揭秘“蚂蚁双链通”

摘要: 目前,市场上基于区块链的供应链金融基本上是从应收账款切入的。蚂蚁区块链做到了应收账款确认、流转、融资、清分的全生命周期上链,资产的确权和流转以链上为准,而不是简单的业务存证。今年年初,蚂蚁金服ATEC城市峰会在上海举行。在ATEC区块链行业研讨会分论坛上,蚂蚁金服区块链高级产品专家杨俊带来了主题为《供应链金融,不止于金融:蚂蚁双链通——基于区块链的供应链协作网络》的精彩分享。区块链与应收流转目前,市场上基于区块链的供应链金融基本上是从应收账款切入的。应收账款是最容易数字化的资产,其业务模式比较简单:核心企业核心供应商进行应付账款确认,将应收账款拆分转让,再将应收账款转入金融机构进行融资,金融机构之间或金融机构与投资者间用ABS的方式再次进行资产的转让或融资。无论是合同转让、融资产品还是ABS产品,均为已经成为成熟的业务产品,区块链的使用让这个旧有的业务模式变得更加可靠并容易实施。蚂蚁金服做到了应收账款确认、流转、融资、清分的全生命周期上链,资产的确权和流转以链上为准,而不是简单的业务存证。区块链的以下四个特点使其在金融领域发挥出了极大价值:1.多方性:区块链无需依靠中心化系统即可帮助很多企业进行多方协作,多方是区块链中非常重要的特征。2.可信性:区块链模式的分布式特性、多方共识特性、不可篡改特性保证了整个数据资产的可信性。3.高效性:区块链通过可信的方式进行数字化,使其成为高效的可在线上完成的工作。4.智能性:在区块链上附加智能合约可编程的资产,通过资产的流转来实现管理上的优化及其他业务领域的创新。区块链技术虽然没有创造新的业务,但却依靠其特性为金融领域、供应链领域及更多相关领域创造出了新的价值。区块链模式对企业的价值对于企业而言区块链模式有如下的一些价值:1.对于核心企业而言,区块链模式可以很好的改善其子企业的资金使用效率。通过区块链模式核心企业可以用自身内部资产流转提升整个集团的资金使用效率,以此提升企业运作效率。对于额外有金融板块的公司来说,区块链技术可以为这样的公司带来额外的收益,为核心企业在财务领域创造不小的价值。2.通过区块链的方式,企业与供应商间可以建立密切的协作关系。蚂蚁金服的区块链技术可以做到对供应链进行多级分析并进行穿透式的管理,对于很多对供应链管控要求严格的行业是一个很大的助力。通过区块链技术可以在企业与供应商间更快更好地建立良性的协作与管理关系。3.通过区块链模式可以建立一种新的协作方式。供应链的中间渠道将变得更顺畅,很大程度上方便了核心企业的管理。对于原材料企业与上游大企业来说,在提升企业效率的同时,还可以降低企业的金融风险并把绩效上的融资业务做得更好。4.对于蚂蚁金服而言,通过区块链的方式可以让供应链上的小微企业得到更好的融资服务。除此以外,对于很多中型企业来说,通过区块链方式可以很好的协调管理应收应付这项复杂繁琐的工作。对于应收账款过多而造成很大经营风险的企业而言,通过区块链的方式可以得到信誉良好大企业的应收账款凭证,对于企业经营稳定性的提高有很大的帮助。对于需要融资的企业来说,通过区块链的方式可以使用应收凭证很便捷地在线进行融资。区块链模式探索中的难题对每个企业而言,多种多样的选择带来不同的价值与代价。企业构建区块链也是如此,企业在利用区块链方式构建自己生态的同时,往往被多种多样的可选择路径困扰。这时一个十分重要的考量标准为:企业技术上、风险管控上的投入与所建立的生态产出是否匹配。如上图所示为企业在选择发展自身区块链模式时的可选路径:1.对于加入其他企业构建的平台的企业,无法完全信任平台对其独立性、企业隐私的保证。2.加入金融机构所构建平台的企业,往往受到金融机构类型平台的限制,很难向除开金融以外的方向进一步发展。3.不同企业、合作方等多方协作构建的区块链联盟由于经验与技术的不足无法产生很好的协作关系。4.一些企业选择放弃发展区块链。5.技术选型上的困扰。区块链技术虽然很有发展,但目前尚处于不成熟的阶段,无论公司使用公链技术、联盟链技术或是传统的中心化技术,都会面临各自的问题。如下图所示,蚂蚁金服绘制了企业所关心的雷达图,图中将区块链的优劣分为以下几大考量维度:高可靠性合法合规性分布式的开放隐私安全可运营性 在上图所示的雷达图中,黄色线条代表的公链技术在分布式开放与高可信度方面做的很好,而在合法合规性、隐私与安全方面,公链模式还差的很多,一旦应用实名后在隐私方面将很难得到保障。在雷达图中的深蓝色线条代表了联盟链。传统的联盟链中,机构与机构之间,企业与企业之间完成相互的业务,合法合规性是很高的,高可信性也比较可观。在隐私安全方面联盟链远远强于公链,在可运营性方面同样表现不俗。而在分布式开放方面,传统的联盟链基本上仅为机构间的业务交流所用,分布式开放能力比较不足。蚂蚁金服双链通对于上述种种选择区块链时面临的难题,蚂蚁金服的新品牌双链通可以很好的进行解决,双链的涵义分别指区块链与供应链。如下图所示,双链通可分为联盟网络、企业运营服务、金融基础业务设施这三大部分:蚂蚁金服会与所有合作伙伴一起构建区块链的联盟网络。蚂蚁金服将作为这个联盟网络最主要的技术运营方及开发方。蚂蚁金服拥有完全自主可控的核心技术,可以解决很多开发中的问题及技术难点,并通过全球的技术网络无缝支持联盟网络的开发与运营。联盟网络作为企业级、金融级商业应用,安全性与隐私性将十分可靠。蚂蚁金服落地了全球第一个硬件级的隐私保护方案,将隐私保护从硬件层面做起,排除掉一切不安全的因素。在开放性方面,蚂蚁金服将会为企业级应用提供配套的基础设施以帮助合作伙伴成功构建起自己的业务。在应收账款及其他功能性领域,例如应收账款的确权和转让等业务,业务安全性要求高,风险很大,必须要用可靠的措施来完成。在这一准金融领域,蚂蚁金服拥有多年的沉淀与丰富的资源,可以为企业提供安全可靠、合法合规的融资与金融通道。在供应链的协作方面,如何让客户企业发现潜在目标,如何让客户企业真正获得价值是一大难题。蚂蚁金服在B类客户特别中小微企业上面,拥有多年合作经验并通过大量相关基础设施作为配套开发了符合这样中小公司利益的双通链网络。最核心的区块链联盟网络、金融业务的基础设施配套、面向企业运营服务能力的配套三者组合成为了蚂蚁金服的双链通服务,这是一个可以用多种方式组装的合作蓝图,一个由多方组成的协作网络。蚂蚁双链通未来的协作生态面向未来,蚂蚁金服计划构建区块链的协作生态。如下图所示,图的中央部分代表蚂蚁金服发起建设的基础设施,周围部分是蚂蚁金服的合作伙伴:1.核心企业是蚂蚁金服最重要的合作伙伴。在这些合作伙伴当中,不仅有与蚂蚁金服合作的核心企业,还可以包括其下属的财务公司、保理公司、信托公司甚至自有的银行等。这些下属公司也可以成为蚂蚁金服区块链的联盟成员,并把核心企业的业务进行打包。2.对于不具备自己开发业务系统的链上中小企业来说。蚂蚁金服提供了一个轻量的业务平台,帮助中小企业直接上链进行交易。蚂蚁金服有很高的网络公信力,同时也正在引入审计与监管机构的参与,值得中小企业的信赖。同时行业的组织也可成为行业联盟的成员之一。3.银行与金融机构均可成为区块链联盟成员,可以在平台上进行网银、身份核实、账务甚至资金结算等业务。对于更高层级的服务商、合作伙伴来说,依托核心能力,可以为蚂蚁金服合作的客户提供更多的供应链协作、供应链管理相关的能力。通过这种方式,双链通可以和所有的客户及合作伙伴建立一个良好的协作生态。本文作者:华蒙阅读原文本文为云栖社区原创内容,未经允许不得转载。

February 27, 2019 · 1 min · jiezi

DOS Network一月项目月报

欢迎大家阅读DOS Network第一期项目月报!DOS为了跟大家更好的沟通和交流,将在每个月为大家跟进DOS Network项目进展月报。月报主要分为项目研发和社区及营销两个部分。如果你是刚认识DOS Network预言机网络的新朋友,欢迎查阅往期文章:区块链技术科普丨什么是预言机(Oracle)想要更深一步了解DOS网络,可以查看我们的项目白皮书,我们在白皮书中对 DOS 预言机网络进行了详细的描述,深入分析了DOS的特性与功能,并具体介绍了 DOS 体系结构、技术细节、业务计划以及未来应用场景。同时,欢迎对区块链技术开发感兴趣的朋友,关注我们发布在以太坊测试网络上的DOS网络alpha版本。在三月,我们产品的Beta版本也将正式上线,敬请期待!(https://dosnetwork.github.io/…)⚙️ 产品与开发链下节点:在AWS上进行了1000多个测试节点试运行与 P2P连接管理器优化和试验。在golang的管道模型和CSP模型进行架构重构与实现,优化错误处理和日志收集。容器化节点安装,本地测试,和启动过程。预言机客户端命令行参数的设计允许节点运行者查询更多的节点状态和网络信息。链上智能合约:进行更多覆盖率的单元测试。重新分组和多组注册处理合约以及节点支持。其他:DOS 网络开发团队通过在波场上开发一个名为“Option Market”的Dapp,一个类似CFD(差价合约)的去中心化交易平台。赢得了由波场举办的 TRON Accelerator 开发者大赛大奖。此次参赛旨在为大家展示 DOS 网络预言机应用的可能性。详细内容请查看:DOS团队于TRON Accelerator竞赛荣获大奖!❤ 社区与营销我们的项目负责人华思远(Jonny) 在Tokenclub上进行了直播分享——Dapp的困境与突围。直播内容请查看:直播回顾丨寒冬下 DApp 的困境与突围DOS团队在旧金山参加了graph day活动,与社区和开发人员会面,讨论了区块链和Dapp的开发和未来。我们上线了全新的官方网站,公布了项目白皮书,以及开源了几个github 代码仓库。我们已经在bitcointalk论坛上发布了官方公告,并开始为即将到来的赏金计划做准备。(https://bitcointalk.org/index…)了解项目详情,请阅读 DOS Network 白皮书(英文版):https://docsend.com/view/ak3rdft项目中文简要介绍请访问官网:https://dos.network我们将会在 3 月份发布项目 Beta 版,请大家保持关注!如果你对项目感兴趣,欢迎添加小助手进入社区!公众号:dosnetwork关于DOS NetworkDOS Network 是一个实现了去中心化预言机的可扩展的二层网络,为主流区块链提供数据上链服务和计算力。它将区块链智能合约与真实世界的数据和事件连接起来,还为区块链提供可验证的计算能力,从而使更多应用场景能够在区块链上实现。可支持各种主流区块链,如 Ethereum、EOS、TRON、ThunderCore 等。最新资讯,尽请通过以下方式关注 DOS Network:官方网站:https://dos.network/中文电报群:https://t.me/dosnetwork_cn英文电报群:https://t.me/dosnetwork_enMedium:https://medium.com/@dosnetworkGithub:https://dosnetwork.github.io/…

February 26, 2019 · 1 min · jiezi

Python 比特币教程之三: 创建比特币钱包,读余额,极速免费转账,标准转账

我们已经创建过一个回复消息的机器人和一个能自动支付比特币的机器人.通过本教程的学习,你可以学到如下内容如何创建一个比特币钱包.如何读取比特币钱包的余额.如何实现免手续费支付比特币并1秒到账如何将Mixin Network的比特币提现到你的冷钱包或第三方交易所.通过Mixin Network Python SDK创建一个比特币钱包前期准备:你要有一个Mixin Network账户。如果没有账户,一行代码就能创建一个 userInfo = mixinApiBotInstance.createUser(session_key.decode(),“Tom Bot”)上面的语句会在本地创建一个RSA密钥对,然后调用Mixin Network来创建帐号,最后输出帐号信息.//Create User api include all account informationuserInfo.get(“data”).get(“pin_token”),userInfo.get(“data”).get(“session_id”),userInfo.get(“data”).get(“user_id”),帐号创建成功后结果如下:{‘data’: {’type’: ‘user’, ‘user_id’: ‘2f25b669-15e7-392c-a1d5-fe7ba43bdf37’,‘identity_number’: ‘0’, ‘full_name’: ‘Tom Bot’, ‘avatar_url’: ‘’,‘relationship’: ‘’, ‘mute_until’: ‘0001-01-01T00:00:00Z’,‘created_at’: ‘2019-02-22T06:23:41.754573722Z’, ‘is_verified’: False,‘session_id’: ‘284c7b39-3284-4cf6-9354-87df30ec7d57’, ‘phone’: ‘’,‘pin_token’: ‘g4upUgBXa8ATk7yxL6B94HgI4GV4sG4t8Wyn6uTu2Q2scH11UMQ5bYDb6Md+3LRQqRjEdRFcLlHijXGBihRweTaKTZjHQqolWbZcffesVIias6WppV/QMu4TzXCuKa5xpj3uhjL+yPyfWTLGUaVJTJN9n7PQmHSIUBXrovbfodk=’,‘invitation_code’: ‘’, ‘code_id’: ‘’, ‘code_url’: ‘’, ‘has_pin’: False,‘receive_message_source’: ‘EVERYBODY’, ‘accept_conversation_source’: ‘EVERYBODY’}}现在你需要小心保管好你的帐号信息,在读取该账户的比特币资产余额或者进行其他操作时,将需要用到这些信息.给新建的帐号创建一个比特币钱包新账号并不默认内置比特币钱包, 现在读一下比特币余额就可以创建一个比特币钱包。def readAssetAddress(asset_id,isBTC = True): with open(’new_users.csv’, newline=’’) as csvfile: reader = csv.reader(csvfile) for row in reader: pin = row.pop() userid = row.pop() session_id = row.pop() pin_token = row.pop() private_key = row.pop() mixinApiNewUserInstance = generateMixinAPI(private_key, pin_token, session_id, userid, pin,"") btcInfo = mixinApiNewUserInstance.getAsset(asset_id) print(btcInfo) if isBTC: print(“Account %s 's Bitcoin wallet address is %s " %(userid,btcInfo.get(“data”).get(“public_key”))) else: print(“Account %s 's EOS account name is %s, wallet address is %s " %(userid, btcInfo.get(“data”).get(“account_name”), btcInfo.get(“data”).get(“account_tag”)))创建的帐号的比特币资产详细信息如下,其中public key就是比特币的存币地址:{‘data’: {’type’: ‘asset’, ‘asset_id’: ‘c6d0c728-2624-429b-8e0d-d9d19b6592fa’,‘chain_id’: ‘c6d0c728-2624-429b-8e0d-d9d19b6592fa’,‘symbol’: ‘BTC’, ’name’: ‘Bitcoin’,‘icon_url’: ‘https://images.mixin.one/HvYGJsV5TGeZ-X9Ek3FEQohQZ3fE9LBEBGcOcn4c4BNHovP4fW4YB97Dg5LcXoQ1hUjMEgjbl1DPlKg1TW7kK6XP=s128','balance': ‘0’,‘public_key’: ‘12sJHR7HJPMt33KwSHyxQvYqGGUEbVGREf’,‘account_name’: ‘’, ‘account_tag’: ‘’, ‘price_btc’: ‘1’,‘price_usd’: ‘3879.88117389’, ‘change_btc’: ‘0’,‘change_usd’: ‘0.017333475714793264’,‘asset_key’: ‘c6d0c728-2624-429b-8e0d-d9d19b6592fa’,‘confirmations’: 12, ‘capitalization’: 0}}Account a8cefb2e-cb93-338f-aba7-32a3a635ad02 ’s Bitcoin wallet address is 12sJHR7HJPMt33KwSHyxQvYqGGUEbVGREf这个API能够提供若干与比特币有关的信息:存币地址:[public_key]Logo: [icon_url]资产名字:[name]资产在Mixin Network的uuid: [asset_key]对美元的价格(Coinmarketcap.com提供): [price_usd]存币时确认的区块数量:[confirmations]比特币私钥呢?比特币的私钥呢?这个私钥被Mixin Network通过多重签名保护,所以对用户来说是不可见的,比特币资产的提现和转账都需要用户提供正确的的RSA签名,PIN代码与会话密钥才能完成.不只是比特币,还有以太坊,EOS等这个帐号不只支持比特币,还支持以太坊,EOS等, 完整的区块链支持列表. 这个账户同时也支持所有的 ERC20 代币与 EOS 代币.创建其它的币的钱包与创建比特币钱包过程一样,读对应的资产余额就可以.Mixin Network 当前支持的加密货币 (2019-02-19)cryptouuid in Mixin NetworkEOS6cfe566e-4aad-470b-8c9a-2fd35b49c68dCNB965e5c6e-434c-3fa9-b780-c50f43cd955cBTCc6d0c728-2624-429b-8e0d-d9d19b6592faETC2204c1ee-0ea2-4add-bb9a-b3719cfff93aXRP23dfb5a5-5d7b-48b6-905f-3970e3176e27XEM27921032-f73e-434e-955f-43d55672ee31ETH43d61dcd-e413-450d-80b8-101d5e903357DASH6472e7e3-75fd-48b6-b1dc-28d294ee1476DOGE6770a1e5-6086-44d5-b60f-545f9d9e8ffdLTC76c802a2-7c88-447f-a93e-c29c9e5dd9c8SC990c4c29-57e9-48f6-9819-7d986ea44985ZENa2c5d22b-62a2-4c13-b3f0-013290dbac60ZECc996abc9-d94e-4494-b1cf-2a3fd3ac5714BCHfd11b6e3-0b87-41f1-a41f-f0e9b49e5bf0EOS的存币地址与其它的币有些不同,它由两部分组成: account_name and account tag, 如果你向Mixin Network存入EOS,你需要填两项数据: account name 是eoswithmixin,备注里输入你的account_tag,比如0aa2b00fad2c69059ca1b50de2b45569.EOS的资产余额返回结果如下:{‘data’: {’type’: ‘asset’, ‘asset_id’: ‘6cfe566e-4aad-470b-8c9a-2fd35b49c68d’,‘chain_id’: ‘6cfe566e-4aad-470b-8c9a-2fd35b49c68d’,‘symbol’: ‘EOS’, ’name’: ‘EOS’,‘icon_url’: ‘https://images.mixin.one/a5dtG-IAg2IO0Zm4HxqJoQjfz-5nf1HWZ0teCyOnReMd3pmB8oEdSAXWvFHt2AJkJj5YgfyceTACjGmXnI-VyRo=s128','balance': ‘0’, ‘public_key’: ‘’,‘account_name’: ’eoswithmixin’, ‘account_tag’: ‘70dae97b661ca9f80cb0e6549feeba6c’,‘price_btc’: ‘0.00092392’, ‘price_usd’: ‘3.58276497’,‘change_btc’: ‘-0.019294922814297986’, ‘change_usd’: ‘-0.0033825963089133683’,‘asset_key’: ’eosio.token:EOS’, ‘confirmations’: 64, ‘capitalization’: 0}}Account a8cefb2e-cb93-338f-aba7-32a3a635ad02 ’s EOS account name is eoswithmixin, wallet address is 70dae97b661ca9f80cb0e6549feeba6c存入比特币与读取比特币余额现在,你可以向比特币的钱包存币了。当然,在比特币网络里转币,手续费是相当贵的,费用的中位数在0.001BTC,按当前4000美元的价格,在4美元左右,有一个方便的办法,如果你有Mixin Messenger帐号,里面并且有比特币的话,可以直接提现比特币到新创建的帐号的比特币充值地址,它们在同一个Mixin Network网络内,手续费为0,而且1秒到账。下面的代码,可以读取比特币钱包余额.btcInfo = mixinApiNewUserInstance.getAsset(asset_id)print(“Account %s 's balance is %s " %(userid,btcInfo.get(“data”).get(“balance”)))Mixin Network网内免手续费的,并且即时确认任何币在Mixin Network内部的交易,都是无手续费的,并且立刻到账。前期准备: 账户设置了PIN对于新创建的帐号,我们通过updatePin来设置新PIN码, 代码如下:pinInfo = mixinApiNewUserInstance.updatePin(PIN,”")print(pinInfo)Mixin Network帐号之间的比特币支付通过Mixin Messenger,我们可以先转比特币给机器人,然后让机器人转币给新用户。mixinApiNewUserInstance = generateMixinAPI(private_key, pin_token, session_id, userid, pin,”")btcInfo = mixinApiBotInstance.transferTo(MASTER_UUID, BTC_ASSET_ID, AMOUNT, “")print(btcInfo)读取Bitcoin的余额,来确认比特币是不是转成功了! 注意$mixinSdkNew是新用户的。btcInfo = mixinApiNewUserInstance.getAsset(asset_id)print(“Account %s 's balance is %s " %(userid,btcInfo.get(“data”).get(“balance”)))如何将比特币存入你的冷钱包或者第三方交易所如果你希望将币存入你的冷钱包或者第三方交易所, 先要得到冷钱包或者你在第三方交易所的钱包地址,然后将钱包地址提交到Mixin Network.要点提示: 提现是需要支付收续费的,准备好比特币包地址!增加目的钱包地址到Mixin Network调用createAddress API, 将会返回一个address_id,下一步的提现操作会用到这个id。BTC_ASSET_ID = “c6d0c728-2624-429b-8e0d-d9d19b6592fa”;EOS_ASSET_ID = “6cfe566e-4aad-470b-8c9a-2fd35b49c68d”;BTC_WALLET_ADDR = “14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C”;btcInfo = mixinApiBotInstance.createAddress(BTC_ASSET_ID, BTC_WALLET_ADDR,“BTC”,””,”")print(btcInfo)这里的 14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C 就是一个比特币钱包地址, 如下所示,提现费用是0.0034802 BTC, address_id 是"345855b5-56a5-4f3b-ba9e-d99601ef86c1".{‘data’: {’type’: ‘address’,‘address_id’: ‘47998e2f-2761-45ce-9a6c-6f167b20c78b’,‘asset_id’: ‘c6d0c728-2624-429b-8e0d-d9d19b6592fa’,‘public_key’: ‘14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C’, ’label’: ‘BTC’,‘account_name’: ‘’, ‘account_tag’: ‘’,‘fee’: ‘0.0034802’, ‘reserve’: ‘0’, ‘dust’: ‘0.0001’,‘updated_at’: ‘2019-02-26T00:03:05.028140704Z’}}如果你操作的是EOS, 示例代码如下:EOS_ASSET_ID = “6cfe566e-4aad-470b-8c9a-2fd35b49c68d”;EOS_WALLET_ADDR = “3e2f70914c8e8abbf60040207c8aae62”;EOS_ACCOUNT_NAME = “eoswithmixin”;eosInfo = mixinApiBotInstance.createAddress(EOS_ASSET_ID, “”,"",EOS_ACCOUNT_NAME,EOS_WALLET_ADDR)print(eosInfo)创建提现地址成功后,你可以用readAddress读取最新的提现费。addr_id = btcInfo.get(“data”).get(“address_id”)addrInfo = mixinApiBotInstance.getAddress(addr_id)print(addrInfo)提交提现请求,Mixin Network会即时处理提现请求.提交提现请求到Mixin Network, $btcInfo[“address_id”]就是createAddress创建的。 mixinApiBotInstance.withdrawals(btcInfo.get(“data”).get(“address_id”),AMOUNT,"")可以通过blockchain explore来查看进度.完整的代码在这儿 ...

February 26, 2019 · 2 min · jiezi

基于Hyperledger Fabric交易系统帐户的钱包模型的java Chaincode实例

这是Hyperledger Fabric Java Chaincode的教程。还有Go和NodeJS Chaincodes,我们将来可能会讨论它们。此外,我采用基于帐户的钱包模型作为示例,我们将使用Hyperledger Fabric构建你的第一个网络(BYFN,build your first network),作为我们的测试环境(v1.4网络)。如果你不知道如何启动BYFN网络,我也会提供步骤,不用担心。但是如果你想了解BYFN是如何工作的,你可以参考:1.Hyperledger Fabric官方BYFN教程2.我之前关于BYFN的文章基于帐户的钱包模型基于帐户的钱包模型是交易系统的实现之一,一般而言系统中存在一些钱包,并且每个钱包包含可用于转账的一些值或代币。当然,实现的细节有很多变化,例如代币交换和多代币功能。特征在Java Chaincode中,我们将实现:1.用户钱包创建。2.用户钱包查询。3.钱包代币转账(即从一个钱包发送钱或代币到另一个钱包)。[可选] Hyperledger Fabric中有两个数据库选项用于保存超级账本的world state:LevelDB和CouchDB,在本教程中,为了简单起见,我将使用LevelDB。[可选]在上面,world state(或全局状态)不是超级账本本身,而是与超级账本分开,虽然它是派生的,可以随时从超级账本中恢复。此外,世界状态存储在数据库中以表示超级账本,使得这些节点不需要总是搜索超级账本以进行数据检索,并且可以更快地从数据库中检索数据(状态)。[可选]在我的负载测试和一些关于Hyperledger Fabric性能的论文中,LevelDB的性能优于CouchDB。但与LevelDB中的简单键值查询相比,CouchDB可以支持可用于构建更复杂查询的丰富查询。IDE——Java Chaincode开发工具我们使用IntelliJ IDEA。此外,你需要JDK。请安装它们。当然,如果你有自己的Java IDE,也可以使用它。但在本教程中,我们使用IntelliJ。第1步,准备开发让我们打开IntelliJ。在IntelliJ中创建新项目Create New Project:选择左边的Gradle,然后:输入你的GroupId和ArtifactId。就我而言,我使用java_account_model_cc。接下来:然后现在,你应该配置自己的项目位置。就我而言,我使用/Desktop/java_account_model_cc。单击完成Finish。1.1 settings.gradle在左侧的项目文件中,你应该看到settings.gradle。让我们双击打开它:输入以下内容:rootProject.name = ‘fabric-chaincode-gradle'1.2 build.gradle在左侧的项目文件面板中,可以看到build.gradle。让我们双击打开它:然后,输入以下内容:plugins { id ‘com.github.johnrengelman.shadow’ version ‘2.0.3’ id ‘java’}group ‘org.hyperledger.fabric-chaincode-java’version ‘1.0-SNAPSHOT’sourceCompatibility = 1.8repositories { mavenLocal() mavenCentral()}dependencies { compile group: ‘org.hyperledger.fabric-chaincode-java’, name: ‘fabric-chaincode-shim’, version: ‘1.+’ compile group: ‘com.fasterxml.jackson.core’, name: ‘jackson-databind’, version: ‘2.9.6’ testCompile group: ‘junit’, name: ‘junit’, version: ‘4.12’}shadowJar { baseName = ‘chaincode’ version = null classifier = null manifest { attributes ‘Main-Class’: ‘org.hyperledger.fabric.chaincode.AccountBasedChaincode’ }}如果IntelliJ右下角有一个需要导入的Gradle项目Gradle project needs to be imported的弹出窗口,请选择导入更改Import Changes。1.3 Chaincode文件在左侧的项目文件面板中,在src>main>java下,右键单击它并选择New>Java Class:在Name字段中输入org.hyperledger.fabric.chaincode.AccountBasedChaincode:然后,应该看到以下内容:上面的AccountBasedChaincode(.java)是我们在Java中编写Chaincode的地方。第2步——需求分析在我们开始编码之前,让我们组织我们需要编码的内容。如特性部分所述,在Java Chaincode中,我们将实现:1.用户钱包创建2.用户钱包查询3.钱包代币转账(即从一个钱包向另一个钱包汇款)从上面这个简单的要求,我们需要有以下类:1.钱包类2.Chaincode类——拥有Chaincode我们的Chaincode应该提供以下功能:1.创建一个钱包。2.将代币从一个钱包转账到另一个钱包。3.获取(查询)钱包。4.Init函数,在实例化Chaincode时调用。5.Invoke函数,当用户想要调用函数(1)(2)或(3)时调用。Init函数必须在Chaincode中实现,并且每当我们实例化或升级Chaincode时都会自动调用。通常,它用于初始化区块链中的一些数据。Invoke函数用于接收所有用户函数调用,然后根据Invoke调用(调用)相应的函数(1)(2)或(3)。它就像一个路由器 ,将传入的请求路由到不同的路径。第3步——钱包类现在,我们创建并编写Wallet类。在org.hyperledger.fabric.chaincode下创建一个新包:调用模型包Models,然后确定:应该可以看到:在Models包下,创建一个新的Java类并将其命名为Wallet。(这次我没有详细说明,让大家自己尝试)现在我们为wallet类编码:package org.hyperledger.fabric.chaincode.Models;public class Wallet { private String walletId; private Double tokenAmount; public Wallet(String walletId, Double tokenAmount) { this.walletId = walletId; this.tokenAmount = tokenAmount; } private Wallet() {} public String getWalletId() { return walletId; } public Double getTokenAmount() { return tokenAmount; } public void setWalletId(String walletId) { this.walletId = walletId; } public void setTokenAmount(Double tokenAmount) { this.tokenAmount = tokenAmount; }}钱包具有用于识别特定钱包的wallet id和用于指定钱包拥有多少代币的数量。请注意,在生产案例中,Wallet类应该更复杂。例如,你可能对tokenAmount使用BigDecimal数据类型而不是Double。此外,在我们的例子中,我们在整个交易系统中只支持一种代币类型(即只有一种代币)。第4步——Chaincode类package org.hyperledger.fabric.chaincode;import java.util.List;import org.hyperledger.fabric.chaincode.Models.Wallet;import org.hyperledger.fabric.shim.ChaincodeBase;import org.hyperledger.fabric.shim.ChaincodeStub;import com.fasterxml.jackson.databind.ObjectMapper;public class AccountBasedChaincode extends ChaincodeBase { private class ChaincodeResponse { public String message; public String code; public boolean OK; public ChaincodeResponse(String message, String code, boolean OK) { this.code = code; this.message = message; this.OK = OK; } } private String responseError(String errorMessage, String code) { try { return (new ObjectMapper()).writeValueAsString(new ChaincodeResponse(errorMessage, code, false)); } catch (Throwable e) { return “{"code":’” + code + “’, "message":’” + e.getMessage() + " AND " + errorMessage + “’, "OK":” + false + “}”; } } private String responseSuccess(String successMessage) { try { return (new ObjectMapper()).writeValueAsString(new ChaincodeResponse(successMessage, “”, true)); } catch (Throwable e) { return “{"message":’” + e.getMessage() + " BUT " + successMessage + " (NO COMMIT)’, "OK":" + false + “}”; } } private String responseSuccessObject(String object) { return “{"message":” + object + “, "OK":” + true + “}”; } private boolean checkString(String str) { if (str.trim().length() <= 0 || str == null) return false; return true; } @Override public Response init(ChaincodeStub stub) { return newSuccessResponse(responseSuccess(“Init”)); } @Override public Response invoke(ChaincodeStub stub) { String func = stub.getFunction(); List<String> params = stub.getParameters(); if (func.equals(“createWallet”)) return createWallet(stub, params); else if (func.equals(“getWallet”)) return getWallet(stub, params); else if (func.equals(“transfer”)) return transfer(stub, params); return newErrorResponse(responseError(“Unsupported method”, “”)); } private Response createWallet(ChaincodeStub stub, List<String> args) { if (args.size() != 2) return newErrorResponse(responseError(“Incorrect number of arguments, expecting 2”, “”)); String walletId = args.get(0); String tokenAmount = args.get(1); if (!checkString(walletId) || !checkString(tokenAmount)) return newErrorResponse(responseError(“Invalid argument(s)”, “”)); double tokenAmountDouble = 0.0; try { tokenAmountDouble = Double.parseDouble(tokenAmount); if(tokenAmountDouble < 0.0) return newErrorResponse(responseError(“Invalid token amount”, “”)); } catch (NumberFormatException e) { return newErrorResponse(responseError(“parseInt error”, “”)); } Wallet wallet = new Wallet(walletId, tokenAmountDouble); try { if(checkString(stub.getStringState(walletId))) return newErrorResponse(responseError(“Existent wallet”, “”)); stub.putState(walletId, (new ObjectMapper()).writeValueAsBytes(wallet)); return newSuccessResponse(responseSuccess(“Wallet created”)); } catch (Throwable e) { return newErrorResponse(responseError(e.getMessage(), “”)); } } private Response getWallet(ChaincodeStub stub, List<String> args) { if (args.size() != 1) return newErrorResponse(responseError(“Incorrect number of arguments, expecting 1”, “”)); String walletId = args.get(0); if (!checkString(walletId)) return newErrorResponse(responseError(“Invalid argument”, “”)); try { String walletString = stub.getStringState(walletId); if(!checkString(walletString)) return newErrorResponse(responseError(“Nonexistent wallet”, “”)); return newSuccessResponse((new ObjectMapper()).writeValueAsBytes(responseSuccessObject(walletString))); } catch(Throwable e){ return newErrorResponse(responseError(e.getMessage(), “”)); } } private Response transfer(ChaincodeStub stub, List<String> args) { if (args.size() != 3) return newErrorResponse(responseError(“Incorrect number of arguments, expecting 3”, “”)); String fromWalletId = args.get(0); String toWalletId = args.get(1); String tokenAmount = args.get(2); if (!checkString(fromWalletId) || !checkString(toWalletId) || !checkString(tokenAmount)) return newErrorResponse(responseError(“Invalid argument(s)”, “”)); if(fromWalletId.equals(toWalletId)) return newErrorResponse(responseError(“From-wallet is same as to-wallet”, “”)); double tokenAmountDouble = 0.0; try { tokenAmountDouble = Double.parseDouble(tokenAmount); if(tokenAmountDouble < 0.0) return newErrorResponse(responseError(“Invalid token amount”, “”)); } catch (NumberFormatException e) { return newErrorResponse(responseError(“parseDouble error”, “”)); } try { String fromWalletString = stub.getStringState(fromWalletId); if(!checkString(fromWalletString)) return newErrorResponse(responseError(“Nonexistent from-wallet”, “”)); String toWalletString = stub.getStringState(toWalletId); if(!checkString(toWalletString)) return newErrorResponse(responseError(“Nonexistent to-wallet”, “”)); ObjectMapper objectMapper = new ObjectMapper(); Wallet fromWallet = objectMapper.readValue(fromWalletString, Wallet.class); Wallet toWallet = objectMapper.readValue(toWalletString, Wallet.class); if(fromWallet.getTokenAmount() < tokenAmountDouble) return newErrorResponse(responseError(“Token amount not enough”, “”)); fromWallet.setTokenAmount(fromWallet.getTokenAmount() - tokenAmountDouble); toWallet.setTokenAmount(toWallet.getTokenAmount() + tokenAmountDouble); stub.putState(fromWalletId, objectMapper.writeValueAsBytes(fromWallet)); stub.putState(toWalletId, objectMapper.writeValueAsBytes(toWallet)); return newSuccessResponse(responseSuccess(“Transferred”)); } catch(Throwable e){ return newErrorResponse(responseError(e.getMessage(), “”)); } } public static void main(String[] args) { new AccountBasedChaincode().start(args); }}请注意,在生产案例中,代码应与我的不同。这些代码主要用于演示或教程目的。第5步——在BYFN中运行Chaincode5.1 安装相关项目我们在本教程中使用Hyperledger Fabric v1.4。首先,你可以按照官方说明安装相关项目:1.安装依赖项目2.从Hyperledger Fabric安装示例,程序和docker镜像5.2 Chaincode准备然后,让我们切换到这个目录(假设你完成了上面安装相关项目部分,你应该拥有所有需要的文件和目录):cd fabric-samples/chaincode/chaincode_example02/mv java java_01mkdir java现在,将项目目录中的以下突出显示的文件复制到fabric-samples/chaincode/chaincode_example02/java/:5.3 建立网络cd ../../first-network./byfn.sh up -l java运行此脚本后,可能需要等待片刻……如果你看到以下错误(而不是其他错误),那就OKAY,继续执行下一步骤!!!!!!!!!!!!!!! Query result on peer0.org1 is INVALID !!!!!!!!!!!!!!!!================== ERROR !!! FAILED to execute End-2-End Scenario ==================另外,在运行上面的命令之前,请记住启动Docker。如果你做错了什么,可以运行以下命令关闭网络,然后重新启动:./byfn.sh down./byfn.sh up -l java现在,我们测试我们的Chaincode是否有效。5.4 访问Cli有一个自动创建的cli Docker容器,它是一个控制节点的命令行界面。让我们访问cli:docker exec -it cli bash然后,设置某些程序使用的环境变量:export CHANNEL_NAME=mychannelexport CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/mspexport CORE_PEER_ADDRESS=peer0.org1.example.com:7051export CORE_PEER_LOCALMSPID=“Org1MSP"export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt你可以复制所有这些,然后粘贴到你的终端并按enter。这些环境变量用于让一些Hyperledger Fabric程序知道我们需要使用peer0.org1.example.com:7051来调用Chaincode函数。现在,我们创建了两个带有钱包ID的钱包,tom和sam:peer chaincode invoke -o orderer.example.com:7050 –tls true –cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc –peerAddresses peer0.org1.example.com:7051 –tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt –peerAddresses peer0.org2.example.com:7051 –tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c ‘{“Args”:[“createWallet”,“tom”,“100”]}‘peer chaincode invoke -o orderer.example.com:7050 –tls true –cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc –peerAddresses peer0.org1.example.com:7051 –tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt –peerAddresses peer0.org2.example.com:7051 –tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c ‘{“Args”:[“createWallet”,“sam”,“100”]}‘运行上面的每个命令后,你应该在终端中看到类似的内容:2019-02-09 16:56:55.617 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200 message:”{"message":"Wallet created","code":"","OK":true}" 现在,我们获得上面创建的两个钱包来验证它们是否存在于区块链中:peer chaincode query -C $CHANNEL_NAME -n mycc -c ‘{“Args”:[“getWallet”,“tom”]}‘peer chaincode query -C $CHANNEL_NAME -n mycc -c ‘{“Args”:[“getWallet”,“sam”]}‘运行上面的每个命令后,您应该在终端中看到类似的内容:"{"message":{"walletId":"tom","tokenAmount":100.0}, "OK":true}""{"message":{"walletId":"sam","tokenAmount":100.0}, "OK":true}“在上面,我们可以看到之前创建的两个钱包可以被查询。他们都有100个代币。接下来,我们进行转账交易,让我们将10个代币从tom钱包转移到sam钱包:peer chaincode invoke -o orderer.example.com:7050 –tls true –cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc –peerAddresses peer0.org1.example.com:7051 –tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt -c ‘{“Args”:[“transfer”,“tom”,“sam”,“10”]}‘最后,让我们再次验证两个钱包:peer chaincode query -C $CHANNEL_NAME -n mycc -c ‘{“Args”:[“getWallet”,“tom”]}‘peer chaincode query -C $CHANNEL_NAME -n mycc -c ‘{“Args”:[“getWallet”,“sam”]}‘你能看到下面的结果:”{"message":{"walletId":"tom","tokenAmount":90.0}, "OK":true}""{"message":{"walletId":"sam","tokenAmount":110.0}, "OK":true}“请注意,现在Tom的钱包仍然是90个令牌,而Sam的钱包有110个令牌,交易已完成并写入区块链超级账本中。第6步——清理exit./byfn.sh down然后,删除目录fabric-samples/chaincode/chaincode_example02/java并将目录java_01重命名为java。谢谢!如果你喜欢我的内容,请关注我学习最新内容!======================================================================分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、帐户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。ERC721以太坊通证实战,课程以一个数字艺术品创作与分享DApp的实战开发为主线,深入讲解以太坊非同质化通证的概念、标准与开发方案。内容包含ERC-721标准的自主实现,讲解OpenZeppelin合约代码库二次开发,实战项目采用Truffle,IPFS,实现了通证以及去中心化的通证交易所。C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括帐户管理、状态与交易、智能合约开发与交互、过滤器和交易等。java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。汇智网原创翻译,转载请标明出处。这里是原文通过Java Chaincode实例学习交易系统中基于Hyperledger Fabric帐户的钱包模型 ...

February 26, 2019 · 4 min · jiezi

蚂蚁双链通:基于区块链的供应链协作网络

摘要:以“数字金融新原力(The New Force of Digital Finance)”为主题,蚂蚁金服ATEC城市峰会于2019年1月4日于上海如期举办。ATEC区块链行业研讨会分论坛上,蚂蚁金服区块链高级产品总监杨俊带来了主题为《供应链金融,不止于金融:蚂蚁双链通——基于区块链的供应链协作网络》的精彩分享。杨俊总监的演讲由三个部分组成:蚂蚁金服的区块链与供应链协作为企业带来的价值。企业进行区块链尝试时会遇到的问题。蚂蚁金服可以为企业提供的协作能力与模式。杨俊 蚂蚁金服区块链高级产品总监区块链与应收流转目前,市场上基于区块链的供应链金融基本上是从应收账款切入的。应收账款是最容易数字化的资产,其业务模式比较简单:核心企业核心供应商进行应付账款确认,将应收账款拆分转让,再将应收账款转入金融机构进行融资,金融机构之间或金融机构与投资者间用ABS的方式再次进行资产的转让或融资。无论是合同转让、融资产品还是ABS产品,均为已经成为成熟的业务产品,区块链的使用让这个旧有的业务模式变得更加可靠并容易实施。蚂蚁金服做到了应收账款确认、流转、融资、清分的全生命周期上链,资产的确权和流转以链上为准,而不是简单的业务存证。区块链的以下四个特点使其在金融领域发挥出了极大价值:1.多方性:区块链无需依靠中心化系统即可帮助很多企业进行多方协作,多方是区块链中非常重要的特征。2.可信性:区块链模式的分布式特性、多方共识特性、不可篡改特性保证了整个数据资产的可信性。3.高效性:区块链通过可信的方式进行数字化,使其成为高效的可在线上完成的工作。4.智能性:在区块链上附加智能合约可编程的资产,通过资产的流转来实现管理上的优化及其他业务领域的创新。区块链技术虽然没有创造新的业务,但却依靠其特性为金融领域、供应链领域及更多相关领域创造出了新的价值。区块链模式对企业的价值对于企业而言区块链模式有如下的一些价值:1.对于核心企业而言,区块链模式可以很好的改善其子企业的资金使用效率。通过区块链模式核心企业可以用自身内部资产流转提升整个集团的资金使用效率,以此提升企业运作效率。对于额外有金融板块的公司来说,区块链技术可以为这样的公司带来额外的收益,为核心企业在财务领域创造不小的价值。2.通过区块链的方式,企业与供应商间可以建立密切的协作关系。蚂蚁金服的区块链技术可以做到对供应链进行多级分析并进行穿透式的管理,对于很多对供应链管控要求严格的行业是一个很大的助力。通过区块链技术可以在企业与供应商间更快更好地建立良性的协作与管理关系。3.通过区块链模式可以建立一种新的协作方式。供应链的中间渠道将变得更顺畅,很大程度上方便了核心企业的管理。对于原材料企业与上游大企业来说,在提升企业效率的同时,还可以降低企业的金融风险并把绩效上的融资业务做得更好。4.对于蚂蚁金服而言,通过区块链的方式可以让供应链上的小微企业得到更好的融资服务。除此以外,对于很多中型企业来说,通过区块链方式可以很好的协调管理应收应付这项复杂繁琐的工作。对于应收账款过多而造成很大经营风险的企业而言,通过区块链的方式可以得到信誉良好大企业的应收账款凭证,对于企业经营稳定性的提高有很大的帮助。对于需要融资的企业来说,通过区块链的方式可以使用应收凭证很便捷地在线进行融资。区块链模式探索中的难题对每个企业而言,多种多样的选择带来不同的价值与代价。企业构建区块链也是如此,企业在利用区块链方式构建自己生态的同时,往往被多种多样的可选择路径困扰。这时一个十分重要的考量标准为:企业技术上、风险管控上的投入与所建立的生态产出是否匹配。如上图所示为企业在选择发展自身区块链模式时的可选路径:1.对于加入其他企业构建的平台的企业,无法完全信任平台对其独立性、企业隐私的保证。2.加入金融机构所构建平台的企业,往往受到金融机构类型平台的限制,很难向除开金融以外的方向进一步发展。3.不同企业、合作方等多方协作构建的区块链联盟由于经验与技术的不足无法产生很好的协作关系。4.一些企业选择放弃发展区块链。5.技术选型上的困扰。区块链技术虽然很有发展,但目前尚处于不成熟的阶段,无论公司使用公链技术、联盟链技术或是传统的中心化技术,都会面临各自的问题。如下图所示,蚂蚁金服绘制了企业所关心的雷达图,图中将区块链的优劣分为以下几大考量维度:高可靠性合法合规性分布式的开放隐私安全可运营性在上图所示的雷达图中,黄色线条代表的公链技术在分布式开放与高可信度方面做的很好,而在合法合规性、隐私与安全方面,公链模式还差的很多,一旦应用实名后在隐私方面将很难得到保障。在雷达图中的深蓝色线条代表了联盟链。传统的联盟链中,机构与机构之间,企业与企业之间完成相互的业务,合法合规性是很高的,高可信性也比较可观。在隐私安全方面联盟链远远强于公链,在可运营性方面同样表现不俗。而在分布式开放方面,传统的联盟链基本上仅为机构间的业务交流所用,分布式开放能力比较不足。蚂蚁金服双链通对于上述种种选择区块链时面临的难题,蚂蚁金服的新品牌双链通可以很好的进行解决,双链的涵义分别指区块链与供应链。如下图所示,双链通可分为联盟网络、企业运营服务、金融基础业务设施这三大部分:蚂蚁金服会与所有合作伙伴一起构建区块链的联盟网络。蚂蚁金服将作为这个联盟网络最主要的技术运营方及开发方。蚂蚁金服拥有完全自主可控的核心技术,可以解决很多开发中的问题及技术难点,并通过全球的技术网络无缝支持联盟网络的开发与运营。联盟网络作为企业级、金融级商业应用,安全性与隐私性将十分可靠。蚂蚁金服落地了全球第一个硬件级的隐私保护方案,将隐私保护从硬件层面做起,排除掉一切不安全的因素。在开放性方面,蚂蚁金服将会为企业级应用提供配套的基础设施以帮助合作伙伴成功构建起自己的业务。在应收账款及其他功能性领域,例如应收账款的确权和转让等业务,业务安全性要求高,风险很大,必须要用可靠的措施来完成。在这一准金融领域,蚂蚁金服拥有多年的沉淀与丰富的资源,可以为企业提供安全可靠、合法合规的融资与金融通道。在供应链的协作方面,如何让客户企业发现潜在目标,如何让客户企业真正获得价值是一大难题。蚂蚁金服在B类客户特别中小微企业上面,拥有多年合作经验并通过大量相关基础设施作为配套开发了符合这样中小公司利益的双通链网络。最核心的区块链联盟网络、金融业务的基础设施配套、面向企业运营服务能力的配套三者组合成为了蚂蚁金服的双链通服务,这是一个可以用多种方式组装的合作蓝图,一个由多方组成的协作网络。蚂蚁双链通未来的协作生态面向未来,蚂蚁金服计划构建区块链的协作生态。如下图所示,图的中央部分代表蚂蚁金服发起建设的基础设施,周围部分是蚂蚁金服的合作伙伴:1.核心企业是蚂蚁金服最重要的合作伙伴。在这些合作伙伴当中,不仅有与蚂蚁金服合作的核心企业,还可以包括其下属的财务公司、保理公司、信托公司甚至自有的银行等。这些下属公司也可以成为蚂蚁金服区块链的联盟成员,并把核心企业的业务进行打包。2.对于不具备自己开发业务系统的链上中小企业来说。蚂蚁金服提供了一个轻量的业务平台,帮助中小企业直接上链进行交易。蚂蚁金服有很高的网络公信力,同时也正在引入审计与监管机构的参与,值得中小企业的信赖。同时行业的组织也可成为行业联盟的成员之一。3.银行与金融机构均可成为区块链联盟成员,可以在平台上进行网银、身份核实、账务甚至资金结算等业务。对于更高层级的服务商、合作伙伴来说,依托核心能力,可以为蚂蚁金服合作的客户提供更多的供应链协作、供应链管理相关的能力。通过这种方式,双链通可以和所有的客户及合作伙伴建立一个良好的协作生态。 点击阅读更多,查看更多详情

February 25, 2019 · 1 min · jiezi

以太坊开发者工具的最新清单

以太坊开发者工具的最新终极清单,用于在以太坊上开发应用程序的可用工具,组件,框架和平台的指南。对于任何开发者,无论你是一个睁大眼睛的Web3新手还是一个头发灰白的OG加密无政府主义技术霸主,Github都是你的朋友。特别是ConsenSys Github可能是你在整个互联网上找到的最明确的Ethereum开发工具库。无论是基础知识,编码语言,IDE,API,ABI,框架,最佳实践,智能合约标准,测试工具还是faucets,ConsenSys Github都能满足你现在开始在以太坊区块链上构建去中心化应用所需的一切。ConsenSys的产品经理推动了这个清单的创建,他们认为需要在新的和经验丰富的区块链开发人员之间更好地共享工具,开发模式和组件。新开发者从这里开始!Solidity:最流行的智能合约语言。Truffle:最流行的智能合约开发,测试和部署框架。通过NPM安装CLI,然后从这里开始编写你的第一份智能合约。Metamask:与Dapps交互的Chrome扩展钱包。Truffle boxes:以太坊生态系统的包装组件。EthHub.io:以太坊的全面概述,包括其历史,治理,未来计划和开发资源。Infura:可扩展,安全,可靠地访问以太坊网络。开发工具/tool智能合约开发工具/tool智能合约语言/languageSolidity:以太坊智能合约语言。Bamboo:一种变形的智能合约语言。Vyper:新的实验性pythonic编程语言。LLL:低级Lisp语言。Flint:正在开发的新语言,具有安全功能,包括资产类型,状态转换和安全整数。框架/FrameworksTruffle:最受欢迎的智能合约开发,测试和部署框架。Truffle套件包括Truffle, Ganache, and Drizzle. 深入了解TruffleEmbark:DApp开发框架。Waffle:高级智能合约开发和测试框架,小巧,灵活,快速(基于ethers.js)。Dapp:DApp开发框架,DApple的继任者。Populus:以太坊开发框架中最可爱的动物图片。Etherlime:基于ethers.js的Dapp部署框架。Parasol:敏捷智能合约开发环境,包括测试,INFURA部署,自动合约文档等。它具有灵活和不受欢迎的设计,可无限制地定制。0xcert:用于构建去中心化应用程序的JavaScript框架。IDEsRemix:内置静态分析的Web IDE,测试区块链VM。Superblocks Lab:内置浏览器blochain VM,Metamask集成(一键部署到Testnet/Mainnet),交易记录器和实时代码WebApp以及许多其他功能。Atom:使用Atom编辑器Atom Solidity Linter,Etheratom,autocomplete-solidity,和language-solidity包。Pragma:非常简单的Web IDE,用于实现solidity,以及自动生成的智能合约接口。Vim solidity:Vim solidity 语法文件。Visual Studio Code:Visual Studio Code扩展,增加了对Solidity的支持。Intellij Solidity Plugin:开源插件JetBrains IntelliJ Idea IDE (free/commercial)语法高亮,格式化,代码完成等。YAKINDU Solidity Tools:基于Eclipse的IDE。具有上下文敏感的代码完成和帮助,代码导航,语法着色,内置编译器,快速修复和模板。Eth Fiddle:由The Loom Network开发的IDE,允许你编写,编译和调试智能合约。易于共享和查找代码段。测试区块链网络/TestGanache:用于测试以太坊区块链的应用程序,带有可视UI和日志。Kaleido:使用Kaleido打造财团区块链网络。非常适合PoC和测试。Pantheon Private Network:在Docker容器中运行Pantheon节点的专用网络。Orion:PegaSys执行私人交易的组件。Artemis:PegaSys的以太坊2.0信标链的Java实现。Cliquebait:使用非常类似于实际区块链网络的docker实例简化集成并接受智能合约应用程序的测试。Local Raiden:在Docker容器中运行本地Raiden网络,以进行演示和测试。Private networks deployment scripts:私有PoA网络的即插即用部署脚本。Local Ethereum Network:私有PoW网络的即插即用部署脚本。Ethereum on Azure:联盟链的部署和治理以太网PoA网络。getho:DApp开发平台,包括PoA私有区块链和智能合约测试工具。Ethereum on Google Cloud:基于PoW构建以太坊网络。Test Ether faucetsRinkeby faucetKovan faucetRopsten faucetUniversal faucetNethereum.Faucet:一个 C#/.NET faucet。以太坊的交互/Communicating以太坊前端APIs/FrontendWeb3.js:Javascript Web3Eth.js:Javascript Web3替代方案。Ethers.js:Javascript Web3替代,有用的实用程序和钱包功能。Web3Wrapper:Typescript Web3替代方案。Ethereumjs:以太坊的实用函数集合如ethereumjs-util和ethereumjs-tx。flex-contract和flex-ether现代零配置的用于与智能合约交互和进行交易的高级别库。ez-ens简单的零配置以太坊名称服务地址解析器。web3x:web3.js的TypeScript端口。优势包括包括与合约交互时微服务构建和完整类型安全。Nethereum:跨平台的以太坊开发框架。Drizzle:使用Redux库将前端连接到区块链。Tasit SDK:一个JavaScript SDK,用于使用React Native制作原生移动端的以太坊dapps。Subproviders:与Web3-provider-engine 结合使用的几个有用的子提供程序,包括用于为你的dApp添加Ledger硬件钱包支持的LedgerSubprovider。web3-react:用于构建单页以太坊dApp的React框架。Vortex:一个Dapp-ready Redux Store。借助WebSockets,智能和动态后台数据刷新。Truffle和Embark。其他Javascript替代品elm-ethereumpurescript-web3以太坊后端APIs/BackendWeb3.py:Python Web3Web3.php:PHP Web3Ethereum-php:PHP Web3Web3j:Java Web3Nethereum:.Net Web3Ethereum.rb:Ruby Web3Web3.hs:Haskell Web3KEthereum:Kotlin Web3Pyethereum:以太坊项目的Python核心库。Eventeum:以太坊智能合约事件和后端微服务之间的桥梁,由Kauri用Java编写。Ethereumex:Ethereum区块链的Elixir JSON-RPC客户端。EthContract:帮助查询Elixir中的ETH智能合约的一组帮助方法。Bootstrap/out of box toolsTruffle boxes:以太坊生态系统的打包组件。Pantheon Private Network:在Docker容器中运行Pantheon节点的专用网络。Testchains:预配置的.NET devchains,用于快速响应(PoA)。Blazor/Blockchain Explorer:Wasm区块链资源管理器(功能样本)。Local Raiden:在Docker容器中运行本地Raiden网络,以进行演示和测试。Private networks deployment scripts:私有PoA网络的即插即用部署脚本。Parity Demo-PoA Tutorial:构建具有2个节点的PoA测试链的分步教程,具有奇偶校验授权共识。Local Ethereum Network:私有PoW网络的即插即用部署脚本。Kaleido:使用Kaleido打造财团区块链网络。非常适合PoC和测试。Cheshire:CryptoKitties API和智能合约的本地沙箱实现,可作为Truffle Box使用。Aragon CLI:Aragon CLI用于创建和开发Aragon应用程序。ColonyJS:JavaScript客户端,提供用于与Colony Network智能合约交互的API。ArcJS:便于javascript应用程序访问DAOstack Arc以太坊智能合约的库。Ethereum ABI (Application Binary Interface) toolsABI decoder:用于解码以太坊交易中的数据参数和事件的库。ABI-gen:从合约ABI生成Typescript合约包装。Ethereum ABI UI:从以太坊合约ABI自动生成UI表单字段定义和相关验证器。headlong:Java中的类型安全合约ABI和递归长度前缀库。One Click dApp:使用ABI在唯一的URL上即时创建dApp。Truffle Pig:一种开发工具,提供简单的HTTP API,用于查找和读取Truffle生成的合约文件,以便在本地开发期间使用。通过http提供新合约ABI。模式和最佳实践/Patterns & Best Practices智能合约开发的模式/Patterns for Smart Contract DevelopmentDappsys: 安全,简单,灵活的以太坊合约构建模块有解决以太坊/ Solidity常见问题的方法,例如, eg.白名单/Whitelisting可升级/Upgradable ERC20-TokenERC20-Token-Vault认证/Authentication (RBAC)…several more…为MakerDAO或The TAO提供构建模块。在创建自己未经测试的解决方案之前,应该咨询。 - 使用情况见Dapp-a-day 1-10和Dapp-a-day 11-25OpenZeppelin: Solidity语言中可重用且安全的智能合约的开放框架。可能是最广泛使用的库和智能合约。与Dappsys类似,更多地集成到Truffle框架中。关于安全审计的最佳实践的博客Advanced Workshop with AssemblySimpler Ethereum Multisig:特别是Benefits。CryptoFin Solidity Auditing Checklist:常见审查结果清单,以及审核主网启动合约时需要注意的问题。aragonOS: 构建DAO,Dapps和协议的智能合约框架易读性:智能合约可以升级到更新版本。权限控制:通过使用auth和authP修饰符,你可以保护功能,只有其他应用程序或实体才能访问它。转发器:aragonOS应用程序可以将其意图发送给其他应用程序,以便在满足一系列要求时转发意图。可升级性/UpgradebilityBlog von Elena Dimitrova, Dev at colony.iohttps://blog.colony.io/writin…https://blog.colony.io/writin...Researchblog von Aragon驱动库开发高级solidity开发OpenZeppelin代理库基础设施/Infrastructure客户端/Ethereum ClientsPantheon:PegaSys的Java客户端。Geth:Go客户端。Parity:Rust客户端。Aleth:C++客户端。Pyethapp:使用pyethereum的Python客户端。Trinity:使用py-evm的Python客户端。Ethereumjs:使用ethereumjs-vm的JS客户端。Ethereumj:以太坊基金会的Java客户端。Harmony:EtherCamp的Java客户端。Seth:Seth是一个以太坊客户端工具,就像命令行的MetaMask。Mustekala:Metamask的以太坊轻客户端项目。Exthereum:Elixir客户端。EWF Parity:Tobalaba测试网络的Energy Web Foundation客户端。Quorum:JP Morgan支持的允许实施以太坊支持数据隐私。Mana:用Elixir编写的以太坊全节点实现。存储/StorageIPFS:去中心化存储和文件引用。IPFS-Store:具有附加搜索功能的IPFS存储服务。OrbitDB:IPFS之上的去中心化数据库。JS IPFS API:IPFS HTTP API的客户端库,用JavaScript实现。TEMPORAL:易于使用的API到IPFS和其他分布式/去中心化存储协议。Swarm:分布式存储平台和内容分发服务,以太坊web3堆栈的本机基础层服务。消息传递/MessagingWhisper:DApps相互通信的通信协议,是以太坊web3堆栈的本机基础层服务。DEVp2p Wire Protocol:运行以太坊/Whisper的节点之间的对等通信。Pydevp2p:RLPx网络层的Python实现。测试工具/Testing ToolsSolidity code coverage:Solidity代码覆盖率工具。Solidity coverage:Solidity智能合约的替代代码覆盖范围。Solidity function profiler:Solidity智能合约分析器。Sol-profiler:备选和更新的Solidity智能合约分析器。Espresso:快速,并行化,热重载solidity测试框架。Eth tester:用于测试以太坊应用程序的工具套件。Cliquebait:使用非常类似于实际区块链网络的docker实例简化集成并接受智能合约应用程序的测试。Hevm:hevm项目是以太坊虚拟机(EVM)的一个实现,专门用于单元测试和调试智能合约。Ethereum graph debugger:Solidity图形调试器。Tenderly CLI:利用人类可读的堆栈跟踪加速你的开发。Solhint:为智能合约验证提供安全性,样式指南和最佳实践规则。Ethlint:用于识别和修复Solidity(以前称Solium)中的样式和安全问题的Linter。Decode:npm包解析提交给本地testrpc节点的tx,使其更易读,更易理解。truffle-assertions:一个带有额外断言和实用程序的npm包,用于测试与松露的Solidity智能合约。最重要的是,它增加了断言特定事件是否已经发出的能力。Psol:具有mustache.js样式语法,宏,条件编译和自动远程依赖包含的Solidity词法预处理器。solpp:Solidity预处理器和flattener,具有全面的指令和表达式语言,高精度数学和许多有用的辅助函数。Decode and Publish:解码并发布原始以太坊tx,https://live.blockcypher.com/…Doppelgänger:用于在单元测试期间模拟智能合约依赖关系的库。rocketh:一个简单的lib来测试以太坊智能合约,允许使用你选择的任何web3 lib和测试运行器。安全工具/Security ToolsMythX:以太坊开发人员的安全验证平台和工具生态系统。Mythril Classic:开源EVM字节码安全分析工具。Oyente:替代静态智能合约安全性分析。Securify:以太坊智能合约的安全扫描程序。SmartCheck:静态智能合约安全分析器。Porosity:基于区块链的以太坊智能合约的反编译器和安全分析工具。Ethersplay:EVM反汇编程序。Evmdis:替代EVM反汇编程序。Hydra:加密经济合约安全框架,去中心化安全奖励。Solgraph:可视化智能合约安全性分析的Solidity控制流程。Manticore:智能合约和二进制文件的符号执行工具。Slither:一个Solidity静态分析框架。Adelaide:Solidity编译器的SECBIT静态分析扩展。Solidity security blog:已知攻击向量和常见反模式的综合列表。Awesome Buggy ERC20 Tokens:ERC20与Token智能合约中的漏洞集合。Free Smart Contract Security Audit:来自Callisto Network的免费智能合约安全审计。监控/MonitoringNeufund - Smart Contract Watch:一种监控大量智能合约和交易的工具。Scout:以太坊上智能合约的活动和事件日志的实时数据Feed。Chainlyt:使用已解码的交易数据探索智能合约,查看合约的使用方式以及使用特定函数调用搜索交易。其他工具/Other Miscellaneous ToolsTruffle boxes:用于快速构建DApps的打包组件。Cheshire:CryptoKitties API和智能合约的本地沙箱实现,可作为Truffle Box使用。Solc:Solidity编译器。Sol-compiler:项目级Solidity编译器。Solidity cli:更快,更简单,更可靠地编译solidity代码。Solidity flattener:将solidity项目与平面文件实用程序相结合。用于可视化导入的合约或验证你在Etherscan上的合约。Sol-merger:替代方案,将所有导入合并为单个文件以获得可靠性合约。RLP:JavaScript中的递归长度前缀编码。eth-cli:一系列用于帮助以太坊学习和开发的CLI工具。Ethereal:Ethereal是一个命令行工具,用于管理以太坊中的常见任务。Eth crypto:用于以太坊的加密javascript函数以及将它们与web3js和solidity一起使用的教程。Parity Signer:移动应用程序允许签署交易。py-eth:为以太坊生态系统收集Python工具。truffle-flattener:在Truffle下开发的Concats solidity文件及其所有依赖项。Decode:npm包解析提交给本地testrpc节点的tx,使其更易读,更易理解。TypeChain:以太坊智能合约的Typescript绑定。EthSum:一个简单的以太坊地址校验和工具。PHP based Blockchain indexer:允许索引块或在PHP中监听事件。Purser:基于以太坊的钱包的JavaScript通用钱包工具。支持软件,硬件和Metamask,将所有钱包都集成到dApp开发的一致且可预测的界面中。Node-Metamask:从node.js连接到MetaMask。Solidity-docgen:Solidity项目的文档生成器。Ethereum ETL:将以太坊区块链数据导出为CSV或JSON文件。prettier-plugin-solidity:用于格式化Solness代码的更漂亮的插件。EthToolbox:一款为以太坊开发人员提供离线工具的网络应用程序。 EC恢复,地址格式化程序,单位转换器,哈希函数,密钥生成器等。Unity3dSimpleSample:以太坊和Unity集成演示。Flappy:以太坊和Unity集成演示/示例。Wonka:Nethereum业务规则引擎演示/示例。智能合约标准库/Smart Contract Standards & LibrariesERCs:Ethereum Request for Comment资料库TokensERC-20:可互换资产的原始通证合约。ERC-721:非可替换资产的通证标准。ERC-918:可采用通证标准。ERC-165:创建一个标准方法来发布和检测智能合约实现的接口。ERC-725:密钥管理和执行的代理合约,用于建立区块链标识。ERC-173:合约所有权的标准接口。热门智能合约库/Popular Smart Contract LibrariesZeppelin:包含经过测试的可重用智能合约SafeMath和ZeppelinOS library可升级智能合约。cryptofin-solidity:一系列Solidity库,用于在以太坊上构建安全,高效的智能合约。Modular Libraries:一组使用以太坊虚拟机在区块链上使用的软件包。DateTime Library:一个节气的Solidity日期和时间库。Aragon:DAO协议。包含aragonOS smart contract framework重点关注可升级性和治理。ARC:DAO的操作系统和DAO堆栈的基础层。0x:DEX protocolToken Libraries with Proofs:包含通证合约的正确性证明。给定规格和高级属性。第二层基础架构的开发人员指南/Developer Guides for 2nd Layer Infrastructure可伸缩性/Scalability支付和状态 / Payment/State ChannelsEthereum Payment Channel:以太网支付通道50行代码。µRaiden Documentation:µRaiden发送者/接收者用例的指南和样本。PlasmaLearn Plasma:网站作为节点应用程序,开始于康奈尔大学2018年IC3-Ethereum Crypto训练营,涵盖所有Plasma variants (MVP/Cash/Debit)。Plasma MVP:OmiseGO对最小可行Plasma的研究实施。Plasma MVP Golang:Golang实现和最小可行Plasma规范的扩展。Plasma Cash:简单的Plasma现金实施。侧链/Side-ChainsPOA NetworkPOA BridgePOA Bridge UIPOA Bridge ContractsLoom Network隐私Privacy / 保密ConfidentialityzkSNARKsZoKrates:以太坊上的zkSNARKS工具箱。The AZTEC Protocol:以太坊网络上的机密交易,在以太坊主网上实施。预编译UI组件/Prebuilt UI Componentsui.aragon.org:包含Dapp组件的React库。components.bounties.network:包含Dapp组件的React库。lorikeet.design:包含Dapp组件的React库。ui.decentraland.org:包含Dapp组件的React库。dapparatus:可重复使用的React Dapp组件。Metamask ui:Metamask React组件。DappHybrid:基于Web的去中心化应用程序的跨平台混合托管机制。Nethereum.UI.Desktop:跨平台桌面钱包示例。======================================================================分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。ERC721以太坊通证实战,课程以一个数字艺术品创作与分享DApp的实战开发为主线,深入讲解以太坊非同质化通证的概念、标准与开发方案。内容包含ERC-721标准的自主实现,讲解OpenZeppelin合约代码库二次开发,实战项目采用Truffle,IPFS,实现了通证以及去中心化的通证交易所。C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。汇智网原创翻译,转载请标明出处。这里是以太坊开发者工具的最新清单 ...

February 25, 2019 · 2 min · jiezi

手把手教你走进Hyperledger Fabric

现在,Blockchain是业内新的热门话题。但是,寻找良好的资源来学习这项引人入胜的技术并不是一件容易的事。为了让其他人更容易学习,我开始在区块链和分布式分类帐技术(DLT)平台领域开展一系列工作。我将尽力涵盖每一步都需要掌握这些技术。首先,我从Hyperledger Fabric开始。Hyperledger Fabric是Hyperledger旗下的项目之一。Hyperledger是一个分布式分类账解决方案的平台,以模块化架构为基础,提供高度的安全性,弹性,灵活性和可扩展性。让我们从第一步开始一步一步实践:首先,我们必须学习如何安装Hyperledger Fabric的先决条件:安装cURL。安装Go语言。安装Docker和Docker Compose。安装Git。安装Pip在Ubuntu LTS 16.0.4上安装Hyperledger Fabric完成先决条件后,我们将继续执行以下操作:1.在Hyperledger Fabric上构建和部署你的第一个网络2.在Hyperledger Fabric上构建和部署演示示例Fabcar我们正在使用Ubuntu LTS 16.04进行本手动教程:第1步按Ctrl+Alt+T快捷键打开一个终端。$ sudo su输入你的密码$ cd第2步: 安装 Google golang$ cd $HOME/ && wget https://storage.googleapis.com/golang/go1.8.1.linux-amd64.tar.gz$ tar -xvf go1.8.1.linux-amd64.tar.gz设置go的路径$ mkdir $HOME/gopath$ export GOPATH=$HOME/gopath$ export GOROOT=$HOME/go$ export PATH=$PATH:$GOROOT/bin$ go version第3步: 安装 libltdl-dev$ apt-get install libltdl-dev第4步: 安装 docker-­ce$ wget https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/docker­-ce_17.06.0ce­-0ubuntu_amd64.deb$ dpkg ­i docker-­ce_17.06.0ce-­0ubuntu_amd64.deb$ docker -­ -­version注意:上述方法只是利用Hyperledger Fabric项目发布到Docker Hub的Docker镜像。$ docker run hello­-world第5步:安装 python-­pip$ apt-­get install python­-pip$ pip ­- -­version第6步:安装 docker­-compose$ pip install docker­-compose$ docker­-compose ­- -­version第7步:安装 git$ apt­-get install git$ git ­-­ -version第8步:安装 curl$ apt-­get install curl$ curl ­- -version第9步:安装 node.js and npm$ curl ­sL https://deb.nodesource.com/setup_8.x | sudo ­-E bash ­-$ node -­ -­version$ npm ­- -version第10步:从github克隆fabric示例$ git clone https://github.com/hyperledger/fabric-­samples.git第11步:进入fabric-samples目录并安装特定于平台的二进制文件$ cd fabric-­samples$ curl -­sSL https://goo.gl/byy2Qj | bash -­s 1.0.5$ docker images如果一切顺利,你将在屏幕上看到上述输出。第12步:要查看下载二进制文件,请从终端执行以下操作:$ cd bin$ ls第13步:进入first-network目录$ cd ../$ cd first-network$ ls第14步:为你的first network生成所需的证书和镜像$ ./byfn.sh -m generate第15步:要查看生成证书,请使用以下命令:$ ls$ cd crypto-config$ ls第16步:使用以下命令创建第一个网络:$ cd ../$ ./byfn.sh -m up使用Hyperledger Fabric创建第一个网络后,您将看到上述消息。第17步:使用以下命令检查生成的映像和运行容器:$ docker images$ docker ps第18步:关闭创建的网络执行以下命令:$ ./byfn.sh -m down第19步:可以使用以下方法检查已删除创建的镜像:$ docker images我们使用Hyperledger Fabric成功创建了第一个网络。现在让我们尝试另一个例子。第20步:移动到fabcar目录$ cd ../$ ls$ cd fabcar第21步:使用以下命令安装node模块$ sudo npm install第22步:使用以下命令安装grpc模块以与Hyperledger Fabric进行通信:$ sudo npm install grpc第23步:通过执行以下命令启动fabcar的Hyperledger Fabric网络:$ ./startFabric.sh第24步:要首先注册用户,你必须注册一个管理员,以帮助其他用户注册Fabcar的Hyperledger Fabric网络。$ node enrollAdmin.js你可以使用以下命令找到admin的私钥和公钥:$ ls$ cd hfc-key-store/$ ls第25步:注册用户以查询和调用fabcar网络(As Hyperledger Fabric是一个经过许可的区块链,这就是为什么我们首先必须使用其证书注册用户)$ cd ../$ node registerUser.js第26步:使用以下命令查询Fabcar网络(访问分类帐状态)$ node query.js第27步:现在让我们尝试在Hyperledger Fabric之上为我们的Fabcar应用程序提交新记录$ gedit invoke.js在上面的文件中进行以下更改以创建新记录:第28步:现在使用以下命令调用交易。(要在分类帐状态中进行任何更改,我们必须调用函数)$ Ctrl + c$ node invoke.js第29步:查询分类帐以使用以下内容查找你所做的更改$ node query.js恭喜所有人成功运行Fabcar演示。在下一部分中,我将介绍这两个例子的技术细节。敬请期待更多的更新!======================================================================分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。ERC721以太坊通证实战,课程以一个数字艺术品创作与分享DApp的实战开发为主线,深入讲解以太坊非同质化通证的概念、标准与开发方案。内容包含ERC-721标准的自主实现,讲解OpenZeppelin合约代码库二次开发,实战项目采用Truffle,IPFS,实现了通证以及去中心化的通证交易所。C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。汇智网原创翻译,转载请标明出处。这里是原文手把手教你走进Hyperledger Fabric ...

February 25, 2019 · 1 min · jiezi

区块链正在重塑法律(下)

在上一篇文章中,我们介绍了对整个行业内的一些思考,接下来,我们聊一聊区块链对各部门法带来的思考,以及对区块链未来的展望。四、区块链给各部门法带来的思考(一)区块链与宪法以上是整个行业内的一些思考。接下来让我们来看各个部门法。-北大的蔡定剑教授生前是人大法工委宪法的主要学者之一。蔡老师曾说过:宪法的精要在什么地方?宪法的精要就在于限制无限的权力,并将其变成有限的权力。这也是宪法的精神。而区块链实际上就是在这个时代去实践宪法精神的一个技术。它通过代码告诉人们,什么东西是区块链做不到的,这种自我限制,是最有价值的。假设现在中本聪站出来说:「我决定把比特币的上限改成 6400 万个。」大家是不会在意这个改变的。那个也许可以称之为一条新链。这也是为什么在上文中一直强调代码一定要开源。代码不开源别人就不知道开发者在代码内部限制了多少权力。比如 2017 年 ICO 火热的时候,有人把比特币和以太坊的代码改一改并给自己留了 51% 的代币,而这种公开欺诈的代币居然也有人去投资。如果一个人在用代码之前不读代码的话,他根本不知道自己在干嘛。1.区块链为宪法提供了技术上的支持有一些国家,小的地区议会把地区宪法在 GitHub 上直接开源了,获得了好评。但是从现代国家体系和政体稳定的角度来说,让国家的宪法跟区块链发生关系,甚至比较激进地希望用智能合约进行宪法的司法化,都是令人很难想象并执行的。但是从另一个角度讲,区块链未来有可能为宪法、全民公投以及类似宪法性质的组织章程提供一些技术上的支持。例如,基于区块链的公司章程。2.区块链是永恒的举一个例子,有一个词语叫做永恒(Perpetual or Constant)。Constant 在宪法中是预示永续的。区块链为什么也可以被称之为是永续的呢?例如 ETC 和 ETH 的分叉。最早的宪法就是关于 ETC 的宪法,后来产生了分叉。那么ETC 就消失了吗?答案是没有,ETC 的宪法是继续存在的。只是 ETH 在做出了修改之后获得了更多认可,它的价格涨得更高而已。所以可以这样认为:区块链的代码实际上与现实的宪法一样,都有一个永恒的设定。当然永恒不是现实存在的,因为现实中归零的币也很多。可是从长远的角度看,很多被认为是归零币的虚拟货币也是有非常少的人在进行维护的。比如著名的 SBTC,它的市值排名现在在 1800 以外。人家的名字都叫做 SBTC了,韭菜们为什么还要往上冲呢?刚刚也提到,现在是制度经济学家的春天,很多项目都有自己的宪法或者白皮书。这相当于在说:如果你不喜欢我的玩法,你可以去别的地方。也就是说一个人可以同时把身份和财产放在多个宪法环境下。如果现在有人想创立一部宪法,或者说做一个社会性的实验,区块链实际上降低了实验成本。(二)区块链与民法1.主体与去中心化身份让我们再来讲一下民法。大家知道,民法是在处理平等主体之间的关系。先来谈谈主体。业内现在正在做的一个非常核心的技术进展,叫做去中心化身份,也可以称之为自主身份。传统的中心化身份人们现在的身份是谁在进行控制呢?这个控制者是一个中心化的机构,也可以叫做户籍警察。之前我们国家管理相对混乱的时候,一个人实际上可以拥有多个户籍身份。我见过这样一种神奇的操作,自己有一个北京的身份,却又到老少边穷地区办理另外一个身份证。她再会用这个老少边穷地区的身份证去办理移民。所以一个人同时会有两个身份,这是很奇怪的。我曾经有一个案件的对方在起诉我们的时候错用了她的国外的身份,导致这个案子到现都很尴尬,成为了一个悬案。那件事发生到现在已经有八年之久了,可是还是有不明真相的法官给我打电话,问这个案子是什么情况?为什么迟迟没有结案?我把情况告诉他们后,他们也都沉默了。作为同一个自然人,两个身份的照片不一样,生日也不一样。中国法下她是一个身份,美国法下是另一个。没有人有办法确定她的身份。她同时持有中国境内的户口和美国的护照,最后在起诉的时候就用错了身份。她用国内的身份签约了合同,却用国外的护照起诉了我。当她把合同拿出来时,原告被告法官三方都变得很尴尬。区块链的去中心化身份中心化身份会存在大量的问题。大家现在的身份是由国家控制着的。包括 KYC 在内的一些事情都控制得非常严格。然而我们希望区块链能够为大家提供一个自主的身份。也就是自己的身份和信息都由自己来控制。这样一来在需要用到身份的时候,就不用通过第三方来取得自己的身份,而是直接把身份信息交给对方,从而委托对方完成相关的事情。第三方机构无法对其进行删除或者修改。这也是整个区块链技术社区正在进行的一个核心的一个工作。2.代码的民事主体化关于民事主体还有一个问题需要讨论。现在存在一个趋势:代码的民事主体化。区块链的地址可以给代码,也可以称之为算法或者智能合约,提供民事权利能力。也就是说一个人拥有一个地址,他就可以收钱。如果他又有一个账户的话,就可以花钱了,也可以欠钱了。人工智能具有民事行为能力而人工智能会给代码或者说地址提供民事行为能力。所以它可以替账户持有者进行决策:怎么去花钱,怎么去借钱。不知道大家对人工智能是否有所了解。人工智能也分为几个部份。第一点是它可以通过过去的数据形成一个预测。第二点是它还需要一个判断的动作,最后形成决策。这个预测的动作和决策之间还是有一道鸿沟,那就是判断。现在这个动作还是需要人去进行的,所以我们现在还主要把人工智能叫做决策辅助工具,而非完整的决策工具。智能合约可以替代人来填补这个鸿沟。一是智能合约的结构,二是区块链上的余额可以提供一个判断的结构,并且是自执行的。因此在这种情况下,综合几套系统可以形成一个完整的,有效的民事主体。有些人可能会说:钱律师,你想得太早了吧?这些好像都是科幻小说中才会出现的内容。但是,其实这些已经离我们很近了。大家可以关注一下 2019 年 1 月 1 日生效的电子商务法。电子商务法第 48 条规定当事人和一个自主交易系统完成的交易,是有法律效力的。这又是什么意思呢?当一个自然人作为当事人和一个商家提前设定好的机器形成的交易是有法律约束力的。例如大家在购买电话卡的时候是不会有人介入的。而在充值了之后,账户金额就会提高。再举一个例子,自动售货机是一个自主系统,你跟它形成的交易也是有法律约束力的。如果再往前前进一小步,当事人自己就是个机器人或者一段代码,面对的对象也是一个机器人或者代码的话,这个规定就不生效了吗?同一个逻辑完全是可以推道导出来这应该是有效的。而且其实在如今 90% 以上的股市交易都是量化机器人操作的情况下,已经存在了。这种情况下都是机器或者代码在进行买卖,这种交易必然会受到民事保护。再加上人工智能的预测和判断会越来越难以被人类理解。Alpha Go 就是一个很好的例子。最近的终极版的 Alpha Zero 只花费了八小时从一无所知到击败 Alpha Go。这个是非常恐怖的。特别是当两个算法在交谈的时候,人类根本就不知道他们在说什么。这个世界很快就会进入一个新常态。人们要接受这个现实,机器间交流的语言是一个黑箱,是听不懂的。3.区块链为提高平等性做出了贡献传统的交易信息是单向透明的再谈到平等的问题。区块链技术其实为平等做了很大的努力。换言之,区块链做了很多平等方面的工作。这就涉及到区块链无差别存储的问题,也就是上文提到的纯粹记忆的问题。记录一件事的成本其实是很大的。现在的交易过程又是谁在进行记录呢?其实是对手商家在进行记录。电子商务法以及网络安全法一方面规定当事人必须保存三年的交易记录。另一方面又规定如果其它法律法规另有规定,当事人必须能够随时为政府机关提供相关证据。根据法律,在交易的平台,数据会被保存到地老天荒。同时对用户来说,数据三年以后就不可查了,并且用户会被告知:数据已被删除。但是数据其实是一直存在的。因为这是法律要求的,也是商业利益之所在。结果就是信息的单向透明。这就是不平等的根源。人们可能知道在当时发生了什么,但这个也是很有限的。你产出的数据越多,你就越被动。区块链为达到平等提供了一个机会币圈发生过一件很狗血的事情。某交易所的比特币期货交易上发生了闹剧。用户正要准备起诉交易所的时候发现,当天的交易记录以及如何爆仓的记录就消失了。其实交易所的高频集中交易本身和区块链是没有关系的,交易所是中心化机构。我们会看到,数据的不平等是非常可怕的。那么,如何才能达到平等?区块链希望给人们提供一个机会。区块链上的哈希是所有人都能看见的,而交易的数据也能以很低的成本进行储存。不存在交易所将数据删除,而客户主无法查找数据并且数据不可信的情况。这种平等和主体的关系是很重要的。关于数字合同,秘猿科技已经有了一个合作伙伴叫做众签科技在做相关的工作。这家公司也是有清华的技术背景的企业。它做数字合同的工作已经很多年了。4.区块链中的签字具有连续性再同大家谈一下做律师的体会。书面签字真的很恶心。我碰到过很多案子。有时候当事人看到原件会问:这字是我签的吗?不好意思,法官,我要求去鉴定!字迹鉴定首先需要选定鉴定机构。双方在鉴定机构达成共识并统一意见,不然就要抽签,摇号。我自己是去亲自摇过号的。当时是在处理一个海南的案子。为了摇号这一件单独的事情我坐飞机去海口,摇完号再飞回来。摇完号之后,我还得去重庆的西南政法大学办理相关手续。鉴定费要 1 万块钱。在鉴定过程中鉴定老师说:请你提供这个人过去三年的十份他亲笔签字的检材。幸运的是对方是一个商人。在过去的工商资料中还能找到相关的签字作为检材。所以签字真的是一件很恶心的事情。在运用区块链以后,相关的签字可以是连续性的。每个人的签字就在链上。关于什么时候使用过这个签字的信息也在链上。他们就没办法说这个签字不是自己签的。因为过去的与其他交易方的交易都是使用的这个签名。这个事情也就从而能够很容易地说清楚了。5.区块链与物权,债权登记以及侵权证据的固定再来讲一下物权和债权登记。现在国内和国外都有相关的项目做相关的事情。债权登记实际上会和后续要讲到的供应链金融有很大的关系。债权是怎么登记在链上的?这就涉及到应收账款的转让。再有,我们会提到侵权证据的固定。这其实也是民法的重要内容,可以把侵权的证据第一时间就固定给法院。在固定的时候法院就看到了证据。这之后就可以选择起诉还是不起诉。这个也是未来互联网法院想做的事情之一。(三)区块链与商法下面再来讲一下商法(commercial law)。商法的第一要务什么?第一要务是效率。它的第二要务是信用。商法里面对平等性的考虑是往后放的。区块链与公司法以及保险法公司法在刚刚的股权登记系统中提到了。DAO 会在后文提到。它实际上是一种新的组织生产的方式。再谈到保险法。保险法涉及到智能合约的保险。在这里使用预言机直接抓取公开的天气地理数据就可以了。例如航班延误险。因为航班的信息都是公开的。延误了就可以直接通过保险处理。这种方式实际上增强了保险合约的信用。在过去需要一个很大的保险公司达到一定的实缴注册资本才能够售卖延误险。现在不需要这样了,因为延误的数据是很好抓取的。区块链与破产法对于破产法,在这里举一个实例,秘猿科技提供技术支持的中钞区块链,他的区块链系统支持杭州法汇科技的破产案件管理系统。有限责任公司的股东限制是 50 人。未上市股份公司的限制是 200 人。然而出现一千个或者五百个债权人是很正常的情况。这种情况下怎么去开债权人会议呢?很多破产法官一般是没有胆量组织一起开的。很多地方管理相关问题的法官只有两个人,无法对这种情况进行有效管理。通过这个管理系统实际上可以解决破产债权会议投票的问题。这个也是应用的方向的其中之一。人们会看到商业规范以及一些诉讼规范在迅速地区块链化。(四)区块链与行政法接下来谈谈有关行政法的内容。行政机关其实对区块链技术十分感兴趣。但是想要真正运用区块链也存在很多的压力和阻力。如何理解行政法呢?它的本质是对行政权力的控制和规范。也就是说行政法是制约行政权力的,而不是一边倒地为行政权力服务的。区块链在这其中是有天然的优势的。第一个优势就是:控制。就像上文提到的,区块链能够提供绝对的私人财产,也可以通过智能合约提供定向受控的资产。我们能不能把行政权力也化为一种通过区块链控制的权利,以实现对行政权力的独立行使和控制呢。确保行政权力的独立行使是着眼于行政官员可以不受其他行政官员控制和干扰的行使自己职责范围内的权力,确保行政分权落到实处;而确保行政权力的受控是着眼于行政官员不能在自己被授权范围之外行使权力,要受到人大、党委通过智能合约设定的范围和目标的控制。第二个优势是对行政过程产生的证据进行存证,这个大家可以展开想象,就不予展开了。(五)区块链与经济法1.区块链是强大的监管工具经济法中存在两个原则:第一个是市场规制;第二个是宏观调控。这也是经济法的基本的取向。如果从合规方面来看,区块链是最强大的监管工具。人们说比特币是最反监管的,公链是最能逃避监管的。但是如果把区块链技术反过来用的话,大家会发现它是最好,最强大的监管工具。而且它的操作很简单,就是在监管部门放一个节点。所有的实时的商业数据都会在监管部门的电脑上同步。秘猿科技也做过相关的项目。我们曾经有一个聚合支付企业的客户。大家知道,聚合支付是不允许二清的,也不允许企业有自己的资金池。那么企业怎么向央行证明自己没有做二清,没有留资金池呢?为此当时公司给了央行一个区块链的节点。这个系统是建立在区块链上的。通过这个就可以证明公司没有做二清。因为所有的交易都是可见的。当钱到账时,公司这边就即时分发掉了。交易是即时结算的。这就可以证明,公司并没有做二清,也没有资金池。当时我们也给监管部门提供了一个方案。但是后来监管部门最后做了一个中心化的方案,包括有支付牌照的都不允许留资金池了,因此最后也没有再进行应用的扩展。2.税收与区块链税收也可以用到区块链的发票。相关的项目已经开始在全国开展了。全国各地都已经发行了很多这种发票。央行版的数字货币是一个很宏伟的设计。运用这个设计可以解决大量的核心问题,包括税务的设计在内。3.监管逃离人们也能看到在现实生活中出现了大量的加密货币领域的监管逃离。监管逃离在很多情况下其实是因为原有监管思路的局限性。监管部门很难监管加密货币市场,特别是在税上的考虑。例如,美国的 IRS 起诉 Coinbase 被要求提供交易所的数据,这都是在为收税做好准备。(六)区块链与社会法1.区块链与慈善系统社会法强调是相对的公平以及对弱势群体的帮助。区块链作为一种技术实际上非常适合慈善系统。通过这种技术可以去掉很多中间机构。有很多慈善机构每年要收 10% 的管理费,这个比例比很多投资机构都高,顶级的投资机构管理费才百分之一二,这些钱都到不了真正需要他们的人的手里。在去中心化身份出现之后,就可以轻松地验证善款有没有到达需要的人手中。因为交易的过程是可见的,包括善款的花费过程也是可见的。2.区块链会拉大贫富差距区块链为一门技术和历史上所有的革命性技术一样会拉大社会贫富的差距。去积极利用区块链技术的人会获得巨大的财富。而远离这个技术的人可能会被整个社会抛到后面。以后诸如 DAO 这样的生产组织有可能发生零雇员的现象。所有人都会用破碎的时间为代码打工。这种情况实际是现有的社会保障体系无法帮助的。这一点不知道在以后将会如何演化。3.区块链会造成失业区块链应用可能带来大量的白领失业,比如律师业,未来可能就不需要那么多的律师助理了。现在许多的阅卷工作都是由人工智能来完成的。以后的文卷传输送大多会在网上进行,庭审过程也会在网上进行。现在很多律师的工作中需要解决的问题,比如文件应该怎么签字,以后就不复存在了。(七)区块链与刑法1.智能合约为犯罪团伙提供了工具最后再讲一点,其实也是这次内容中最有意思的。接下来要讨论的实际上是有论文基础的。论文叫裘格斯的指环(Gyges’ Ring)。它是 Elaine Shi 写的一篇学术论文。内容是基于智能合约的犯罪。智能合约去除了所有的信任的中间层。它本身就是可以直接被信任的。但是在给商业提供了信任的工具的时候,它也给犯罪团伙提供了同样的工具。2.智能合约与名片犯罪举个简单的例子,有一种行为叫做名片犯罪(Calling Card Crime)。我在国内的知网进行了搜索,没有任何一个文章在讨论相关的问题。不知道大家有没有研究刑法的。这个问题其实很有意思!泄密和非法控制交易系统我在这里就不过多赘述了。和上述情况类似,匿名的买家和卖家可以通过计算机代码完成整个犯罪行为和犯罪激励行为。再回到名片犯罪。Calling Card 是什么意思呢?过去在西方存在一种犯罪过程。罪犯在犯罪现场会为警察或者报纸留下一张卡,以此证明犯罪事件与自己有关并由此获得报酬。现在假设有一个场景:有一个商人想让美国某一个参议员死亡。在这种情况下,商人发布了一个匿名公告告知自己愿意出多少钱使参议员死亡。这时有一个杀手匿名地在以太坊上创建了一个智能合约。合约中提出自己能够在某一个约定好的时间和地点使议员死亡。具体的死亡方式并不重要。重点是信息是可以在公开渠道通过爬虫等方式去来确定的。当然新闻肯定会报道谁在何时因为何种原因死在何处,或者没有原因,仅仅是确认死亡。在以上这种境况下,商人就可以往杀手的地址打钱,如果在特定时点之前没有收到信息金额就原数返回。如果在特定时点以内,智能合约在网络上爬到或者勾选到了信息,这个钱就会打到一个匿名地址,被杀手获得。这个全过程都是匿名的。3.智能合约犯罪将对刑法提出挑战这个东西会对现今的的刑法理论造成很大的挑战,因为不可能指望公链可以回滚。其实 Vitalik 也提过类似的问题。碰到这种情况,假如不是去刺杀某个人,而是使某个火车出轨这种公众性的恐怖事件,又该怎样决策呢?我知道有很多人,特别是国内的很多专家,他们的第一反应是:公链太可怕了!我们一定要把它赶尽杀绝,要不然这种犯罪怎么去遏制?这是可以理解的。但实际上当大家对公链的性质理解到一定程度之后,就会发现这个是没办法阻止的事情,就像枪会杀人一样。其实正确的反应是去研究它,而不是掩耳盗铃,觉得这个东西不好然后就不去接受。其实现在有关于如何在公链上遏制这种行为的讨论。大家可以看到过去的刑法理论以及上文提到的这种行为是可以拆分的。犯罪者可能并不会直接进行犯罪,而是通过智能合约加大各个意外事件的产生的几率。例如已知一辆车的行走路线,犯罪者就可以对路线上其他人工智能控制的车辆给发送一个智能合约,将车速提高 50% 可以获得奖励。最后车上的人可能运气好没死,但是如果他运气不好的话就死了。这种犯罪过程可能相当于多个意外事件最后造成了受害人的死亡。那么这些意外事件到底有没有构成犯罪?并且他的犯意应该怎么主张?他是没有共同犯意的。我觉得这些都会向刑法实践和刑法理论提出一些挑战。当然在技术上大家也都在想怎么去解决这些问题。现在暂时还不存在这种事情。这些还都处在思想实验的状态,也暂时没有出现相关实例。(八)区块链与程序法在程序法中存在这样一个理论:律师,特别是美国律师有一个信仰:程序可以解决所有的问题。举一个简单例子。三个人怎么公平的分西瓜?答案很简单,程序就能解决。从程序来说:谁切谁最后拿西瓜,这样就可以公平公正地分西瓜。这就是典型的不用理工科思维解决,而是用文科的,法学的,程序的思路来解决公平问题的例子。区块链提供了时间轴和签名,所以大量的程序法问题都天然地适合在区块链上设计并解决,包括存证,刚刚提到的身份还有司法投票。因为刚才在部门法里面也都陆续涉及到了程序问题,在这里就不再赘述。五、区块链的未来的展望在最后,我们来讲一讲未来发展的展望。这其中包括三个展望。第一个是政治上的展望。(一)政治上的展望:代码成为新的主体第一个展望是:社会上会出现大量的新的主体:代码。区块链的无限地址服务在很多情况下不是为自然人或是法人准备的。因为有关自然人加法人一起的数量实在太少了,以至于用传统互联网就能在短时间内处理完。区块链在更多的情况下是为物联网上的机器和人工智能算法准备的。现在人工智能有一个趋势叫做自动调参,也称作自动算法。那么这个过程中存在大量的遗传算法。因为大家知道人工智能是一个黑箱,程序员是通过输入的数据和输出的数据调节其中的参数的。调节好之后再用它来处理数据。因为人工智能是个黑箱,实际上没有人知道其内部的工作原理。这种情况下实际上人工智能需要通过类似遗传筛选的方法淘汰掉大量低效的算法。也就是说,它会维持一个很大的算法主体群,使他们计算同样的事情并及时淘汰掉不需要的算法。这些都是区块链可以提供的相关的服务。区块链有海量的低成本的地址可以为物联网提供服务。例如一个分布式太阳能发电群,它的每一个设备的太阳能板的账户不可能是开在银行的账户,这是无法想象的事情。它们肯定是在区块链上的,由区块链提供这种实时的清结算服务。(二)经济上的展望:区块链与物联网和人工智能第二个展望是:区块链将为物联网设备和人工智能算法提供政治治理,市场交易和法律服务。1.人工智能如何进行决策已经难以被人类理解刚刚也讲过了人工智能的决策。《未来简史》中提到:人在未来可能会被机器和代码当成宠物圈养。人们可能已经无法理解人工智能到底如何进行决策。因为它的数据量,交易的频次以及交易的密度都不是人脑能够负担的。这些场景其实离人类已经很近了。2.新的经济组织:DAO经济上,会出现一个新的类型的经济组织。这个组织叫作 DAO(Decentralized Autonomous Organization)。比特币就是一个典型的 DAO。那么它是怎么组织生产的呢?现在的人们主要组织生产的形式是公司制以及投资形式基金制。在 DAO 中是人,更多情况下是设备算法向代码支付费用:加密货币,并购买代码加密资产,比如以太猫。这就是一种客户服务。同时人们也通过把东西卖给区块链代码来获得加密货币。这个过程就不只有区块链在中间工作,其中也会有大量的人工智能的算法在决定价格。在这之后就要看这个算法设定的条件是给所有人的福利最大化吗?经济学家经常做一个假设使所有人的福利最大,最后会得到一个顶点的结果。这个结果会不会剥夺某些个体的权利呢?这种情况下我们也要考虑一个问题,如果都交给人工智能了,人工智能会不会基于环保的考虑,或者说极少数人对于环保的极端要求消灭大多数人类?这种情况很可能需要区块链的设置来约束人工智能的行为。3.拥有代码修改权的组织掌握了巨大的经济分配权在这种情况下,掌握区块链代码修改权的人或者组织会掌握巨大的经济分配权。Garvin Wood 是以太坊黄皮书的作者,他在进行 Polkadot 项目 ICO 的时候被锁了十几万个以太坊。然而想要解锁这部分以太币,需要以太坊回滚。即使他完全可以算是 Vitalik Buterin 的好朋友,最后社区也没有同意回滚的选择。回滚在技术上是有可能性的,但是整个社区将要付出巨大的代价并承担巨大的风险以及不确定性,并且有很大的声誉损失,在此之后可能大家就不和你玩了。部分回滚最后会造成分叉,这也是一个巨大的代价。(三)法律上的展望:区块链降低了制度实验的门槛法律上出现了一个历史上从未有过的景象。法律实践以及制度实验门槛从未如此之低,代价如此之小。过去人们想在一个民族或者一个经济社会里面做一个制度设计或者制度实验,需要推翻一个政府,来实践自己的主张。现在实际上要求没有那么高了。人们可以在区块链上面设计各种投票制度。对于这种法律之间的竞争,分叉也是一种途径。那么最后实验胜出的人他会通吃吗?在这个地方会出现一个跨链协议的概念。现在有很多公链协议实际上在做跨链。跨链就是在不同公链之间的资产如何转移,如何进行兑换,通兑。大家有没有想过,有一天会出现链之间的并购。公司间的并购是经常被提到的。现在其实在现实生活中已经出现了链和链之间的并购。也就是他双方互认对方的资产和身份。这是一种新的玩法。当然也会涉及到大量的协议。举一个例子,Aragon 是一个公链项目。它的口号是要做一个区块链上的特拉华州。主要内容是以公司或者商业为核心的登记和治理。它还有一整套的法官体系,包括三级法院。每级法院的法官的产生的规则都不一样。这是一个很有意思的实验。【交流问答】演讲开始前主持人:这次的讲座和以往不同。以往的讲座更多从技术、商业场景的角度讲区块链落地的问题。而这次,是从法律的角度来切入。这个角度在我的眼中非常重要。在我们这个行业里有一句话:区块链技术和互联网技术之间应该如何比较?答案是,这两者之间是一个对比的关系。互联网是一种技术。技术改变的是生产力,改变的是信息如何传输以及如何传播。而区块链不是生产力。它是生产关系。它会改变我们未来商业运作的模式。区块链技术也可以理解为如何使用数据以及如何规范整理数据的技术。它会对现有的很多的规则产生影响,并对未来的商业模式和过去的商业模式造成强烈的冲击和碰撞。如果有人在这个行业中摸索过,对这些问题应该有所体会。这次我们有幸邀请钱靖到场,来为我们讲解有关的问题。他是秘猿科技的法务总监。有请钱靖。钱靖:非常感谢徐老师的邀请。作为 2001 级法学院本科生,我也是北大人。今天能够回到母校并与大家分享我的想法令我感到非常幸运。这次演讲中我要提到的想法和观点可能超出了过去很多人的理解范围。但是在今天,我还是想通过这次演讲将我个人的这些思考和感悟分享给大家。也许这些结论来听起来很疯狂。可是经过逐步的证明和推导,它们在逻辑上还是可以站得住脚的。推导并理解这些观点和结论需要大家对讲座的内容稍做推敲。而推导这个结论的过程也是一个大胆设想,小心求证的过程。在开始这次的分享以前,请先让我简单介绍一下我们公司的情况。公司的名字叫秘猿科技(Cryptape Technology Inc.)。这个坐落于杭州的公司成立于2016 年。公司的创始人谢晗剑曾在以太坊的核心开发团队里工作。当然,后来他离开了这个团队。我们公司是一家以密码学代码的工程落地为核心的技术公司。我们可以从公司名字的词根(Cryptape)看出来,“crypto”是加密以及密码学的意思,“tape”是磁带的意思。但是我们把这两个词根分开了,加了一个“猿”(ape) ,代表程序员。这样一来,整个名字就代表了“从事密码学工作的程序员 ”。我们公司在去年的时候推出了完全自主知识产权的开源的联盟链的系统(CITA)。如今这个系统已经开源了。我们支持的公链项目,Nervos,也叫做 CKB,在上周同样也开源了。我们做的产品都是开源的。演讲结束后:1.观众提问:您好,我是北大法学院的。我想了解一下区块链在知识产权法方面的应用。钱靖:知识产权是一件很大的事情。我们之前也做过这方面的考虑。有一些公链项目,比如说纸贵科技,也在做版权方面的登记的工作。现在知识产权主要的问题在于维权。这一点在区块链上暂时还难以解决。版权实际上是国家法定的垄断权。但是现在在区块链上登记完以后是需要系统去执行的。然而现在区块链缺乏一个中心系统帮执行这项工作。如果不中心化的话就需要引入人工智能系统进行识别侵权到底有没有发生。这一点在目前还是比较欠缺的。知识产权的价值实际上在于法定给予的垄断地位。这里面隐含着必须存在一个强有力的机关执行垄断权。因为知识产权信息的复制实在是太容易了。阿里在这方面做了一个内部的版权系统。这个系统比国家的版权系统其实更有效率,在这个系统登记可能比在国内版权局更好。阿里会把涉及到侵权的商品直接下架。这个打击力度比国家的还大。这一点也是它作为中心化系统的优势所在。区块链暂时在这个领域没有什么优势。我觉得要等到相关人工智能识别的技术出现以后才可能落地相关的应用。2.观众提问:从区块链这个角度怎么理解存在性证明,存证和保全这三点?钱靖:对于存在性证明,需要回到哈希。每一条哈希对应了唯一的一个原文。Vitalik 在不久前发了一个相关的博文。他举了一个例子:对于一个学位登记系统,它如何确定一个学位是有效的。这包括了两件事情。第一件事情是链上有没有学位登记。在这里我们假设这个人在链上确实有学位登记。第二步是确认登记在链上有没有被撤销的记录。因为学历是中心化管理的,它有可能在登记之后被撤销。做完这两步操作就可以确认学位是否被登记在链上了。这就完成一个存在性证明。当然这其中也会涉及到一些身份和数据结构的问题。也就是如何确认有和被撤销的关系。这里会存在一个相应的哈希。在数据结构定了以后,哈希就变成已知的了。因此直接查这个哈希在不在链上就可以了。第一步确认存在的哈希在不在。第二步确认撤销的哈希是不是不存在的。再来谈谈关于存证的相关问题。现在区块链上不可能存储原件或原文。存储的内容都是哈希。在极端的情况下,一个人可能只有哈希没有原文。因此在这种情况下,暂时存储原文的地方是必要的。这样才能达到存证。存储原文可能通过一个商业化的备份或者替他手段来实现。而这也是需要费用的。现在也存在可以存储原文的区块链系统,例如 IPFS。以及相应的经济系统,比如 filecoin也是可以存储原文的。这些也是去中心化的系统。当然用它们来存会很贵。如果是想存电影的话存在这些里面是不值得的。但是它们确实是去中心化的原文存储。最后再来谈谈保全。我理解的保全首先是一个从合同或者从债务。也就是说首先得存在一个主合同,主债务。现在区块链暂时是没有债务系统的,只有资产系统。所以这个债务可以就作为一个信息在链外存在。或者它也可以作为信息存在于区块链系统中。现在有区块链项目在做跟债务相关的系统,但是规范的系统是很难做的。债权是可以做的,但是债的难点是债是一个相对的概念。这个系统暂时在区块链上有没有特别成熟的基于底层的做法。所以保全只能通过多签来控制资产。这个可能会成为另外一个更大的话题。我们其实倾向于对涉及到这种操作的应该托管到第三方机构。也就是加密资产其实是通过一个第三方中心化机构托管的,这样和债务和保全的操作起来更方便。再补充两点。近期区块链商业事件有两个重要进展。第一个进展是稳定代币。以美元为根基的合规的稳定代币已经陆续地在美国出现并陆续得到了美国地方政府的承认。这是开展区块链商业必不可少的。那么为什么中国不做相关的项目呢?可能是因为在中国人们如果都把人民币换成稳定人民币或者区块链人民币的话,大家就都用它去换美元了,这个是很难去限制的。美元还是强势货币。第二个很重要的进展是很多大的金融机构或银行开展了加密资产和加密货币的托管业务。很多商业用户其实是不想忍受私钥丢失以及私钥审计的风险的。一个人控制私钥是很简单的事情。因为大家内心确信私钥是不会丢的,藏在厕所角落的三个纸条是不会丢的,当然找找看找不到了也没有办法,所以一定要藏好。作为一个公司应该如何审计加密资产?关于这点我和毕马威的合伙人也聊过,确实很难。如果只是通过多签去控制的话。假设公司董事有三个人,这三个人通过多签控制同一个以太坊的加密资产。如果过程中间有一个人消失了,他拿不出这个签字了,怎么办?这些是投资者无法承受的风险,因为你是受托方。所以之前也提到在区块链上的信托结构。信托结构是所有商业结构的基础。现在能想到最好的办法就是第三方托管。它实际上在未来也许会演化成资金池或者区块链的银行。这也有成为将来新的业态。现在的美国已经有大量的机构在积极地做这件事。因为这其中真的存在市场。很多投资人愿意加入这个市场但他们不愿意承担管理和审计的负担。他们也觉得银行是有能力托管加密资产的。最重要的是在这些机构可以即时提取虚拟货币。所以对于以上提到的关于保全的问题,最快的解决方法还是第三方托管。通过多签来控制很可能最后不能达到预期效果。当然,我们也期待能有底层技术上的解决方案,这肯定是更值得期待的。3.观众提问:区块链上的法规和法律会不会受当地的法律的限制?例如中国的区块链项目会不会受到中国国家法律限制,美国区块链会不会受美国的法律限制?现在这两者会有区别,那么将来它们会不会走向融合。钱靖:这个问题很好,也是我们近期正在思考的问题,特别是在现今国家的法律法规正在完善的情况下。现在的整个业态发展存在分层,其中包括 layer 1 以及 layer 2。Layer 1 就是公链,也可以是 DAO。DAO 是一个具有公平性,公开性的去中心化组织。Layer 2 也可以是一个比较公开的链。但它会被称为联盟链,私有链或者合规链。大家可以不把它当作公链。在这一层是可以做合规的。当然也可以不做。但是在这之上肯定存在一个身份。在现实的商业生活中一个人是不可能没有身份的。原因倒不是顺应监管去执行 KYC 和内容控制。而是因为在商业活动中人们都想知道自己的交易对手方是谁并且信用如何。也许他是谁并不重要,但他的信用是很重要的。这样人们才愿意在交易过程中抵押自己的资产,信用以及时间。在不知道对方信用的情况下,没有人是愿意和他做交易的。没有人愿意和通过漂流瓶认识的人谈一个过亿的生意的。如果他对你说他有一辆价值一个亿的车,你会买吗?你会和他做生意吗?你是不可能和他谈生意的。所以我们现在的设想就是在 layer 2 上做身份、商业以及合规。当然也可以不做,如果你想被警察逮捕,想违反网络安全法或电子商务法。我们公司有一个格言:我们是好人。所以我们公司虽然是极客背景出身,但是我们是拥抱合规的。我们会对我们的客户负责,对投资人负责。我们的投资人是招行。所以合规还是要做到的。中国有中国的合规。美国有美国的合规。国际上也有关于 KYC 的相关规定,否则银行之间的转账也是运行不了的。所以我们想在 layer 2 上做身份,合规以及相关的服务。我们不可能给大家一个没办法做合规的区块链或者联盟链系统,并告诉别人需要他们自己做合规。因为合规也是有很细的交互要求的,包括一些黑名单以及技术处理的设置。这是刑法、网络安全法和反恐怖法的死规定,是跳不过去的。我希望大家明白相关的内容是可以做到的。这在技术上是基本上没有问题的。主持人:我一般会问一个问题。这次我会问两个问题,在问这个问题之前我再加一个点评。这个点评就是:钱靖把一件事说的很清楚:他是如何看待区块链的。他认为区块链是对时空的一种转变。以前我们的流动物理时间是匀质的,是慢慢往前走的。一个人做什么事情不做什么事情,时间都是往前走的。它不受任何人的改变。空间也是绝对的。但是他提到在区块链这个世界里多加了另外一个时空世界。这个时间不是像物理时间一样匀速向前的,而是不做事情就没有时间,时间就缩短了。如果做了很多事情时间就被拉长了。换句话说,一个很懒惰,很闲散的人,他的一生可以变得很短。一个很折腾的人做了很多事情,他的可以拉得很长。在这个过程中,对应的块就会累加起来。所以人们的生命在这个虚拟世界里面不是等长的。这是时间的一种变化。它用事件堆积时间,而不是时间本身来度量时间。它的空间变化也有一个很大的十的七十七次方的单位。这是宇宙中原子数量。也就是说每个人开的互联网帐户其实都是用不完的。在这个虚拟的世界里面,这么多帐户和单元变成了空间的构架,而不是现实世界中的物理空间或者银行账户空间。他的空间比我们的空间大得多。如果把这个时间和空间放在一起,假定区块链技术可以在不远将来成熟落地的话,我们世界就改变了。他用非常的清楚语言改变了传统的构架。这样一来,观察这个世界的角度就不一样了。如果我们理解并认同这样的时空的改变,未来所有的商业法律变化都会变得很自然。因为整个世界都改变了。人类的行为模式也会随之改变。在开始的时候我比较入迷,在后来也就不忍心打断他了。下面我提出两个问题。这两个问题都是关区块链技术怎么落地的问题。第一个问题是:钱靖提到的不可能三角(性能,安全,去中心化)是不可兼得的。这就造成了速度变慢的后果。如果是这样的话,是否意味着从技术上讲区块链技术的应用场景会变得很窄。很多事情因为区块链太慢会不会无法完成?这就是第一个问题。因为我比较喜欢 matrix。这部电影我看了好几遍。在钱靖刚才提到开源算法时,我就在思考:如果算法是开源的再加上发生的更改,似乎就突然出现了一个开源算法的世界。人是附属于那个世界的。我的第二个问题就是,能不能想象一个如同 matrix 的机器变成一个独立自主的存在,而人类变成了这个世界的附属。钱靖:感谢徐老师给我这个机会,也感谢他精彩的点评。他所提到的确实是我想说的事情。第一个问题是关于不可能三角的问题。这个也是业内着重讨论的问题。首先刚才提到 EOS 放弃了去中心化这种特性来提升性能。而我们的解决方案是 layer 1 加 layer 2。Layer 1 是继续维持公链的 DAO。他依旧是又难又慢又贵的。它的任务是达成一个全球的共识。Layer 2 会被分成多个侧链。美国的策略是把核心数据存到 layer 1 上。他不需要把所有数据都存在上面,而是只需要储存交易里面核心数据。侧链是根据不同的场景来专门设计的。假如说这个场景只是需要一个非常中心化的系统,例如五个节点。大家要知道一开始大量的联盟链的所有节点在自己那里运行的,然后再一个个地分下去。这种情况下大量的侧链是不需要去中心化的。他们是天然的中心化的。这种情况下,它们扩展的空间也不大。这种情况下性能可以做到非常高。我们在一般环境下测的 TPS 是一万五左右。这个其实可以满足绝大多数的商业交易环节,除了像天猫双十一那种情况。再分享一个情况,电子商务法发生了知识产权的改革,也就是采用了港湾原则和红旗原则。简单说一下,当一个电子商务平台收到一个第三方知识产权侵权并附带相应证据的信息的时候,对应的商品必须先下架。然后再通知商家举证。商家再把证据交给举报人。如果举报人在 15 天以内没有起诉,商品就会被恢复。这个设计的结果很可能是双十一不存在了。大家理解吗?在集中的双十一时刻卖货促销的话,竞争对手如果直接起诉,下架的时间最少 15 天。在这种情况下这种超高 TPS 的场景有可能会被抹掉。所以我说可能我们在性能上的瓶颈在区块链技术上已经不是第一位了。也就是说 TPS 已经基本够用了。欢迎大家来了解一下,在这里打一下广告。我们在开源之后找了十几家企业,其中包括素不相识的和相识的企业。它们有的是在做原型,有的是在进行实在的业务。我们也会推出一个联盟平台,将这些公司都放在其中,欢迎大家来抱团创业。我们公司不会做应用跟大家抢饭碗,而是希望大家能带着资源,想法以及对行业的理解来到新的区块链空间里面创业。我相信三五年之内,手机上就会充满基于区块链的 DAPP。这个过程会很快。我们马上会享受到:我的这张苹果照片转给你以后我就没有了这种奇葩的体验。在过去我复制一张照片给你,我其实自己还有这张照片。然而这张照片传给你,你可以把它传得到处都是。现在是苹果照片在给了你以后,我就没有了。全世界只有你一个人拥有。未来就会发生类似的改变。关于第二个问题,在 matrix 的描绘中未来机器人把人类作为电子或者信息的产物。我的想法是这样的:人工智能的力量其实是有限的。它可能会发展到一个瓶颈。因为徐老师刚刚提到的情景除了区块链以外也很依赖人工智能的发展。换句话说,人工智能可以替代人做出很多决策。然而人工智能在数据利用上具有边际效应递减的特点。也就是说对于同一套统计数据,第一次读取它所能取得的信息,假设是 100,在第二次就会递减到 60,第三次可能就只有20。所以对同一套历史数据人工智能所能攫取的新信息是有限的并且递减的。这个可能会是未来发展出的瓶颈。最后人们会发现人工智能最多做我们的狗,而不是 leader。Matrix 以及其他很多科幻片的理解都是未来存在一个统一的 AI 或者代码控制着人类的生活并掌握了所有的数据。这也是互联网 2.0 公司很容易造成的隐喻。大家都知道现在互联网 2.0 公司取得了所有人的所有数据。其他人是没有权力去和它们斗的。不知道大家知不知道,拿走人们做多也最敏感的私人数据的软件是什么?答案是共享单车。首先它的数据是最敏感的人身数据。这在刑法中是最敏感的数据。因为它完全可以被用来执行暗杀活动。第二是它是采集数量最多的。这种数据每天无间断地采集,可以达到 1500 多次。人们长时间使用微信,它最多也才采集 200 多次。最近的新闻中提到共享单车在欧洲已经被告了,因为违反 GDPR 相关的规定。所以将来会不会出现这种机器控制人类的场景?我希望是不会的。我刚刚设想的场景是代码代表了过去人的遗愿。我不知道各位有没有信佛教的。各种佛经是有愿的概念的。怎么定义一个人是菩萨?怎么去判断为什么佛教中要念阿弥陀佛?阿弥陀佛本愿经告诉人们在地球这种浊世是永远无法成佛的。这世上会存在一个阿弥陀佛的地方。只要一个人去念佛,最后在他死的时候就会被接到那个净土去。而在那个净土修佛会方便一点。这是整个净土宗的理论基础。所以我觉得现在所设想的代码管理人类中的代码其实代表了已经逝去的人的遗愿,或者其他人的综合愿望。大家可以把它当作一个遗愿基金。如果你喜欢它的条件,你就有权利参与进去,你可以选择和它玩。如果你不喜欢它,你可以选择离开或者选择分叉,在这个场景中你不是被奴役的,不是没有选择权的。同时,你也可以按照你自己的意愿和财产设立一个基金或者一个公链,并在这个公链上列一个白名单。举一个例子,我把我的 DNA 信息存在上面。未来如果有人和我的 DNA 达到了一定的相似程度,我就把相应的钱交给他。这种行为是符合自私基因的理论的。如果你的线粒体以及 DNA 的基因和我相似,我认为你和我有生物学上的关系,我就可以认为你可能是我的孙子。或者我孙子的后代。如果是女性来设立的话,可以通过线粒体来审查,线粒体相同的可能就是我女儿的女儿的女儿。这就可能使我自己的意愿比犹太人管理的家族基金更加永恒。我觉得这更可能是我们应该设想的场景,而不是存在一个机器人的暴君。一个中心化的场景可能是互联网 2.0 企业想要做的事情,不是互联网 3.0 想做的事情。这就是我想给大家描绘的图景。我们是希望拆掉一些太过集中化的互联网 2.0 平台的。具体怎么拆就涉及到区块链和大数据的关系。而这就是另外一个话题了。数字金融 Workshop北大数字金融中心的讲座课,将邀请监管层、业内专家、技术专家、学者授课,内容涵盖数字金融的理论创新、技术突破、行业监管、商业应用,本学期讲座课(2018 年秋季)将重点追踪“区块链”、“数字货币”等领域。钱靖钱靖毕业于北京大学法学院,是我国最早系统了解和研究区块链技术的律师之一,专注于区块链领域发展和法律监管的研究工作,现任杭州秘猿科技有限公司法务总监。钱靖律师作为专家多次向国内监管部门提供专业意见和建议,也多次受邀至北京大学、中国人民大学等科研机构进行专题讲座。 ...

February 25, 2019 · 1 min · jiezi

蚂蚁区块链在司法存证领域的探索与实践

摘要:以“数字金融新原力(The New Force of Digital Finance)”为主题,蚂蚁金服ATEC城市峰会于2019年1月4日上海如期举办。在区块链行业研讨会上,蚂蚁金服司法存证产品负责人栗志果做了主题为《蚂蚁区块链在司法存证领域的探索》的精彩分享。在演讲中,栗志果作为蚂蚁金服司法存证产品负责人向大家分享了蚂蚁区块链在司法领域上的探索,主要包括三个方面,分别是司法链的独特价值,独特能力和实际应用,全方面的向大家展示了目前商业模式升级所面临的问题,通过对区块链领域和司法领域的三个发现进行详细的阐述来展示区块链在司法领域上的能力及其实际价值。栗志果 蚂蚁金服司法存证产品负责人首先提出一个预测:在2019年,相比于区块链的创业机会来说,中小企业有另一个更大的机会,那就是把传统的商业模式升级为信任商业模式。这种升级的关键有一个秘密的核武器,也就是本文中所谈到的司法链。之所以这样说,是基于包括2018年在内的之前对于司法领域以及区块链领域的三个重要发现,接下来就详细分享这三个发现。司法链的独特价值第一个重要的发现就是司法链背后有一个非常坚实的架构基础,并处于历史的发展时期,这个发展时期被称为互联网的最后一公里,其实在过去的20年中,互联网行业的关键词是连接。在PC互联网时代,通过PC互联的方式对终端进行连接,在那个时代,发现这个趋势的企业都抓住了门户、搜索引擎这样巨大的商业机会,2013年,进入到了移动互联网时代,很多人都不太相信移动互联网时代的关键词还是连接。在这个时代通过移动互联网的方式把许多智能终端、个人设备连接在一起,在端设备的数量以及在线时间得到了极大的提升。在这个阶段抓住机会的人便造就了微博、微信、支付宝这些超级应用。而目前关注到一个非常重要的变化就是随着连接变化不断扩大的同时,连接质量也发生了非常大的变化,这被称为第二条曲线,也就是说原来连接的对象是信息,现在很可能变成了资产。那么资产和信息有什么不同呢?主要的不同有三点,第一点,资产是唯一的,而信息是可以被无限复制的。在互联网时代,通过复制的方式可以让信息传递的成本降到最低,但连接的对象是资产时,便出现了一个致命伤,那就是无法通过复制的方式进行传递,这个资产给了一个人后就不能再给其他人了。第二点,资产和信息相比,资产更加脆弱,或者说更加珍贵。资产就是钱,在信息数字化的过程中,可以很方便的把信息放在互联网上,但是对于资产来说,这样是行不通的,因为资产的背后是真实的利益,第三点:资产和信息相比,资产对于安全性的要求非常高,很多问题也必须去面对,包括黑客、竞争对手的攻击,欺诈等,这些都是链接资产需要解决的问题。这也就是资产和信息的第三个不同点,资产如果发生了纠纷是需要解决的,在现实中,可以让法院来解决,但如果是在互联网中,是很难处理的。上述所说的资产的三个特点是很难通过传统的互联网方式去解决的。同时互联网的发展使得人们越来越懒,如果在10年前,很多人还能够接受资产连接会花费得时间比较久,但是现在人们就很难接受,比如为了签署一个合同,需要花费两到三周的时间进行邮寄,为了做一个跨境支付在很多传统机构中频繁出入,花费高额的成本。而且与20年前的连接方式相比,目前互联网的连接难度变大了许多,因为许多人发现信息被连接后,数据变得很有价值,那有价值怎么办,只能把价值沉下来,沉下来就变成了价值深井,规模越大,价值越深,同时会形成另外的一个问题,叫做数据孤岛。这些问题都是司法链需要考虑并加以解决的。坦白的说,法院在信息互连的20多年间,一直走在信息化的末尾,直到今天,对于电子数据的认证,在法庭上也是非常困难的。因为电子数据具有脆弱性,可篡改性,需要通过各种形式来证明当时的证据是有效的,所以很难被法院认可成为证据。但现在,法院是站在历史的机会节点上,是有机会成为数据产生、完成连接的基础组成部分。资产一定会发生纠纷,发生纠纷后将会由法院进行全链路的审核。这是一个独特的价值,是互联网最后一公里的价值,通过连接的方式,连接资产,打破数据孤岛、价值深井,这才是真正的价值完成,这种模式实际上是属于中小企业的,包括个人用户,以上便是司法链的价值基础。司法链的独特能力接下来讲的二个发现,在做资产连接的时候,要求其实是非常高的,因此在探索上文的模式时发现司法链有一个非常独特的能力,那就是其实是一个原子级别的信任连接器。用最简单的方式想一想,如果出现一个价值孤岛,需要对它进行连接,一定有各种各样的连接方式,连接主要有四种方式,第一种就是不进行连接,把它放在银行保险柜里面,第二种方式是坏的连接,即通过技术的领先性、不平等性,通过黑客技术剥夺数据资产的拥有权,当没有合法连接的时候,坏的连接一定存在,第三种是看起来是好的连接,但实际上是脆弱的连接,现在又很多连接的方式,在市场形势比较好、泡沫比较大的情况下拥有一定的市场,但一旦碰到真正的价值落地就破裂了,第四种就是司法链,用15个字可以概况,即全流程记录、全链路可信、全节点见证。接下来看一下司法链的能力是什么。在讲能力的时候要看司法链解决的具体问题是什么,首先第一个问题是资产是脆弱的,因此在进行资产的连接时要能够具备真实安全的基本特点。安全包括隐私保护,这并不是一个简单的事情,支付宝诞生的第一天就是从担保交易开始的,解决的问题时买方和卖方之前交易的真实性,后来,基于支付宝,提出了芝麻信用,很多人都有芝麻信用积分,通过以往的信用记录,对用户能否履约提供大数据、人工智能方面的参考,使得真实安全更进了一步。接下来便到了区块链,区块链提供了一项非常重要的能力,那就是真实不可篡改,使得信任在真实安全的级别上又向前推进了很大的一步。因此司法链解决的第一个问题就是做资产相应的连接一定要保证最底层的连接器是真实安全的,这种真实安全不是放在口头上说的,也不是在实验室里的技术,而是经过用户的认可,市场的考验和大规模业务量的考验的。第二个问题非常关键,当通过一个真实安全的连接器把大家连接到一起,一旦数据资产被侵害了,发生了纠纷要如何处理?司法区块链这两年一直是朝这个方向进行的,通过把公证处、司法鉴定中心、法院拉入司法链的最底端,对数据进行相应的鉴定,保证了一旦数据资产发生纠纷,能够被公正有效的处理。这是一种非常强大的制度,这也是司法链是解决互联网最后一公里问题的真命天子的根本原因。到目前为止,司法链已经保证了技术可信和制度可信。但这还不够,接下来便介绍第三个关键问题。第三个问题是在资产的互联中,连接的成本不能过高,用户已经养成了点一点鼠标、搜索按钮就能获得无数信息的习惯。区块链火了许多年,但到目前为止真正的用户不到2000万,且日活很低的原因,一是太难用,二就是使用成本太高。因此在进行资产连接时,必须是非常简单的,非常易用的,成本很低的。就像支付宝最开始在做实名认证的时候,可以通过人脸扫描的方式很快的完成用户的支付,同时安全级别很高。所以真正的连接器要具有低成本,高应用性的特点。基于上述三个独特的问题,阿里于9月18日和杭州互联网法院一起发布了原子级别的信任连接器打造的互联网司法链。司法应用案例最后我们来说最后一个发现,那就是区块链的机会其实是在中小企业手中,最大的红利是在中小企业上而不一定是区块链的用户,司法链从9月18号发布到12月5号,整个业务规模已经超过了1200万。得到了大量企业用户的认可,证明了司法链的市场的确是非常旺盛的。而且有很多先行者也进行信任连接器的打造。事实上,信任连接器的打造一定不是只有一家公司能完成的,它是需要联合、联盟的方式来进行的,当信任连接器打造好后,会给商户,商业模式带来很大的升级机会,这种升级机会可能是以前从未想到的。首先司法链能够大大提升用户的维权效果,举一个例子,在中国,版权的保护是非常落后的,像是图片领域只有5%的正版,其余的都是盗版,但是维权从立案到审判,一审需要8个月的时间,获得的赔偿仅有500-600元,但是花费的时间成本、经济成本远远超过赔偿金额。但司法链的出现可能会造成一个颠覆性的变化,因为可以使维权成本降低一到两个数量级。其次,司法链可以增强品牌的信任度,一方面使企业是和司法链,和政府认可的品牌、平台站在一起,另一方面使企业通过信任连接的方式把自身的商业模式清晰透明地告诉用户,使用户产生非常强的信任感。特别是创业者,能够在早期就拥有巨大的流量。最后,司法链解决的是互联网最后一公里的问题,使得用户的使用成本产生非常大的下降。因此使用司法链的模式是真的是让传统商业模式升级成为信任商业模式。点击阅读更多,查看更多详情

February 23, 2019 · 1 min · jiezi

蚂蚁区块链平台BaaS技术解析与实践

摘要: 以“数字金融新原力(The New Force of Digital Finance)”为主题,蚂蚁金服ATEC城市峰会于2019年1月4日在上海如期举办。在ATEC区块链行业研讨会分论坛上,蚂蚁金服区块链BaaS技术总监李书博做了主题为《BaaS入门到精通:区块链技术如此简单》的精彩分享。演讲中,李书博首先从技术方面介绍了蚂蚁区块链BaaS平台,随后从实践的角度介绍了客户如何快速地实现上链,最后带领大家一起详细地了解了平台的合作服务流程。李书博 蚂蚁金服区块链BaaS技术总监本次直播视频精彩回顾,戳这里!以下内容根据演讲嘉宾视频分享以及PPT整理而成。本次的分享主要围绕以下三个方面:一、蚂蚁区块链BaaS平台的技术方面二、蚂蚁区块链BaaS平台的实践方面三、蚂蚁区块链BaaS平台的合作流程方面一、蚂蚁区块链BaaS平台的技术方面蚂蚁区块链BaaS支撑了众多的区块链业务场景和上链数据流量,其平台背后必然拥有着难以想象的黑科技和先进技术。那么BaaS平台究竟是什么呢?这个问题可以从三个方面进行回答。首先,它是一个开放式平台。有别于单一的区块链技术,蚂蚁区块链BaaS平台是基于云平台开放的区块链技术,这样做有两个方面的好处:1、可以充分利用云计算本身的弹性、高可用性和灵活性;2、又能充分发挥区块链本身的信任基础设施的能力,比如多方共识、不可篡改、可信。其次,BaaS通过云服务输出,有三方面的特点:1、它可以作为一种云服务的方式进行输出,这样用户可以根据实际需要来选择;2、它可以快速地实现部署使用,从而节省了用户宝贵的时间;3、它可以使用户在业务上和应用上的投入成本达到最小化。借助于BaaS的便捷性和可用性,各种行业的场景和区块链可以进行有效地结合。这样,BaaS就变成一个区块链在各行业解决方案的基础设施,成为了一个可靠的扎实的信任基础。BaaS平台希望与合作伙伴一起构建出一个开放的生态。蚂蚁区块链的核心技术在2017、2018连续两年都是全球专利排名第一,这些核心技术也将秉承着“共享”和“赋能”的理念分享给大家,让大家可以充分利用蚂蚁区块链上的核心技术:如多种隐私安全的解决方案,包括密码学方案及物理隔离的方案,通过高强度的隐私保护,保证用户的业务和隐私安全。此外,平台支持灵活可定制的商业应用,用户可以简单易用地使用区块链技术和BaaS服务。蚂蚁区块链的定位是企业级的联盟链,如下图所示,它的主要目的是去赋能实体经济,为实际的业务和应用赋能。在企业级的联盟链场景下,蚂蚁区块链BaaS的功能包括以下几个方面:1、联盟链管理。联盟链的创建以及联盟链的联盟组织的管理,是BaaS的一个基本能力;2、身份认证。对于联盟链的每一个参与的企业,都有认证。平台会颁发证书来帮助用户认证自己在联盟链上的身份;3、自动化部署。整个平台对于区块链采用自动化部署的方式。这种方式可以非常快的以低成本方式迅速部署区块链平台,让用户迅速地拥有自己的区块链;4、区块链能力。蚂蚁区块链技术能力的输出目前主要在两个方面,一方面是存证平台,针对区块链的存证场景实现一个在性能上的优化的区块链平台。另一方面是智能合约平台,提供可编程的智能合约运行环境的区块链平台;5、业务配置。在业务配置中,对于不同的场景,不同的业务,其数据的配置和属性都是完全不同的,区块链也对这方面的灵活性提出了更多的要求。在业务配置方面,通过平台提供了数据配置能力来帮助大家配置面向业务的语义;6、开发支持。区块链对于各个场景的应用都需要创新,也需要技术上的开发。平台会提供完备的技术开发相关组件,帮助用户落地最佳实践,拓展更多场景。从平台优势来看,蚂蚁区块链BaaS有五大优势:1、性能高、高可靠性。不仅有存证场景的两万五TPS的处理能力,平台也有高可靠和高容错;2、信任隐私保护。平台不仅在区块链层实现了非常高的隐私保护能力,在BaaS服务层也提供了相应的对于企业身份的认证的能力;3、简单易用。减少区块链投入的成本,减少区块链使用的门槛,使用户不需要了解区块链很深的细节也能利用区块链的能力赋能应用业务;4、跨网络。区块链有一个相对来说深入人心的特点——去中心化。BaaS在跨网络、跨不同云的平台上以及跨公有云和用户IT环境的场景下,提供了相应的支撑和自动化的部署能力;5、云上的网络安全。平台充分利用了阿里云和蚂蚁金融云这样的金融级的云平台能力(如VPC网络)来保证区块链网络安全。下图是蚂蚁区块链BaaS技术框架图,其架构主要分为三层:1、底层是基础底座 BaaS Core,基于对主机以及容器实现了灵活支持的云平台,实现跨平台的灵活运行和部署。对于可信硬件,即基于阿里云的神龙服务器提供相应的硬件服务,可以提供一个高可靠高隐私保护的TEE。除了最早推出的存证平台以外,还会逐步推出智能合约平台以及跨链服务。在区块链的未来中,单链或者一条链存在自身的局限性,未来对于区块链建立信任的基础设施、信任的生态,跨链技术将成为其中非常重要的一环。目前BaaS平台上也正在对跨链服务做相应的支撑,通过跨链服务,平台实现了内部的互联互通,同时也可以通过智能合约和跨链服务对于外部的互联网上的可信数据源进行访问。而且BaaS平台各方面的能力,从管理层面、安全隐私层面、证书、密钥、部署方面都有相应的功能和支撑。2、向上一层 BaaS Plus,把底层的服务和能力封装、服务化,开放为标准化的接口,提供给合作伙伴们一起来接入和使用。这样用户在基础资源上的投入可以大大减少,同时接入业务的耗时也会大大降低。截止到目前为止,平台已经推出了可信存证、可信时间、通用溯源等服务,也会在未来逐步推出像用户连接、安全可靠的云上密钥管理以及实名认证和应用管理等服务。3、再向上,蚂蚁区块链实现了几十个应用场景。在应用场景落地的实际应用都会沉淀形成一层标准的应用解决方案模板,从而方便用户在自己的应用中借鉴其它类似场景的平台能力。二、蚂蚁区块链BaaS平台的实践方面在上文中主要介绍了蚂蚁区块链BaaS平台的技术方面,接下来将从实践的方面来介绍如何使用BaaS平台迅速地把应用接入区块链,即迅速地实现业务上链。从使用场景和流程上来看,会涉及到两类角色,如下图所示:1、联盟成员。联盟成员可以申请加入区块链,从平台获取身份和认证的证书。用户进而会得到开发的组件,去开发自己的应用,同时平台会向用户提供整个区块链浏览器和运行状态监控。2、联盟管理员。它拥有较大的权限,可以创建一个联盟链,也可以创建一个新的联盟,还可以管理邀请联盟成员(例如邀请其他的合作企业加入到自己的联盟、审核申请等)。平台在产品的设计上更简单易用,如下图所示。在初次使用时,平台会提供一个新手引导和开放的测试体验链,这样便于刚刚注册的用户去了解区块链。当用户有了一些基础方面的能力、或者对蚂蚁区块链的联盟链以及组织方式有了一定程度的了解之后,就可以创建组建自己的联盟、创建属于自己的联盟链,同时可以在此基础上开发相应的应用和服务,并能在整个联盟内部进行分享。新手引导中只包含几步:1、生成个人身份。由于平台不会保存用户的私钥,用户可以放心地把公钥上传到平台上面来,并下载认证的证书;2、访问新手引导的测试体验链。用户借此可以快速看到蚂蚁区块链的全貌,通过浏览器了解平台的运行情况和交易的数目,运行示例代码向平台发起交易。那么蚂蚁区块链BaaS平台提供什么样的链呢?下图所示是蚂蚁区块链整个框架和架构。具体分成三类,分别是存证平台、合约平台和跨链平台。在平台底层有虚拟机进行支撑。往上包括智能合约方面的设计、密码学安全和隐私保护,都有相应的自研的核心技术。再向上对于整个联盟的系统治理、合约开发的工具,从模板、系统合约以及各类的合约,蚂蚁区块链都有很好的支撑。依托蚂蚁金服的生态,与多方安全计算、IoT等结合,提供更加多样化的服务。接下来的一个步骤是组建联盟。对于用户而言,如何从无到有地组建一个联盟呢?事实上,用户可以通过平台创建多个联盟,通过联盟管理每个联盟企业。同时对于联盟有管理权限的链进行环境配置,也就是由联盟的管理者进行配置和管理。用户组建好自己的联盟之后,就可以创建联盟内部的链,可以是多条链。区块链的应用与任何行业的应用都是类似的,包括生产环境下的、测试环境下的、QA环境下的、开发环境下的。同样对于链的目的来说,有的是为了开发、有的是为了测试、有的是为了生产。基于这个考虑,在一个联盟内会提供给用户不同的链。当用户创建链以后,可以完成对链的基础规格选择,不同的规格也支持不同的性能。用户通过平台完成创建链之后,可以申请加入这个链,同时下载各个组件和工具。当基础资源以及联盟完成创建以后,最核心的、也是最重要的一步是开发应用,而这也是大家使用区块链的目的。对于应用来讲,具体包括三个层面的工作,如下图所示:1、开发智能合约,由智能合约去实现应用的核心功能,即链上的逻辑;2、开发业务应用去对接区块链服务;3、当用户开发完业务应用以后,会希望应用在联盟内进行一个分享。对于区块链而言,可以是一个联盟机构组织创建一个应用,然后通过平台的进行应用分享,从而可以让更多的联盟参与者迅速地利用或者使用这种应用模式,进而构建出自己的业务和服务。在平台中有两类最佳的实践,一类是智能合约,一类是存证服务。平台提供了轻量级的客户端,用户能够通过SDK或者REST迅速接入区块链的智能合约层或者访问区块链平台。对于存证服务,平台提供了相应的业务视图,可以作为传统应用和区块链存证服务之间的缓存,也可以进行线下的数据分析。其中区块链存证接口的模型结构如下图所示。区块链存证的结构十分基础和简单,但它却具有非常广泛的应用范围,在双11的时候,基于区块链的溯源服务能够支撑1.5亿的商品流转,因此区块链存证赋能的溯源业务也能够体现区块链存证的强大能力。具体来说,存证服务可以分为两类,一类是明文存证,一类是隐私存证。对于链上的数据加密,平台推荐使用一次一密的模式,这种方式既保证了加密的安全性,也有非常好的性能。而业务数据格式接口如下图所示,对于不同场景的应用,其业务数据格式也不一样。尤其是在联盟内,用户需要进行协商,以达成一致的配置。而平台对此提供了非常简单的配置能力,方便用户的数据在链上进行有效的流转。除了以上的能力以外,在存储方面,平台充分和阿里云和金融云的存储能力。对于不同类型的数据采用NAS,云盘或本地磁盘提供存储。在安全上,除了传输层的安全,所有传输层网络层都实现双向的加密;对于数据层的安全和账本层的应用也有很好的支持,可以通过智能合约对数据进行加密。三、蚂蚁区块链BaaS平台的合作流程方面对于合作的服务和流程,从需求对接包括方案的设计,开发、实践以及测试生产环节的搭建到最终业务的上线,总共预计有三个月的时间,其具体流程如下图所示。倘若对于一些标准场景和已经有最佳实践的标准案例,所花费的时间将会大大缩短。在本次区块链创新大赛上也会通过蚂蚁区块链BaaS提供丰富的区块链能力,希望能与大家一起来共创区块链的未来!点击阅读更多,查看更多详情

February 23, 2019 · 1 min · jiezi

区块链正在重塑法律(上)

秘猿科技法务总监钱靖受邀参加北京大学数字金融研究中心举办的数字金融 workshop 第十讲,作为主讲嘉宾就《区块链正在重塑法律》做了主题演讲。下文是基于本次学术讨论意见整理成的文字稿件,虽然不是技术文章,但阅读本文对理解区块链很有帮助,分享给大家,仅供参考。一、特殊的技术会对文明带来重大变革(一)文明是有记录的承载我们今天先回顾一下人类的文明史。众所周知,文明是由记录手段来承载的。最早的文字是篆刻在石板上,泥板上,龟甲上,以及金属上的。我们可以看到这种记载工具主要使用在奴隶社会。 在这之后广泛出现了可以书写的文字,文字书写在羊皮上,丝绸上和纸上。建立在书写文字上的文明,其传播水平相对于刻写的信息提高了一个效率档次。人类来到了封建社会。时间继续推移,人类又进入了活字以及铅字印刷的时代。这个时代是一个印刷传播的时代,一台印刷机可以顶几百个上万个文字抄写员。这是一个书刊,报纸的时代。以我们毛主席为例,如果说毛主席拥有一个大学专业,这个专业就是报人,媒体人。毛主席参加了蔡元培校长在北京大学组织的第一届媒体人的专业培训。作为一个专业的报人,他担任了国民党的代理宣传部长。毛主席和他的同辈人给中国带来的改变毋庸赘述。(二)区块链将成为下一次重大社会变革的基础由此看来,每次重大的社会体系变革,文明体系变革,其后方都存在一种特殊的技术在推动这个变革。现如今,互联网技术发展来到下半场。区块链技术很有可能为下一次社会变革提供一个传播技术的基础。下文会提到,现如今大量的基于印刷技术时代特点设计的法律文书和法律程序设计是存在许多缺陷的。而区块链在很大程度上可以帮助解决这些问题。区块链系统可以被当作下一代的法律效力文书系统的技术背景。而我们观察到这一点,即区块链技术作为新一代的监管科技正在比其他任何区块链应用领域更快的落地。历史上我们可以看到,占卜师对殷商政权的控制;儒教士大夫集团对中国封建社会合法性的控制权;新教各教派是由对圣经版本的不同解释分裂形成的各个教派。谁能够控制法律效力文书,谁就控制了整个社会的通信权利和解释权利。正如历史中反复提醒我们的那样,这种场景也很可能成为即将发生的场景。更需要我们注意的是,这次变革将比过去任何一场类似的变革更加原子化,其所能爆发出来的能量也将是几十倍,甚至百倍于于过去的任何一次文明变革。(三)从四个不同的角度看待区块链这次的讲座内容将从四个方面切入。第一个方面是区块链对一些基本问题的答案。其中包括对时间的答案,对空间的答案以及对能量的答案。而第二个方面是区块链作为基本工具的工具论。这个方面包括了它是怎样看待这个世界的:它使用了哪些工具,以及它使用了哪些方法?构造了哪些全新的博弈环境并形成了哪些新的博弈均衡态?这些方法也许和人们过去所知道的方法都不太一样,就像原始人无法理解一个现代白领的工作意义一样。这些玩法也是区块链的核心,需要人们去重新理解,积极参与的,并将从根本上重新塑造人与人之间,人与物质世界之间的关系。第三个方面涉及到区块链对每个部门法的影响。这种冲击不是表面上的影响,也不是细枝末节的影响。虽然这种影响可能一开始表现在细枝末节上,但是区块链技术最终会对各个部门法的基础,部门法的基本假设以及假设的实现造成比较重大的影响。这些不同的方面会在下文一一讲到。而最后一个方面,在章节的最后,我会对整个行业以及技术应用做一个简单的展望。二、区块链对一些基本问题的答案(一)区块链是一个时钟让我们从第一个问题开始。区块链可以被看作一个时钟。如果与文明史结合来看,最早的时钟是什么?在北大隔壁学校的广场上有一座日晷。日晷上有一根杆子,从杆子影子的位置可以推测时间。这种时钟非常的依赖于太阳并且不精确。同时它只能够提供有限的服务范围,阴天或者晚上就不在服务区了。1.牛顿时间与柏格森时间想要理解时间,首先要区分两个关于时间的概念。第一个概念叫做牛顿时间。它是牛顿力学,也就是经典力学中的一个时间的概念。在经典力学里,时间实际上是空间的附庸。这个时间具有同质,可逆,均匀的性质。换言之,如果将牛顿力学中有关时间的公式在时间变量上逆转,公式也是成立的。除了牛顿时间之外还有另外一种时间。这个时间叫做柏格森时间。亨利.柏格森(Henri Bergson)是一位法国哲学家。在柏格森看来时间是绵延的洪流。它是非均质的,不可逆的。它也是发散的,自由发展的并且是在连续创新的。这个时间是人类的时间。换言之,这个时间是社会的时间。它并不是物理的时间。2.柏格森的习得记忆和纯粹记忆还有一个概念,叫做柏格森记忆。柏格森记忆分为两种。其中一种是习得记忆。以人类的历史为例,人们把过去事件的回忆记录下来,就叫做习得的记忆。胡适曾说过历史是任人打扮的小姑娘。历史学家克罗奇提出,所有的历史都是当代史。建立在这种历史上的记忆就是习得记忆。另外一种记忆是纯粹的记忆。这种记忆是一种比较理想化的记忆。记录者会非常忠实的记录发生过的事情。这种记忆实际上是非常昂贵的。例如古代的史书如果想拥有这种纯粹的记忆,史官想真实地记录发生的史实,比如李世民杀兄屠弟的前因后果,做到这一点需要承受很大的压力。中国传统文化里还有为尊者讳,肆意删改历史的“春秋”史学和政治传统。所以纯粹的记忆是非常奢侈的。3.区块链的时间现在区块链给了人们一个选择,或者一个答案。这个选择就是区块链上的时间。区块链给了社会另外一种时钟的选择。区块链时间具有不可逆性区块链的时间是不可逆的。一般情况下,在确认了比特币上的六个区块之后, 再把六个区块重新推翻的可能性在数学概率上是非常小的。所以当有人进行一个交易,例如我给别人转了 0.01 个比特币,在确认了一个区块以后,换言之就是交易的这个区块被打包以后,交易所就会发出通知:这个比特币已经转入了。但是在这时,比特币里只有一个区块被确认。那么当支付方看到已经有六个区块被确认的时候,比特币的支付就已经完成了。因此,区块链有不可逆的特性。同时,区块链也是不可改的,也就是说区块里的哈希码是无法更改的。区块链的时间是非均质的区块链上的时间还具有非均质的特性。何为非均质?举个例子,以太坊的以太猫交易曾导致以太坊的网络拥堵了很长一段时间。所以有一段时间人们发现以太坊的的交易特别多,这就使得有些交易被拖延了。因此,区块链的时间具有非均质的特性。有的时候区块链上的时间会出现非常火热的情况,有的时候反而又很冷清。区块链时间是发散,自由并且连续创新的区块链的时间又可以被视为一个发散,自由并且连续创新的时间。 这个概念该怎么理解呢?人们经常听说区块链上存在分叉。例如以太坊马上要在块高7,280,000 上做一次硬分叉(注:后来又因为漏洞被推迟了,而且这次硬分叉原则上讲不会出现两条链)。如果这次升级后导致出现了两条新链,硬分叉之前的这段时间实际上是两条链来共享的。但是在硬分叉以后,出现了两个有共同过去的时间。并且在硬分叉这个节点的后面,两段时间的内容是不一样的。所以这个时间是一种自由的,连续创新的时间。区块链时间是由事件堆叠而成的这样一来,区块链实际上给人类,给社会提供了一个可以使用的时间。在过去,人们拥有的时间是国家授时中心颁布的时间。它是物理的时间,由于这个时间是中心化发布的,这个时间很精确,但是人们在社会中交互的时候对这个时间的使用却很难做到精确。在这个时间里,时间和事件也无法紧密地结合。而区块链的时间却是由事件堆叠而成的时间。这个时间里每个事件都对应一个哈希值,每个哈希值都存在一个区块里,而区块是按照事件先后顺序紧密相连的。每一个事件都是另一个事件的时间证据,也就是区块关系上的见证。所以如果想要在区块链上做一些有关商业,政治,文化的事情,首先需要理解一点:区块链是一个时钟。而且这是一个建立在所有过去与未来的事件的见证上的,世界性的时钟。处在这样一个世界性的时钟里,如果有人提问一个商业行为是在什么时候发生的?答案不会是某年某月某日。对方给出的回答会是这个事件发生在以太坊的某一个块高上。而这个回答可能对未来的商业交易来说是更加精确的。因为“块”是可查的。通过这个“块”的底层的交易哈希码就能够查到对应的商业交易,也可以查清哪些商业行为是在此之前,与此同时和在此之后发生的。以下这个图片中的人是以太坊的创始人:Vitalik Buterin。他的手上举着这个牌子是有原因的。 事情发生在 2017 年的时候,有谣传说他因为遇到交通事故而丧命。而 Vitalik 在第二天就在 Twitter 上贴出了这张图片。图片中有他和最新的以太坊的区块报头。这个照片就可以证明 Vitallik 没有死。这就是一个以太坊在运用区块链时间的基本特性的例子。 Vitalik 将块高和报头都写在了这个牌子上。而这张照片是无法在拍照当时以前的任何时间拍到的。(二)区块链与空间让我们再来从空间的角度看区块链。每一个用户在区块链上都会有一个账户。这个账户包括一个比特币的地址。与此同时,用户还会有一个比特币的余额。这个地址可以先简单地理解为一个空间坐标,稍后我们会提到这个空间有多大。而在这个地址上会存在一个值。这个值可以是标量,例如比特币的余额。这个值也有可能是个向量。如果一个账户是被智能合约所控制的,那么这个值就可以被理解为一个向量,向量的特性是有方向的,有条件的。有了坐标,有了标量,还有了向量,我们在这个空间能干多少事情就无需烦言了。1.区块链账户和传统账户的区别传统银行账户那么这个账户,或者称之为空间,跟传统的银行账户之间存在什么区别呢?先回到一个基本问题:银行账户是什么?如果有一个人想拿着身份证去银行开户,银行在开户时会告知一个账号。在此之前,银行会调查这个人在这家银行是否已经开通了三个以上的帐户。如果账户超过了三个,银行会要求这个人把对应的银行卡找出来。或者,如果卡找不到了就需要本人去办理挂失。银行不可能为任何人提供无限的服务。而且银行很难容忍账户里没有钱或者余额太少。如果卡中的余额不足以支付银行的服务费用,银行会把这张卡取消。如果这个人成功地开通了新账户,银行会让他设置一个密码。有一点需要明确:账户的号码是银行给的。而密码是账户持有者本人设定的。账户和密码这两者之间是没有必然联系的。同时这个没有必然联系的两个号码之间的联系是登记在银行的。持有者会自己记下账号和密码。但是,因为账户和密码是登记在银行的,所以最后银行比账户持有者更有发言权。刚才也曾提到,在银行开户会有各种各样的限制和管制。例如根据现今的反洗钱法的规定,大额转账需要汇报。同样的法规在美国可能还更加严历。在美国收到特定金额以上的美元,是需要当事人把合同告知银行的。在合同报备了以后,当事人才能够把钱取出账户。从这个角度出发,美国比中国的管理得还要严格许多。这其中存在各种各样的管制和限制。所以有人会问账户里的钱到底是不是自己的?这个问题的后面会有一个很大的问号。当然还有一点需要注意:我国的存款保险制度。人们曾经会认为银行是不会倒闭的。但是对法律体系熟悉的人就会知道我国在好几年以前就已经推出了存款保险制度。这个制度的最高赔偿金额是 50 万。在这里建议各位把的 50 万以上的存款分散存到不同的银行中。区块链的账户我们再来看一下区块链的账户。区块链的账户是什么?使用区块链的账户首先需要设置一个私钥。换言之就是用户需要先设定一个密码。这个私钥是一个随机数。拥有了这个私钥之后,通过一个计算的过程,用户才会拥有自己的账户地址。举一个例子,有一名用户拥有一个私钥。这个私钥简称 k。k 只有这个用户知道。这个 k 最好不是名人诗句。因为有人可以用程序遍历这种名人诗句产生私钥,这种私钥控制的地址就不安全了。因此私钥应该是一个随机数。拥有了一个私钥之后可以用这个私钥产生一个 K。这个更高一级的钥匙就是公钥。用这个公钥去进行哈希计算,就可以生成一个地址 A。所以说从设定私钥到生成一个地址是一个一以贯之的过程。换言之一个人就可以完成这个过程。如此一来,用户既有一个地址,又有一个操作地址余额的密码。这其中是没有第三方的介入的。除了用户自己没有任何人来登记账户和密钥之间的关系 。用户自己在登记,自己在管理,自己在操作。那么地址有没有数量限制呢?答案是无限。无限是什么概念?地址的数量理论上是由数据结构决定的。这个数量的上限是 2^256。这个数字折算成十进制大概是 1.158 x 10^77。一个数字的 77 次方有多大?根据物理学的最新的研究,通过微波背景辐射计算出的整个宇宙的原子数的量级是 10 的 80 到 82 次方。 所以这个地址数量的上限已经非常接近无限了。可是使用账户的费用是按次计算的。一个账户可以一直放置到天荒地老。如果一个人想将一个地址留给重子重孙,是没有问题的。在这个传承地址的过程中间不需要任何其他的操作。2.区块链财产的绝对私有性以及永恒性为什么现在有一个名词,叫做持币?为什么比特币会变成一个信仰?因为比特币是一个可以把永恒的想象力放置在其上的一个系统。它可以被视为永恒。比特币也可以被当成真正的,绝对的私有财产。现在有任何可以称之为绝对的私有财产吗?也许有人会回答黄金。我记得在很早以前,各国,特别是美国,就曾经在战时有法律规定:不允许个人持有黄金。所以黄金是可以被从个人身上剥夺的,比如二战期间犹太人被剥下来的金戒指,还有日本人在中国掠夺的大量黄金和珠宝。我们知道,犹太人之所以叫 jew,就是因为他们特别喜欢珠宝这种体积小,重量轻,价值高,便于隐藏的东西。犹太人会把所有的财产都换成 jewel 以便随身携带。从这个角度来看珠宝或者贵金属都无法被当成绝对的私有财产。然而区块链上的私有财产,如果有人想要隐藏,是完全可以隐藏的。法哲学中有一句话:私有财产是自由的根基。人们经常讲民主自由。离开私有财产,是无自由可言的。一个社会只有拥有了私有财产,才存在是否自由的概念。如果一个人无法拥有维持自己基本的生物属性的属于自己的财产,也就是说这个社会不承认私有财产,他就没有能力去奢谈自由。接下来再举一个与区块链的财产有关系的例子。这是一种新的“玩法”。在这种“玩法”的特定操作下,财产可以被确定性地丢失。怎样做才能确定性地丢失财产呢?这需要把所有的财产,可能是比特币,也可能是 STO,汇到一个公认的,但又没有人知道的私钥所产生的地址点。这样一来所有人就可以承认,这个财产被销毁了。传统意义上的抛弃财产,是无法确定财产是否被销毁的。这从民法意义讲上叫做遗失物。遗失物是可以被取回的。国家对无人的荒地进行管理,可以马上赋予它物权。在经济上实际上是没有办法去做到这一点的。如果一个人从事制度设计相关的工作,他就会发现这种概念是一把利刃。它对剩余控制是很重要的。现在很多落地的商业项目是以此来进行分红操作。这种分红操作与传统的分红理论是不同的。3.区块链具有可控性物理空间由中心化机构所控制让我们再回到空间这个话题。除了以上提到的这些特点以外,区块链的空间与人们现在理解的空间有什么不同?人们现在所处的空间是被一个中心化机构所控制的。从大的角度来看是国土资源规划部门在管理空间。而从微观的角度来看,就是城管或者县级房屋土地管理部门在进行空间的管理。也许在现实中有人碰到过这种情况:一个地方的规划发生了改变,这个地区刚盖好的的房屋就可以被拆除重建。要知道房屋拆迁是非常容易的。也许对于个人来说,拆除一间房屋是十分艰难的。但对于政府来说,房屋拆迁十分容易。房屋的钥匙在占有房屋中所起的作用微乎其微。电视剧《潜伏》中,余则成说过:我不用钥匙就可以打开这个城市 2/3 的门!区块链空间可以被个人控制空间从来就不是一个个人能够控制的东西。 但是现在区块链给人们提供了一种可能性。这种可能性就是个人控制的点与点之间所能形成的区块链空间关系。而这个关系就是一个人可以通过区块链的私钥来真正控制的东西。这就是为什么未来有一天区块链上的空间可能会比现实中的土地更值钱。因为现在现实中的土地是不受私人控制的。当然这个观点也是见仁见智的,有人可能觉得非私有化的土地更有价值。这个可能会成为一种不同经济制度之间的竞争。4.区块链的量同样具有可控性区块链的量是有上限的区块链的量还有一个特性。这个特性人们以前也许并没有注意过。那就是总量是可以通过代码和算法来控制的。这一点在比特币上体现得最清楚。比特币的总量是 2100 万个。这个数量只会少不会多。因为这个量被产生比特币的代码直接控制住了。只要人们还是用同一套代码去生产比特币,最后比特币的量就不会超过这个上限。这个世界存在哪个上市公司能做到不增发吗?实际上是不存在这样的公司的。人们可以在区块链上通过数学和代码的方法来控制区块链的量。换言之,这个空间中的量是可以进行总量控制的。这是一个很新颖的概念。虚拟货币使构建货币系统的成本降低通过虚拟货币,人们只要花很少的钱就可以拥有一套相当于央行货币系统或者一个上市公司的股票管理系统的计算体系。这是一个可以使用的系统。突然之间流通货币或者证券的门槛变得如此之低了。以至于人们现在甚至可以随时随地就实现这种操作。当然,如何使用这个系统以及这个系统代表了什么是另外一个完全不同的问题。但是至少结算这个步骤现在已经没有十分昂贵了。结算,登记以及存证在以前是十分昂贵的。银行需要购买并使用很多主机,才能够实现一个具有这些功能的系统。这在过去对个人来说是无法想象的。但现在个人可以做到这一点了。如果有人想做商业系统的话也一定要理解这一点。实现这种结算功能本身已经没有价值了。它的价值存在于结算之后,在于和什么资产进行挂钩。(三)区块链与能量1.比特币十分耗能刚刚讲到了时间和空间。接下来让我们从能量的角度来看区块链。大家都知道比特币最大的缺点就是它太耗能了。生产比特币的过程是很贵很慢又非常耗能的。这跟节能环保的理念背道而驰。比特币的能耗是多少呢?算力是计算能耗的一种功率。比特币的算力单位是哈希每秒。普通矿机的算力一般是 T 哈希每秒。2017 年国家统计局给出的数据是全中国的耗电量是 6.3 万亿千瓦时。而这个数字已经是全球第一了。中国已经在2014 年左右的时候超越了美国,成为全球用电量第一的国家。而美国在第一名这个位置保持了 200 多年。也就是说自从发电机被发明以后,美国就一直在用电量上位居第一。然而现在中国成为了第一名。而且中国在这方面跑得很快,并把美国远远地甩在了后面。如果用中国总用电量这个数字来进行对比,据估算今年生产比特币的耗电量能够达到 5.937 x 10^10 千瓦时。这个数是什么概念?它几乎达到了 2017 年中国用电总量的百分之一。这是一个非常大的用电量。跟中国这种巨兽级体量的用电量比起来,它还能够达到百分之一。这个数字还要继续增长。而且增长率还会很高。如何看待生产比特币的能耗问题?这个问题在以太坊白皮书就被提出来,并且确定了以太坊必须要向 PoS 转型的路线图。虽然现在以太坊还是在使用与比特币类似的 PoW 机制,不同是以太坊在用 GPU 进行“挖矿”。但是现在以太坊已经准备要向 PoS 转型了。 2.比特币是一个生命物理学家张首晟先生在 2018 年 12 月 1 日不幸去世。他曾经从物理学家的角度给出一个解释:“生命行为是把自己的熵减小。换言之就是增大自己的负熵,并使周边环境的熵增大。这种做法看起来是在浪费世界的能源。但实际上它使我们得到了一种更可贵的财富。这种财富就是一种共识。”这个观点应该如何理解呢?实际在改革开放之初就有很多人开始关心如何理解生命这个问题。这个观点涉及到了伊里.亚普里戈金(Ilya Prigogine)的耗散结构理论。这个理论包括了如何去解释生命。每一个生命的新陈代谢都是在不断消耗负熵并增加正熵的过程。钱学森的工程控制论以及后续的信息论其实都是建立在这同一套熵的理论上的。因此如果逆向地看待这个关于熵的理论,就可以产生一个这样的设想:比特币是一个生命。因为它在不断地消耗能源并创造负熵以维持自己的“生命活动”。比特币成为了人类社会中第一个通过代码运行形成的生命体。它可以被当成一个物理学意义上的生命。如果比特币被视为生命,比特币的耗能又应该如何被看待?秘猿科技现在正在支持的一个公链项目Nervos 也将采用 PoW 机制。这个项目核心创新是对比特币的 UXTO 模型进行扩展。耗能可以被理解为是数字世界扎在现实物理世界的根。3.比特币完成了资产上链有一个概念一直被提及:资产上链。如何才能做到资产上链? 比特币在这方面做的就十分出色。它做到了能源资产上链。大家可以认为比特币是资产上链做的最好的区块链之一。其他区块链可能都没能完全解决这个问题。但是比特币做到了。它运用了一套博弈结构,做到了能源的资产上链。所以人们可以信任比特币,因为比特币是扎根在现实物理世界的。4.区块链十分耗时如果想要理解区块链,有一点必须明确:区块链注定要又贵又慢的。与比特币相关的交易是一秒钟七笔。以太坊是一秒钟二十笔。这两个正好是每秒事务处理量最低的两个虚拟货币。要知道天猫还有京东在双 11 的交易 TPS 是以几十万笔每秒来计算的。区块链不是云计算。有很多开采虚拟货币的矿主为了将电费压到更低,会告知政府自己在进行的项目是云计算以争取补贴。但区块链并不是云计算。云计算是通过分割计算任务来提升整个计算效率的。 云计算是提升效率的。而区块链是消耗效率的,它的效率很低。业内有一个术语叫做:不可能三角。这三角分别是性能,安全以及去中心化。这三者是不可能兼得的。因为以太坊和比特币选择了提升安全和去中心化,它们的性能就会很低。这两者达成的是最可靠的全球共识。而全球共识就是又贵又慢的。与之相对,EOS 实际上是强调性能的。它现在的 TPS 性能可以达到 3000 到 4000 之间。但代价是它在很大程度上放弃了去中心化。EOS 可以写入数据的节点只有 21 个。同时它还存在一些限制。在某个节点的交易是可以被 block 的。换言之,就是交易可以被拉入黑名单。这实际上是一个十分中心化的做法。不仅如此,EOS 还有大量的人为制定的规则。根据规则可以人为地暂停交易。那么 EOS 到底算不算区块链呢?这个问题是存在争议的。但是在这里提到的,只是对不可能三角三种特性的取舍。这就是从时间,空间以及能量的角度来看待区块链。能量最后转化成了人们的共识。有的文章也把这种共识叫做社会可扩展性。社会可扩展性说起来比较拗口。但这个名词在学术上相对比较严谨一些。三、区块链作为基本工具的工具论(一)区块链是软件开源运动结出的果实接下来让我们来了解一下,在整个新的商业结构里面还有哪些玩法是大家不熟悉的。区块链是软件开源运动所结出的果子。在以下这张图中左侧是软件开源,右侧是硬件开源。软件开源是从 1991 年的开源系统 Linux1.0 开始的。硬件开源也有很多。其中有一个叫做 RISC-V。在这里简单地介绍一下,因为这可能跟目前所说的内容有关系。RISC-V 是 CPU 的指令集。1.个人电脑的指令集在个人电脑时代,只存在一个指令集。这个指令集叫做 x86。这个指令集是英特尔还有AMD公司正在使用的指令集。然而这个指令集是闭源的。并且这个指令集非常复杂。现如今它包括了几十万条的指令。现今个人电脑的英特尔制造的 CPU 用的指令集就是 x86 指令集。这种指令集有两个特点。第一,它的存在是闭源的。换言之,只有特定公司懂得如何编译这种指令集。第二,这个指令集非常的复杂。其中有几十万条指令。这么多指令是很难进行修改的。将这个指令集开源,其他人也看不懂;能看懂也不敢改,一改很可能就崩了。非专业人员很难对这些指令进行编译。这种商业模式给英特尔这些核心的芯片厂商带来了巨额的垄断利润。 2.手机端的指令集还有一个指令集。它是手机芯片的 ARM 指令集。编译这个指令集的公司是一家英国公司。这个指令集是有开放许可的。授权费用大概在 1000 万到 2000 万美元之间。有这个指令集的存在,谷歌开源的安卓系统才会大规模应用。安卓就是手机操作系统软件的开源。ARM 并不是开源,但是它是公开许可使用的。所以在国内可以看到众多厂商,只要它是一个大规模的公司,这些厂商就可以制做自己的手机,比如步步高的 OPPO 和 VIVO。还有很多家电厂商也可以做手机,比如 TCL。这是一种商业模式。这也是中国现在手机厂商能够通过自己努力去占领印度以及非洲市场的原因。印度人用的手机和非洲很多国家的人用的手机都是中国制造,但是手机的品牌大多数人在国内并没有没听说过。这种手机并不在中国售卖。它们不是针对中国人设计的产品。它们的设计理念是超长待机。超长待机是什么概念?这些手机充一次电可以用半个月。因为有些非洲国家的人时隔半个月才能找到可以充电的地方。所以这些手机不是为中国人设计的。但是人们会发现这个市场比原来宽松了许多。 3.物联网时代的指令集说完个人电脑和手机的指令集,我们现在来谈谈物联网时代的指令集。我们将RISC-V 称之为物联网时代的指令集。这是一个什么样的指令集呢?这个指令集是 2016 年加州伯克利大学专门研究指令集的教授做的。这个指令集的指令十分简略,基本指令控制在一百条以内。这个教授说:根据他多年对指令集的研究,这一百条以内的指令可以搭建出其它所有的复杂的指令。而且这个指令集是开源的。不知道大家对 IC 行业有没有了解。现在已经有很多基于 RISC-V 的芯片在流片了。也存在很多大的芯片生产设计厂商提出会支持 RISC-V。RISC-V 是专门为物联网设计的。它的指令集会达到 32 位甚至更小的 16 位,并拥有更低的耗能。在不远的将来,人们就会看到,过去的昂贵的嵌入式芯片很快就会被基于 RISC-V 的芯片全部替代。 这个改变是 2016 年才开始的,到现在为止也不到三年时间。因此这会是一个重大的机会。这个就是开源的玩法,我们看到大量的软硬件产品在进行开源,包括很多大厂的产品。以上提到的软硬件对程序员或者从事 IC 行业的人来说应该更为熟悉。这些软硬件都是他们日常在使用的。在这个过程中也许中间出现了很多误解,开源到底是什么意思?首先代码开源运动不代表着免费。代码开源运动被称为自由代码运动。任何人都可以使用这些代码,但是不代表这些代码是免费的。(二)区块链和开源运动的关系1.区块链应该是开源的那么区块链和开源运动是什么关系呢?有这样一个说法:没有开源就没有区块链。原因是区块链创造的信任是基于代码产生的。这里存在误解。这个误解是就很多国内的公司不会宣传自己的做的区块链是开源的。很多人会问如果做的是区块链,为什么不开源?这些公司不敢对区块链进行开源的原因,我不敢妄自揣测。但是如果所做的区块链不是开源的,其他人就不能看到对应的代码。不能看到代码就不能证明这个是区块链还是一个 TPS 很高的中心化系统。因此不开源的区块链技术是无法在技术上实现区块链的增信的,你还只是在信任这家区块链公司而已。2.对区块链的信任建立在它代码之上那么最早比特币的信用又是怎样一点点搭建起来的呢?原因并不是中本聪这个人。是因为中本聪长得帅还是因为中本聪有钱呢?其实都不是。当然也不是因为比特币的白皮书。很多人非常看重白皮书。白皮书其实没那么重要,白皮书就是一个 vision,它是一个编写出的梦想。对比特币的信任来自它的代码。这种信任是一步步建立的。到后来才有很多人开始觉得比特币可以信任。在这之后比特币才扩展成了一个网络。最后网络成型了,大家都愿意持续地在这个网络和网络的交易逻辑上进行投入。这种信任是基于代码增长起来的。比特币的代码在对量进行控制。代码也在对账户进行控制。代码允许用户自己对量进行控制并且对账户进行控制。这种信任是基于代码的。因此我想说黄皮书比白皮书重要无限倍。3.区块链白皮书、详细设计文档与开源代码在 ICO 风潮出现之后,大家都会去看白皮书。这是完全错误的方向。正确的做法是去看它详细设计文档和代码写的如何。详细设计文档是什么呢?以区块链详细设计文档的著名代表, Garvin Wood 撰写的以太坊黄皮书为例,它的细节丰富完备,定义清晰严格,逻辑自洽,根据这个黄皮书的内容,以太坊白皮书的内容在设计上具有很强的说服力了,才会有人进行投资和支持。只有白皮书是无法证伪所提出来的愿景是可以在工程上和博弈关系上实现的。另一方面要看代码,代码已经基本完成并且已经开源,程序员们才能通过去 review 以及测试这些代码,在觉得代码是可行的才会进行投资。这里要补充强调一点,并不是一个项目有了详细设计文档和开源代码,就一定是靠谱的项目,但是相对于一个没有提供任何可以证伪的材料的项目而言,有详细设计文档和开源代码的项目至少是走在一个有诚意的、科学的道路上。如果说有人想要做一个 ICO 投资的投资准入门槛或者说资格,他实际上应该做一个代码能力测试者。作为一个区块链项目的合格投资人,如果看不懂技术设计文档在写什么就什么也做不到。如果说一个项目的技术设计文档,或者说它的代码以及它的思路都没有做出来并且开源的话,这也很可能是一个失败的项目。区块链的核心点在什么地方?它的核心点在它的代码实现。也就是,它的设计能不能够实现它白皮书里面所提到的东西。别人要做的判断是它实现的难度有多大?它的障碍在什么地方?如果判断的依据都没有,只有一个愿景,那风险实在太大了。4.开源是一种商业行为开源是一种商业行为。大家不要认为可以自由使用开源软件就是一件好事。其实不是这样的。开源软件的安全性是堪忧的。一套代码没有进行封装测试,没有人进行注释和写文档,是没有人敢用的。GitHub 为什么一直是全球最大的男性交友平台?它是面向程序员的,程序员在上面干什么?这个平台可以用来测试代码。测试结果 OK 的话,这套代码就可以用到其他系统中去。代码是需要测试的。一个人是有能力去确定代码是否可用,是否安全的。一套开源代码下载或者 fork 下来之后就像从微软直接下载下来一样,就可以放心使用吗?并不是。在这个自由使用的过程中,开源者也会得到反馈。他可以通过这种免费的测试去修正自己开源的代码。这也是一种商业模式。希望大家能够理解开源并不意味着公司放弃了大量的利益来提供免费的代码。它不是一个慈善活动。以下这个图片是在说最近开源社区的企业可以进行估值了。这个社区就是 Red Hat。有的人已经把图片中的红色改成了蓝色。因为 Red Hat 被 IBM 以非常高的价格收购了。Red Hat 实际上是 Linux 社区孵化出来的一家软件服务企业。一家企业如果在使用企业级的 Linux,Red Hat 会给这家企业提供服务,包括刚才到的封装、维保、安全以及修改。这个服务很值钱。这其实是一个在开源社区里面孵化出来的一个可估值的商业模式。所以正经的区块链企业的代码应该都是开源的。而且要确定这个企业有一个技术社区。如果一个项目在技术社区中得不到认可,技术员都无法认同这些代码,这个项目就是不可行的。(三)区块链与密码学和加密经济学区块链的第二个玩法,叫做密码学与加密经济学,Cryptography and Crypto-Economics。1.非对称加密算法非对称加密算法,也就是上文提到的私钥和公钥。其中公钥是可以公布的,是用来加密的,而不能用来解密。而私钥只有个人拥有,它是可以用来解密的。换句话说就是公钥只能用来加密,而私钥用来解密。所有人都可以拥有公钥,而私钥只有个人自己拥有,它是从来没向任何人传播过的,所以也不存在泄露的风险。非对称加密系统基于数学原理一部分是 RSA,RSA 是基于大质数的。比特币用的 ECC 是基于椭圆曲线函数的。通过哈希算法,不管是多长的一段明文,都可以得到一个等长的 256 位的 16 进制的值。这是一个单向函数。也就是说知道哈希值是不可能推出明文是什么的。还有一点,这个算法是一个很难碰撞的函数。数学上很难有两段有意义的明文,其哈希值是一样的。在去年的年初,谷歌用 SHA1 也就是最原始的哈希算法做了一次非常值得铭记的测试,碰撞出了两段有意义的明文却拥有同一个哈希值。谷歌基本动用了全部的计算资源才算出这个结果。所以说一旦拿到了一段明文的哈希值,就可以反向对照它的原文是什么,这个原文基本是唯一的,动任何一个符号都不行。这其实都是很古老的技术了。但是比特币把这些技术都结合在了一起,具体如何结合在这里就不赘述了。2.密码学成为了工具-加密经济学 比特币除了应用这些数学方法以外,更大的创新或者说成功的地方在于它对博弈论的使用。这实际上就到了制度经济学的范畴。在比特币的启发下,现在业内提出来一个概念,就叫做加密经济学。加密经济学的概念是:密码学成为了工具。人们可以通过密码学的方法把各种商业交易固定起来。尼克.萨博(Nick Szabo)曾经说过,区块链是一块透明的琥珀。这块琥珀是不断生长的,会不断的把交易过程固定下来。当人们知道自己和别人的交易记录全部被透明地记录下来不可篡改的时候,人们对未来的行为预期就会被改变。这就涉及到了博弈论以及制度经济学。也就是怎么样运用加密的方法来达成新制度的设计。这是一个新的加密经济的出发点。数学家和密码学家迎来了春天在加密经济学的背景下,有两种人的春天已经来了。第一种人就是数学家以及密码学家。据我所知,大部分国际上知名的密码学家都有自己的公链项目。在以前他们都是无人问津的,因为密码学家的雇主只有政府和军方。密码学是很偏门的一个学科,而现在这些密码学家走到了经济的前沿和主流赛道里面来了。众所周知,以太币最小的单位是 Wei。这个单位来自比特币白皮书里面提到的戴伟(Wei Dai)。他是华裔的密码学家。他在近日就推出了自己的公链项目。人们会发现:数学家直接得到了市场认可。而且酬金可能达到上千万美金。这是一个在历史上从未发生过的事情。在以前,数学家想要在短时间内获得自己的成就,是需要通过其他领域的应用来实现的,或者通过股市上的量化交易来达到。量化交易可能让数学家赔得很惨。但是现在他们可以直接筹集到资金然后面对市场。制度经济学家迎来了春天第二种人是制度经济学家。我在这里把法律经济学也加进来了。因为我虽然是法学院的,但是当时法学院的苏力老师以及他的博士们,实际上都是法律经济学的拥趸。法律经济学的奠基人理查德.A.波斯纳 (Richard Allen Posner)是芝加哥大学的教授,法学家。他曾经对各种法律制度进行经济学原理的分析。有一种说法是:经济学在吃掉法学。下图是理查德.A.波斯纳的儿子,艾瑞克.A.波斯纳(Eric Andrew Posner)。他现在也是芝加哥大学的法学教授。他在最近写了一本书。书名叫“Radical Markets”,译作《激进市场》。Vitalik Buterin 给这个书写了很长的书评。法律经济学家,或者制度经济学家提出的设想在什么地方能够最好地实验?答案是区块链上。小波斯纳教授在书中提到了几个观点:第一观点是:设想一个“哈伯格税”(Harberger Tax)。每个人定期为自己的财产估一个价,然后按照这个价格去纳税。这个税就是哈伯格税。任何第三方在此期间都可以以这个价格强制收购这个人的财产。哈伯格税只是一个设想。这个设想也是存在争议的。这个税可能会抑制那些从房地产这种垄断性的财产里面获得暴利的人的收益。但它可能会促进资源的使用。这个设想现在还在讨论中。但是如果想进行实验,区块链其实是一个非常好的实验场所。另一个观点是关于累进制的投票的。举例来说,对任何一个公共话题,如果一个人想投第二票的话,那么这个第二票的投票权付出的成本必须是第一票的倍数或者是平方数。如此一来,想要一个人在某个议题上投很多票的成本是呈指数上升的。这是一个很有趣的制度。它是关于怎么去评议更富有的人去获得更多投票权的。当然也有投票者可以负担得起巨额成本的可能。当然这个系统的应用也需要区块链上的身份作为一个可信的基础设施作为前提。实现这种制度的过程中会存在很多障碍。这种障碍在目前的纸质文件系统中是无法去排除的。换句话说其实存在很多制度经济学的设想和实验,它们是无法在目前的纸质文件系统中便宜的完成的。然而如果把这种设想和实验放在密码学控制的区块链的系统中,它们的完成度可能性会很高。对各种思想实验,经济学实验以及制度学实验,区块链提供了一个成本很低的实验的场所。这种实验不需要发生在一个现实国家中,不需要去推翻某个统治者。而且在区块链中可以反复修改制度参数,这种修改都不会对样本造成伤害。这样一来投票的成本会变得很低。(四)软件架构师可以成为未来世界的设计师我们知道西方所有哲学、政治学的开山之作是《理想国》(Republic)。柏拉图在里面提到的最理想的统治是哲人王的统治。第二位才是民主的统治。是否存在这样一种可能性?未来的世界是由一群数学家和程序员来设计的,就像“黑客帝国”中所描绘的那样。这种设计师叫做:Architect。在软件领域中 Architect 是架构师的意思。这样一来上帝其实是一个 Architect,也就是软件架构师。这和哲人王的统治的设想已经非常接近了。我希望大家有机会能够阅读一下《理想国》。有一种说法,整个西方政治学史都是对柏拉图著作的注解而已。(五)区块链与智能合约我们再来看一下智能合约。智能合约是以太坊区别于比特币的特点。而智能合约的概念其实早于比特币,也早于以太坊。大家都知道比特币在 2008 年推出了白皮书,在 2009 年才真正开始在代码层面运行。在这里讲一个笑话。在 2017 年的时候,有些人在应聘中会提到自己有十年的区块链开发经验。回到正题,智能合约概念的诞生是早于区块链的。有很多制度经济学上的思想实验室也是早于区块链的。尼克.萨博也是一名律师。他最早为智能合约提出了一个定义:智能合约是一套以数字形式定义的承诺(promise)。合约参与方可以在上面执行承诺的协议。在民法中的合同法中,合同是承诺与要约。承诺是对要约的完整的重复。而一组承诺就形成了合同的约定。当然,它还同时包括了判决以及执行。执行是发生在判决之后的。1.区块链与智能财产他同时也提出了另一个概念:“智能财产”(smart property)。智能财产是通过智能合约控制的财产。智能合约其实可以简单的理解为计算机语言中的 if-then 语句。但是这个语句不是在一台计算机上运行的,而是运行在以太坊的节点的所有计算机上的。这些计算机同时在执行一个语句。而且这个语句的内容是一致的。所以每一台计算机都在计算同一个合约。这是叫做合约的全球共识。当一个预先编好的条件被触发的时候,也就是预言机被触发的时候,它就会执行相应的动作,也就是决定如何结算如何分发。而处理的对象就是数字资产,也就是智能财产。比特币解决了一个什么问题?比特币解决了一个不受线下控制的数字财产的问题。它是一个自足的线上财产。它也为智能合约提供了可供执行的智能财产。以太坊通过每个节点对合约的同步计算以及反复确认。确认的内容不再只是比特币余额,还有合约的计算。这样一来最终就达到了一个智能合约结算支付的执行。而这样一个智能合约的服务是按次付费的。2.契约不是万能的有些人会想智能合约是不是可以替代现在的传统合同。但是要实现智能合约的完全替代其实还有很长的路要走。经济学上有一个理论叫契约理论。2016 年两位经济学家获得了诺贝尔奖。其原因就是他们对契约理论的贡献。他们的基本理论基础就是不完全契约理论。社会上的事情很多是不能够用契约来解决的。第一个原因是当两方进行契约的时,有时会由于信息成本过高,造成契约无法签订。也就是说未来会发生什么事情是无法全面约定的。因此人们并没有办法确定在这些未知的事件发生时将要如何处理。第二个原因是由于无法全面约定,双方在碰到突发事件时都有产生机会主义的倾向。也就是通过损害对方的利益来达到自己的利益。那么这个合同能否订立就是存在问题的。第三个原因涉及到了执行方面的问题。就是双方实际上没有办法完整地把判决的信息传达给第三方。换言之,第三方很难获得完整的信息并做出判决。这就会使得整个合约过程是不完备的。因此合同能处理的事情其实是非常有限的,这个处理的过程也是非常昂贵的。3.智能合约的缺陷其实智能合约也是存在一样的缺陷的。当约定变得复杂时,相关的成本就会提高。所以现在智能合约用在哪里最好?答案是博彩,减少了很多出老千的担忧。我们知道 EOS 的博彩项目都快成为“博彩链”了。国内某著名公链项目也拼命地从以太坊和 EOS 上挖博彩项目。所以我们看到,智能合约现在还处于早期。现在的智能合约还达不到商业合同要求的复杂程度。这中间可能出现的大量问题也许可以用保险解决。在这个方面,传统合同也是一样的。 当出现了意外情况,由保险公司可以 cover 相关的风险。但是大家要知道有大量的事情保险公司是不会保的,例如运转一些文物。保险公司首先需要一个非常大的数据基础才能够精算出保费和相关的赔率。在这之后它们才能推出相应的保险产品。如果一个风险是不可保的,保险公司也没办法提供相关的合同支持。这是一个很很吊诡的事情。当一个合同干扰因素太多的时候,其实双方是达不成合同的。智能合约也无法解决合同本身的很多固有的问题。当然,还是希望在以后能够把保险和一些不可抗力的波动加入进来,从而可以使用智能合约。但是这在目前还是无法达到的。4.智能合约与预言机下图中的人是尼克.萨博。他拿着一箱的 token。而这个箱子就可以称之为一个智能合约。这个 key 又是什么呢?key 就是事先约定好的能过触发智能合约的信息。而触发的机制就叫做预言机(Oracle Mechanism)。这个名字中的 Oracle 和甲骨文公司没有关系。预言机的存在不是因为甲骨文公司。它的意思实际上来源于古希腊的神庙里的神谕。预言机是链外信息写入链内的机制。链内的信息实际上是一个自足的信息。它的内容都是哈希。一个系统是需要从外界去获取新信息的。因此这个机制是很重要的。而这个机制是区块链无法完成的。这也是现在有很多公司正在投入研究的。现在的设想是有几种解决方式:比如说 Augur 以及菩提的项目通过广泛的公众参与,每一个人都选择一个方向,来给出一个结果。另外有一些是关于金融信息的,例如彭博社,路透社。它们是权威的信息。人们可以去采信这些第三方的中心化机构的信息。例如,路透社在 2017 年的时候就提出了以太坊的智能合约可以使用的路透社的信息服务。现在很多以太坊的基金以及很多的条约的触发是借助美国股市的信息来决定的。(六)区块链与对赌协议网络赌博是需要随机数的。然而大家知道计算机系统自己产生的都是伪随机数。伪随机数不是真正的随机数。人们希望在未来能够把审计报告,生效判决以及行政命令都当作触发的钥匙。这时就可以事先约定好一个数据格式,然后再来问:你的数是多少?举一个简单的例子:对赌。有一个条款叫做棘轮条款,也叫做对赌协议。这个条款是根据未来的投资公司的估值情况,或许再加一个其他的参数,来调整投资的股权数的。这种官司我自己打过。官司持续了两年但是最后也执行不了。原因是当官司打到第二年的时候,这个公司已经濒临倒闭了,没有价值了。假如双方在对赌的时候,约定就以某个会计事务所出具的会计师签字的审计报告为触发条件。这个就可以立刻执行 。 公司的股份是登记在区块链上的。它会执行得非常快,并且不需要法官。如果真的要跟法官解释,当事人可能要花上 10 个小时解释其中的原理,而法官可能要花 20 个小时向审委会解释。这样一来两年过去了,也许都不可能实现股权调整结算,这是很没有效率的。在刚刚提到的情景中,如果是四大会计师事务所,他们可以按照事先的约定提供一个信息,如果四大按照约定好的数据格式把报告发给客户,智能合约自动执行股份的分配,这个事情就结束了。如果有起诉的必要,当事人可以起诉四大和投资方,但是这个胜诉的举证责任和时间的成本就转移方向了。所以区块链其实不排斥结合链外的信用来做事。这个是我最近的思考,不知道对不对,在这里跟大家做一下交流。(七)区块链为不同的产业链条提供了不同的重组1.开源的本质在软件开发中有两个术语,一个叫耦合(Coupling),另一个叫内聚(Cohesion)。而这两者实际上在描述同一个东西。就是在内聚的同时也存在解耦。什么是开源的玩法的本质呢?开源实际上是把微软等整体工作的公司的工作拆分出来了。也就是把原来是内部工作的开发和测试拆分开来。这个过程就提供了很大的价值。开发人员在进行测试的时候不知道自己要测试什么。在不同的环境里测试的结果是不一样的。但是当最后这个软件完成开发,它面临的场景是千差万别的。开发人员最后实际上需要一千家企业去进行测试。最后可能期望一千家企业里面有两百家会采用这个产品。以上讲的这些是让大家理解这个商业玩法的核心。区块链作为一个工具,它提供了一些什么样的产业链条的重组,以及又提供了哪些机会。2.比特币解耦了支付和记账而比特币又解耦了什么呢?比特币解耦了记账和支付。传统的支付和记账都是银行的工作。一个人把一个东西支付给另一个人,是把指令交给了银行。这个指令具体执不执行是银行的决定。可能出现一种情况:支付方已经被最高人民法院拉入黑名单。银行会把这笔款项优先冻结,并依据法院的指令支付给债主。这样一来,钱就无法支付给原本的对象。也有可能出现超限额的情况,大家可能碰到过,银行会告知不好意思,今天的付款已经超过了 5 万元限额,这很让人烦躁吧。而现在呢,通过比特币,可以支付任何自己想支付的量。在比特币网络上有过一个实验。转账价值 500 万元美金的比特币的费用和转帐五块钱价值的比特币是一样的。而传统的 swift 系统是按照总金额收取费用的。而且很个过程非常慢。比特币很快,只需要一个小时。而且矿工是不管支付的。无论涉及到多少钱比特币工作者都不关心支付的相关问题。他们只负责把交易指令打包。而且他们是看不见交易的内容的。所以这个解耦创造了巨大的价值。大家在考虑相关的事情的时候,请不要总是从去中心化的角度来思考。换句话说,就是大家在做这方面的商业设计的时候,不一定非要从去中心化的角度来考虑问题。当然在以上这个情景里面,其实完全可以从去中心化的角度来讨论这个问题。比如:矿工去中心化了。其实不是这样的,它的核心在于解耦。3.以太坊内聚了签约和判决以太坊内聚了签约和判决。判决就是刚才提到的预言机系统进行的执行。我们知道,传统的签合同的过程是:双方签约。然后在双方龃龉并谈不拢了之后,有一方要去法院起诉。所以现在法院把判决和执行分得很开。我去朝阳法院申请执行的时候,法官说:“不好意思请去小红门,你走错地儿了。”在过去签约,判决和执行是分得很开的。但现在在智能合约签约的时候,判决和执行都内嵌在其中了。它是一个自治性的一个系统。这个内聚也提供了巨大的价值。大家从商业上考虑的时候,多从这方面去想。现在有很多人问,以太坊之后是什么?有人宣称自己是以太坊 2.0,比特币 3.0 或者是区块链 3.0,4.0 甚至 6.0 的。但是,你要明白你到底做了什么改进?数字金融 workshop北大数字金融中心的讲座课,将邀请监管层、业内专家、技术专家、学者授课,内容涵盖数字金融的理论创新、技术突破、行业监管、商业应用,本学期讲座课(2018 年秋季)将重点追踪“区块链”、“数字货币”等领域。钱 靖钱靖毕业于北京大学法学院,是我国最早系统了解和研究区块链技术的律师之一,专注于区块链领域发展和法律监管的研究工作,现任杭州秘猿科技有限公司法务总监。钱靖律师作为专家多次向国内监管部门提供专业意见和建议,也多次受邀至北京大学、中国人民大学等科研机构进行专题讲座。 ...

February 23, 2019 · 2 min · jiezi

蚂蚁区块链BaaS平台架构与实践

摘要:以“数字金融新原力(The New Force of Digital Finance)”为主题,蚂蚁金服ATEC城市峰会于2019年1月4日在上海如期举办。在ATEC区块链行业研讨会分论坛上,蚂蚁金服资深总监、BaaS业务负责人李杰力做了主题为《蚂蚁区块链BaaS,链接天下信任》的精彩分享。演讲中,李杰力从核心特性与架构及其四大应用场景——商品溯源、跨境退款、电子票据和司法可信存证,详细介绍了BaaS平台,并且与大家分享了2019蚂蚁区块链创新大赛的参赛规则和考察维度等方面的内容。李杰力 蚂蚁金服资深总监,BaaS业务负责人本次的分享主要围绕以下三个方面:一、蚂蚁区块链BaaS平台简介二、BaaS应用案例三、2019蚂蚁区块链创新大赛一、蚂蚁区块链BaaS平台的介绍什么是BaaS?为什么要用BaaS?在过去两年时间里,蚂蚁区块链在技术上做了很多的研究,同时也获得了很多的成果,在专业技术方面连续两年获得第一。其隐私保护、数据安全等方面都取得了很好的突破。现在这套技术体系沉淀在平台上,并且被开放出来,是希望更多伙伴来一起合作,让开发者不用再从事底层的基础工作,而是在很厚实的地基上盖自己的房子,做自己的应用,解决自己行业内的问题。在未来,蚂蚁区块链有望成为一种很简单的,对开发者来说根据自己的业务逻辑,一键式部署一个基于云端的业务和产品,其具体内容如下图所示。BaaS拥有许多核心特性,如下图中的高性能、稳定性、隐私保护和可靠性,因此企业级金融级的这套平台的技术体系得了很多奖项。对开发者来说,它被期望是灵活可定制的,能够在模块化的平台基础上面部署自己的区块链应用。对于用户来说,它被期望是简单易用的,从而可以不用考虑其背后是否是由区块链构成(用户也不用在乎这些,而在乎的是能不能实现他想要做的事情)。如下图所示,蚂蚁区块链BaaS平台架构的底层是部署在云平台上面的,其构架的倒数第二层是技术含量最高的、也是最复杂的区块链平台,包含了密码学、P2P网络等内容。对于蚂蚁区块链BaaS平台的合作伙伴而言,他们不需要考虑这两层的内部结构,因为在管理平台上,会提供一些工具,如仪表盘、浏览器等。对于用户不同的权限,平台可以自动适配整个链的接口管理,以及上层的一些针对特定场景的解决方案(如溯源、存证、保险交易等)和沉淀在应用层的品牌。开发者可以根据实际需求选择自己需要的平台模块,也可以在平台上发布自己的区块链产品,这样可以大大降低建立区块链应用的成本和门槛,同时也可以减少平台的运转周期。二、BaaS应用案例BaaS的应用场景十分广泛,包括商品溯源、跨境退款、电子票据、司法可信存证和慈善等应用场景。1、 商品溯源在商品溯源方面,BaaS充分利用了区块链的分布式数据不可篡改性。如下图所示,BaaS可以记录一个商品从生产到流转最后到抵达消费者的整个过程,并且对很多商品提供了溯源服务(如说高净值的钻石、茅台酒和一些海外进口的奶粉等等)。在双11期间,BaaS对总数超过1.5亿件产品提供了溯源的服务,取得了非常好的效果。例如,仅仅根据一瓶茅台酒上面的二维码,支付宝端在扫一扫后,会告诉用户该商品的整个流转过程,包括这瓶酒在哪些地方做了哪些检查,在哪个地方待了多久等,其整个流转的历史记录都能被看到。溯源在以前是采用中心化的形式实现的,但是在使用了区块链这种去中心化不可篡改的方式实现以后,大幅降低商品做假的概率,因为在区块链的某一个节点篡改商品信息或者替换一个假商品,其难度相较之前得到了成倍增长。2、 跨境退款在现在的日常生活中,大家几乎都使用支付宝或者微信进行支付。在境内的这个体系里面,用户相互之间的转账是非常便捷的,并且成本几乎为零。但是在跨境转账的场景中,包含了不同的银行体系、不同的金融监管规则和不同的客户端,导致其转账的成本很高,花的时间也很长。而在传统银行的体系中进行跨境转账,对很多人尤其对低收入的人而言是非常高的负担。BaaS平台在去年6月份于香港开通了第一条跨境退款通道,它是完全采用了基于区块链底层技术开发而成,下图中的这位Grace成为了这条通道的首笔交易的亲历者,这仅仅是个开始,在未来,BaaS会在不同国家开通不同的通道。在支付宝在一带一路的东南亚一系列国家里面,BaaS有一系列合作伙伴。如韩国的pay、印度和菲律宾的Gcash,BaaS会开通更多通道,让跨境资金来往变得像在支付宝端内一样便捷。实际上,涉及到跨境的资金来往在某种程度上都或多或少要用到了区块链,然而传统的方式所消耗的成本非常高,因此BaaS采用了新的方式即区块链的技术来实现跨境转账。3、 电子票据BaaS在电子医疗票据方面也有应用。如下图所示,BaaS在台州已经开出了80万张电子医疗票据,形成了闭环,当某位患者走出医院的时候,他的社保会自动地进行报销。随着社会人口老龄化,大家会越来越注重健康,所需要的保持健康的成本越来越高,区块链在医疗领域会具有非常广阔的应用空间,同时具有非常大的经济价值和社会意义。BaaS在未来还会实现许多潜在需求,例如在保护用户隐私和数据安全的前提条件下,让患者的身份也上链。在将来,患者看病的场景可能会发生变化,在一个用户去到医院的时候,工作人员就能从链上调出患者的记录,之前的病史也一清二楚,开具的也是电子处方,最后患者依据这个处方去药房取药。在患者离开医院的时候,所有这些信息都会记录在区块链里面真实可靠且不可篡改,并且他的社保、商业保险都会及时报销到位,而不用由患者拿着纸质文件去东奔西跑。电子发票也是同样的逻辑。BaaS通过跟广州税务局合作,实现了在区块链上开具发票的功能,此外还有发票的流转和报销功能。在以前用户需要花几天、几星期做的事情,现在仅需几秒钟、几分钟便可完成,进而提高社会效率、降低社会成本。4、 司法可信存证在司法可信存证方面,BaaS与杭州互联网法院合作,将各个司法节点公证处、法院连接起来,形成了一套区块链的部署,具体的司法链结构如下图所示。此外,BaaS把很多版权类的存证、电子合同、房租和借贷合同等都存放在区块链上,一旦发生纠纷,法院可以直接从区块链上获取数据和证据。区块链上的数据是具备公信力的,法院可以根据链上的数据直接进行判决。在现实生活中,BaaS在司法链上已经运行了两三个月的时间,处理的相关案件也已经有80多起了。5、 其他应用场景除了上述提及的四个应用场景,蚂蚁区块链团队还落地了慈善、航天信息和雄安新区等应用。区块链只有落地才能真正地脱虚向实,服务于实体经济。区块链是链,同时它也是一个网络,因为它的数据结构是一个链状,一环扣一环,不可篡改。要实现区块链的真正价值还是要靠其网络效应,只有走开放和共建的道路,才能真正发挥区块链的价值。三、2019蚂蚁区块链创新大赛蚂蚁区块链创新大赛面向全球开发者,鼓励各个开发者在BaaS平台上创建区块链的应用,去解决各自行业内的问题,创造新的价值。创新大赛目前确认的合作伙伴如下图所示。大赛的详细的参赛规则如下图所示。基本上是使用支付宝的账户,选定一个特定的场景来用区块链的方式,用蚂蚁BaaS平台创建一个解决方案,来创造一个真正的有价值的应用。创新大赛会考察多个维度,通过邀请一些内部和外部的专家,来对参赛项目进行综合考量,其具体的考察维度如下图所示。需要注意的是,本次比赛着重于创新性和应用性,一些跟以往不太一样的,让人耳目一新的区块链的应用会得到更多的关注。当然该应用在商业价值、技术价值、用户体验各方面的表现都会进行综合考虑和评定。创业大赛的权益如下图所示,包括180万现金(奖励前三名的项目)、整个超过千万人民币价值的权益(包括线上线下各种各样的推广、合作、培训,对BaaS平台可以免费使用等等这一系列的权益)、还包括支付宝创新基金三年10亿人民币规模的基金,用来投资一些真正优秀的项目,来助力它们的发展。关于创新大赛的赛程如下图所示,报名入口于1月4日开放,并且三月份和六月份分别有一次线下的活动,包括培训和交流活动。在六月份的时候,会进行一次初步的评比,获得优秀的项目进入九月份在云栖大会举办的总决赛。另外三月份的活动在上海举行,九月份的活动在杭州举行。下图左侧是创新大赛报名的页面,右侧的二维码是报名的链接,在扫描以后可以直接进入报名页面。欢迎全球的开发者参与本次比赛!总之,蚂蚁把一套区块链的技术放到了全新的BaaS平台中,为开发者提供了充分的支持,希望能有更多合作伙伴加入、参与构建基于区块链的应用。希望大家与BaaS平台一起携手共建区块链产业的未来,谢谢!点击阅读更多,查看更多详情

February 23, 2019 · 1 min · jiezi

bitcoin: 何为燃烧地址

来自简书btc address: 1FmWXNJT3jVKaHBQs2gAs6PLGVWx1zPPHf如果你观察过很多的btc地址, 隐隐会发现有些规律:长度很多是34位,好多是1 3 开头的, 字母排列杂乱无章.如下都是合法的btc 地址, 这些地址都有币的,而且数量都不少, 就已当前的(2018/08/21)btc价格计算, 绝对是富得流油了.3MWqbpfzxgojEAah6PMZoZPdUPUTuyTpan1EdBvVAVP98zUsz2n8Pereop29y9fUFk2i3Cbq7aT1tY8kMxWLbitaG7yT6bPbKChq643Nxwenay9Z8Lc9JBiywExpnEFiLp6Afp8v18tTLso5jaa4XqyTQzo9S6mqhfCsgcufdh1FeexV6bAHb8ybZjqQMjJrcCrHGW9sb6uF1HQ3Go3ggs8pFnXuHVHRytPCq5fGG8Hbhx1PnMfRF2enSZnR6JSexxBHuQnxG8Vo5FVK3Kzh9qAqVWQhEsfQz7zEQL1EuSx5tyNLNS1EBHA1ckUWzNKN7BMfDwGTx6GKEbADUozX1LdRcdxfbSnmCYYNdeYpUnztiYzVfBEQeC…34位的长度是绝对的么,有特例么?还真找到一个地址 1111111111111111111114oLvT2,长度只有27位, 而且这么多的111…, 感觉很优美. 一般btc 地址的长度是34位, 也有33位, 最短的应该是26位.燃烧地址1111111111111111111114oLvT2 还有特殊的地方.如果看ta的交易, 只有输入, 没有输出,什么意思呢?只有别人给ta发币, ta一分钱没花,只进不出,咋这抠门呢, 这是个貔貅啊.我们看看ta的第一笔交易id2c637592a4b4a95cf4b19260730c66de540d7d3b14d8d352de591c5ee6eac0fc, 交易时间是 2010年8月10号, 输出脚本是OP_DUP OP_HASH160 0000000000000000000000000000000000000000 OP_EQUALVERIFY OP_CHECKSIG![输出脚本](https://user-gold-cdn.xitu.io…输出脚本是个啥呢?我们经常说, 谁有btc地址的私钥谁就能花费这些币,私钥相当于钥匙, 输出脚本相当于锁, 你把私钥放入输出脚本中,组成一个完整的脚本, 执行这个完整的脚本, 如果最后输出的是 True, 那么恭喜你, 你可以花费这些币. 我们把0000000000000000000000000000000000000000 叫做hash160, 1111111111111111111114oLvT2就是addr, hash160可以转换为addr.你可以认为: addr就是hash160的简化, addr是对人更友好的一种表现方式, 就像语法糖一样.执行输出脚本, 是私钥转化为Hash160的过程.你提供的私钥转化成Hash160_me, 如果与脚本里提前写好的Hash160一致, 你就可以动用这个地址的币了.btc地址的正常推导过程是: 私钥 ==>公钥 ==> Hash160 <==> 地址.Hash160就是没有规则的字符串,我们可以随便提供个Hash160值, 从半截腰上推导地址: Hash160 <==> 地址.1111111111111111111114oLvT2很明显就是这种情况, 从半截腰上推导出来的地址, ta的hash160是 000…000, 都是0,这是特意拼凑的,既然是从半截腰推导出来的,自然没人知道私钥.由于hash运算的不可逆性, 此刻还无法推算出这个地址的私钥,既然不知道私钥,就无法动用币,只能进不能出,成了一个"废地址",这样的地址叫燃烧地址, 即 burn address, 像燃料一样烧没了, 非常形象.为什么还要往这种地址发送交易呢1 减少币的流通量2 土豪的心思不要猜我们生成个 burn address设定 hash160 = 1111111111111111111111111111111111111111, 最终得到地址12ZEw5Hcv1hTb6YUQJ69y1V7uhcoDz92PH.这个地址好没个性啊,但是也有人打过币了, https://btc.com/12ZEw5Hcv1hTb…有没有可能找到私钥存在这种可能, 不过需要巨大的算力来完成这个工作,这个可能太微小了. 如果有人找到了私钥, 燃烧地址就变成普通地址了.如何手动生成btc地址请看 https://www.jianshu.com/p/954… step3是得到hash160_val, 如果你想通过 hash160_val 得到地址, 从step4开始计算就可以.安全提示虽然这些步骤经过了验证并没有发现问题, 但也仅供参考.强烈建议不要自己生成btc addres强烈建议不要自己生成btc addres强烈建议不要自己生成btc addres请用信赖的工具来干这事如果地址计算错误, 这个私钥并不能解开你的地址, 相当于你的btc丢了.mastering bitcoin已经给了我们教训. 同理ethereum 也有burn address哦. ...

February 22, 2019 · 1 min · jiezi

Python 比特币教程之二: 机器人收发比特币

在上一篇教程Python 比特币 教程 之一:创建机器人中, 我们创建了自动回复消息的机器人,当用户发送消息"Hello,World!“时,机器人会自动回复同一条消息。第二课: 机器人接受比特币并立即退还用户按本篇教程后学习后完成后,你的机器人将会接受用户发送过来的加密货币,然后立即转回用户。完整代码如下:app.pyfrom mixin_ws_api import MIXIN_WS_APIfrom mixin_api import MIXIN_APIimport mixin_configimport jsonimport timefrom io import BytesIOimport base64import gziptry: import threadexcept ImportError: import _thread as threaddef on_message(ws, message): inbuffer = BytesIO(message) f = gzip.GzipFile(mode=“rb”, fileobj=inbuffer) rdata_injson = f.read() rdata_obj = json.loads(rdata_injson) print(”——-json object begin———") print(rdata_obj) print("——-json object end———") action = rdata_obj[“action”] if rdata_obj[“data”] is not None: print(“data in message:",rdata_obj[“data”]) if rdata_obj[“data”] is not None and rdata_obj[“data”][“category”] is not None: print(rdata_obj[“data”][“category”]) if action == “CREATE_MESSAGE”: data = rdata_obj[“data”] msgid = data[“message_id”] typeindata = data[“type”] categoryindata = data[“category”] userId = data[“user_id”] conversationId = data[“conversation_id”] dataindata = data[“data”] created_at = data[“created_at”] updated_at = data[“updated_at”] realData = base64.b64decode(dataindata) MIXIN_WS_API.replayMessage(ws, msgid) print(‘userId’, userId) print(“created_at”,created_at) if categoryindata == “PLAIN_TEXT”: realData = realData.decode(‘utf-8’) print(“dataindata”,realData) MIXIN_WS_API.sendUserText(ws, conversationId, userId, realData) elif categoryindata == “SYSTEM_ACCOUNT_SNAPSHOT”: rdJs = json.loads(realData) if ( float(rdJs[“amount”]) > 0 ): mixin_api.transferTo(userId, rdJs[“asset_id”], rdJs[“amount”], “")if name == “main”: mixin_api = MIXIN_API(mixin_config) mixin_ws = MIXIN_WS_API(on_message=on_message) mixin_ws.run()Hello Bitcoin!在项目目录下,执行 python app.pycd mixin_labs-python-botsource ./bin/activate(mixin_labs-python-bot) wenewzha:mixin_labs-python-bot wenewzhang$ python app.pyws open——-json object begin———{‘id’: ‘fd6ce766-331a-11e9-92a9-20c9d08850cd’, ‘action’: ‘LIST_PENDING_MESSAGES’}——-json object end———开发者可以通过消息面板,给机器人转比特币,当机器人收到比特币后,马上返还给用户!事实上,用户可以发送任意的币种给机器人,它都能马上返还!源代码解释elif categoryindata == “SYSTEM_ACCOUNT_SNAPSHOT”: rdJs = json.loads(realData) if ( float(rdJs[“amount”]) > 0 ): mixin_api.transferTo(userId, rdJs[“asset_id”], rdJs[“amount”], “")如果机器人收到币,rdJs[“amount”] 大于零;如果机器人支付币给用户,接收到的消息是一样的,唯一不同的是,rdJs[“amount”]是一个负数.最后一步,调用SDK的 mixin_api.transferTo 将币返还用户!高级用法coming soon!Mixin Network的开发资源汇编 ...

February 22, 2019 · 1 min · jiezi

ERC721以太坊通证实战教程

本课程以一个数字艺术品创作与分享DApp的实战开发为主线,深入讲解以太坊非同质化通证的概念、标准与开发方案。课程内容即包含ERC-721标准的自主实现,也讲解如何基于经过良好安全审计的OpenZeppelin合约代码库进行二次开发,实战项目采用Truffle开发框架,使用IPFS保存通证元数据,同时实现了通证以及去中心化的通证交易所。课程内容深入浅出,是开发者学习以太坊ERC721通证应用开发的最佳选择。这里是学习地址:《ERC721以太坊通证实战》简介在这个课程里,我们将通过深入一个类似于加密猫(CryptoKitties)的 去中心化数字艺术品创作与分享应用的开发过程,学习非同质化通证(NFT:Non-Fungible Token)的基本概念、应用场景与开发实施方案:和加密猫一样,我们的课程应用中的每个数字资产都是独一无二的,事实上, 它们就是使用不同参数生成的形状各异的随机图(Random Graphp),可以认为每个随机图的唯一性赋予它收藏的价值,因此我们可以将其视为一种艺术品。在这个课程中,我们将学习如何生成随机图艺术品并将这一数字资产通证化。每个人都可以有自己的方法将数字资产通证化,不过以太坊已经有了针对非同质化通证的标准:ERC-721。在课程中,我们将完整地讲解ERC-721标准的方方面面,不仅从头实现一个ERC-721兼容的通证合约,同时也会讲解如何利用经过安全审计的OpenZeppelin合约代码库进行二次开发。一旦将资产通证化以后,就可以进行交换。在课程中我们还将实现一个简单的通证交易所,每个人都可以在交易所购买其他人的NFT通证,也可以挂单出售自己的通证:项目技术栈由于这是一个中级课程,因此需要你对区块链/以太坊以及下面的技术 有一些基本的了解和认识,这样会更有利于课程以及课程项目的完成:项目应用的开发主要包含两部分:智能合约的开发以及前端UI的开发。课程项目使用solidity(版本0.5)来开发以太坊智能合约,并对涉及到的solidity新特性进行说明。前端用户界面的开发则使用标准的前端五件套:HTML、CSS、JavaScript、jQuery、Bootstrap,当然,也需要 使用web3.js(版本1)来访问区块链。为了便于DApp项目的开发和管理,课程使用truffle(版本2)框架进行开发,truffle2预置的solidity编译器支持solidity0.5。除了可以继续采用ganache-cli作为开发节点以外,truffle 2还包含了一个嵌入 的以太坊开发节点,这使得开发流程更加顺畅。truffle框架提供了许多模板用于项目的快速开发,这些项目模板被称为box。为了充分利用ES2015的新特性来使课程代码更加容易阅读,我们使用webpack模板。在truffle 2中的webpack模板是基于webpack 4实现。最后,课程项目使用去中心化文件系统IPFS来保存通证的元信息。课程内容安排本课程是一个中级课程,适合具备一定以太坊开发基础的区块链工程师,课程内容安排如下:第一章、课程简介介绍课程要完成的项目,以及项目实现所使用的技术栈。第二章、通证简明指南学习通证的基本概念、分类、应用场景与生成机制。第三章、项目需求分析与设计理解课程项目的总体需求,学习项目应用的设计思路,包括模块划分、 界面原型与合约接口设计等。第四章、生成随机图艺术品了解随机图的基本概念与常用算法,掌握生成随机图的实现方法。第五章、使用IPFS保存随机图艺术品学习IPFS的基本概念、部署与使用方法,掌握将随机图上传到IPFS网络的实现方法。第六章、理解ERC721规范学习ERC721规范中涉及的各种接口,例如ERC721接口、ERC165接口等, 掌握各接口的关系与实现方法。第七章、随机图通证合约实现学习并掌握如何使用OpenZepplin合约开发库实现随机图通证合约。第八章、应用前端实现学习如何在前端页面中调用合约方法,实现随机图通证生成页面和浏览页面。第九章、实现简单的通证交易所学习交易所的基本概念,实现通证交易所合约,前端页面增加对交易所功能 的支持。有关兴趣的同学欢迎到这里是学习:《ERC721以太坊通证实战》

February 22, 2019 · 1 min · jiezi

Nervos CKB 共识协议 NC-Max:突破 Nakamoto Consensus 吞吐量的极限

带宽实际上是区块链吞吐量的最大限制,在美国旧金山举办的 Scaling Bitcoin Meetup 中,Nervos & Cryptape 研究员张韧从「带宽利用率」角度分析了诸多共识协议的效率和可行性。Algorand 的带宽利用效率如何?Cardano 的 Ouroboros 怎么样?Solana、NKN 为什么能有那么高的TPS?以太坊将出块间隔缩短到 15 秒,为什么并没有比比特币吞吐量高出很多?这些问题,张韧博士都会在分享中一一回答。以下为韧博士演讲稿整理,如若希望和韧博士进行进一步讨论,欢迎点击:https://talk.nervos.org/t/ner…,我们在 Nervos Talk 共同探讨。阅读本文对读者的区块链基础知识储备有一定要求:比特币共识协议(也就是 Nakamoto Consensus)基本概念以太坊共识协议基本概念孤块、叔块、自私挖矿等概念整理:Ryan、万涔涔视频链接:https://v.qq.com/x/page/g0837…自我介绍一下,我是张韧,Nervos & Cryptape 的研究员,目前我在鲁汶大学 COSIC (Computer Security and Industrial Cryptography group) 读博士,师从 Bart Preneel。 如果你对 COSIC 不熟悉的话,不知道你是否听说过 AES,它是我们所有人的手机中使用的加密标准。当然如果你熟悉 Bart Preneel 的话,会知道他是 RIPEMD 160 的设计者。RIPEMD 160 是比特币公钥转化为比特币地址时使用的哈希算法。Nervos CKB 是一个公有链,能够支持各种编程语言的智能合约,以及各种各样的 Layer 2 协议。在 Nervos CKB 上你可以用任意资产支付交易手续费。在 Nervos CKB 中智能合约的执行和验证是分离的,从而达到更好的隐私和性能。最后,在 Nervos CKB 中采用了 NC-Max ——一个 Nakamoto Consensus 的变体——作为共识协议,拥有更高的吞吐量。声明:本次分享内容仅着眼于 Layer 1 共识协议的分析,我将不会谈到 Lightning Network 这样的 Layer 2 方案。这里是我本次分享的大纲,首先我会告诉你为什么我们会那么喜欢 Nakamoto Consensus(也就是比特币的共识协议,以下简称 NC,包含一组规则,如最长链规则、激励规则、增发规则等)。然后我会给出我们为什么不采用其他共识协议的理由。最后我会给出我们 Nervos CKB 的共识协议 NC-Max 的设计思路。为什么我们喜欢比特币的 NC?先来回答一个问题,为什么我们喜欢比特币的 Nakamoto Consensus(NC)?有很多的理由,首先 NC 的性能优化做的非常好,它能够节约每一个传输的每一个字节,以及每个计算周期。举例来说,它使用Compact Block来加快区块的传播,可能在未来使用 Minisketch (一个用于在分布式系统不同节点之间同步信息时,降低带宽需求的软件库)来节省交易广播所需要的带宽资源。同时比特币的开发者提出了 Graftroot(关系到比特币上开发智能合约以及隐私性的一项提案),你可以认为它能够通过压缩比特币上的智能合约从而获得更好的隐私性和更好的性能。或许我们还能够看到签名聚合技术(Signature Aggregation)应用在比特币之上。知识点:Compact Block Relay,在比特币改进协议(BIP)152 中提出,能够减少 P2P 网络节点广播区块所需的带宽数量。Compact block 是完整区块的「概要」,包含下面三部分信息:1、新区块的区块头2、交易 ID3、发送方节点预测的但是接收节点不具备的完整交易接收方会尝试根据收到的信息以及在其内存池中的交易来重新构建完整区块。若仍然缺失某些交易,它将会请求广播节点。*喜欢 NC 的另一个理由是它的通用性。UTXO 模型加上全局交易顺序能够支持各种分片技术和 Layer 2 方案,以及复杂的智能合约。相比来看,以太坊的 Account 模型进行分片的难度更高;并且如果你没有一个全局交易顺序的话,比如像许多 DAG 类型协议那样,那么就很难支持复杂的智能合约,关于这一部分会在后面谈 DAG 的时候详细描述。我们也喜欢比特币 NC 的安全性。比特币网络经历了很多的攻击,还是稳定运行了十年。而且严格意义上来说,目前没有任何一个已知的工作量证明共识机制在整体上超越 NC。如果你对这个话题感兴趣,可以看这里。然而在 NC 中有两个地方我们希望做出一些改变。首先在带宽利用方面,比特币的 NC 在采用隔离见证之后,人为设定了最大为每十分钟 4Mb 的吞吐量,然而现实情况是,比特币公共节点的带宽水平在过去的几年里获得了大幅度的提升。对于 NC 我们有哪些地方需要做出改变?如同上图中这个研究所指出的,链接到网络中的比特币 IPv4 节点在 2016 年时带宽中位数为 33Mbit/s,在 2017 年 2 月,这个数字达到了 56Mbit/s。我们很容易想到的改进方式就是,协议自身是否能够动态地调节吞吐量来适应带宽水平的变化?Bitcoin Unlimited 做了一个糟糕的尝试,它希望能够动态地调节比特币的吞吐量,但是它失败了,引入了多种新的攻击方式让它的协议变得不安全。上面是在 Coindesk 上发布的一篇关于 Bitcoin Unlimited 安全性研究(链接:https://www.coindesk.com/etf-…),我也是这项研究的参与者之一。另一个我们希望在 NC 中做出改变的是它的激励问题,也就是出现自私挖矿攻击的问题。自私挖矿攻击者会扣留发现的区块,希望在网络中获得更大的领先优势。当其他诚实矿工发现区块的时候,攻击者会向网络广播这个被扣留的区块,寄希望于这个被广播的扣留区块会在诚实区块之前,被大部分诚实矿工接收到。如果攻击者足够幸运,下一个块是在攻击者的块上面进行挖矿的,那么诚实的块将会成为孤块。如果攻击者运气好到能够连续挖到多个区块,那么它将能够非常安全地让一个诚实矿工的区块失效,因为攻击者会有更长的链。为什么自私挖矿是有利可图的呢?我们举一个具体的例子,假设自私挖矿攻击者有全网 30% 的算力,诚实矿工控制剩下的 70%。如果没有自私挖矿攻击出现,那么攻击者在 10 个区块中能够找到 3 个,诚实矿工找到 7 个,大家都拿到应有的报酬。如果攻击者发动自私挖矿攻击,那么它能够找到 3 个区块,诚实矿工只能找到 4 个区块,因为另外 3 个诚实矿工找到的区块经过前面提到的攻击方式变成了孤块,原本能够产生 10 个区块的时间现在只产生了 7 个区块,主链增长速度减慢。在下一个难度调整周期,由于协议发现主链增长速度减慢,会降低挖矿难度,从而攻击者能够用同样大的算力获得更多的奖励,这是自私挖矿有利可图的原理。要注意的是,矿工获得的收益是根据单位时间内获得的币的数量而不是获得币的比例来计算的。在下一个难度调整周期,由于链增长的速度下降,协议会降低挖矿难度,此时矿工在单位时间能够获得更多的币,才有收益。因此,自私挖矿在第一个难度调整周期中是没有收益的,只有在挖矿难度调整之后自私挖矿才会有收益。其他替代性共识协议那我们为什么不选择其他替代性的共识协议呢?目前有三种替代 NC 的方式,它们分别是 PoS(Proof of Stake,权益证明),DAG 和两种区块类型的共识协议。注意这三种方式并不是相互排斥的,是有可能同时应用它们之中的 2-3 种的。下面我们来进一步分析这些协议的安全性、功能性和吞吐量。首先是 PoS,实际上所有的 PoS 协议引入了新的安全前提。拿 Algorand 举例来说,它要求大部分诚实用户发送的消息能够被大部分其他诚实用户在一个已知的时间范围内里面接收到。这意味着当你持有 Algorand 的 Token 时,根据协议最初的设计你需要时刻保持在线来接收消息。如果你不在线你就不是一个合格的 Token 持有者。Cardano 的共识协议 Ouroboros 则假设所有用户有一个弱同步的时钟,并且所有消息都能够在一定时间间隔内被送达。这实际上是提出了一个非常强的假设。有很多攻击方式能够让你的挖矿设备,你的公共节点或者手机上的时钟产生偏差。并且这个方案在现实环境中实现起来也非常困难。另外 Sleepy Protocol 也要求用户拥有大致同步的时钟。当这些安全性假设被违反,会为这些 PoS 协议带来灾难性的后果。并且 PoS 协议引入了一些新的攻击方式,如 Nothing-at-stake Attack,Grinding Attack,Long-range Attack,这些攻击方式在 PoW 协议中是不存在的,在这里我不对这些攻击方式进行详细描述。那么 DAG 协议怎么样呢?所有 DAG 协议都有交易排序的问题,如像 DAG 协议那样让区块同步产生,那么不同的矿工或不同的公共节点对交易顺序的判断会有不一致:我认为这一些交易被确认了,但是其他人可能认为另一组交易是被确认的。这时候你会有两种解决问题的思路。一种是在区块链拓扑排序完成之后对交易进行排序,这意味着你需要等待很长的交易确认时间。另一种是不去确认交易顺序。合约的输入需要全局的交易顺序,如果不同矿工判断的交易顺序不同,那么每个矿工对合约逻辑执行顺序的理解就是不一样的,特别是对于复杂的合约。这会限制合约的功能性,复杂合约不能执行,合约中包含的 Token 会卡在合约中。那么那些有两种区块类型的协议如何呢?两种区块类型的协议,顾名思义,它采用一种和 NC 中的区块一样的关键区块(Key Block)来保障交易确认的安全,同时在两个关键区块之间广播微区块(Micro Block)来提高吞吐量。这些协议通常和 DAG 协议一样会有较长的确认延迟。Bitcoin NG 就采用了上述的方案。在 Bitcoin NG 的论文中明确表明,若用户需要确保交易确认,在 Bitcoin NG 中他们就需要等待数个关键区块的确认,忍受较长的交易延迟。(原本在分享过程中张韧提到 Byzcoin 也有类似的问题。但是经过进一步分析发现问题并不类似,若对 Byzcoin 感兴趣可以在论坛:https://talk.nervos.org/t/ner… 进一步讨论 )。声称的 TPS?所有采用这些替代性共识协议的项目都声称它们有很高的吞吐量,那么这些项目的吞吐量究竟如何呢?(下面这一段建议观看视频,约在 15:30 部分,现场非常精彩 )Solana 声称能够每秒能够处理 710000 笔交易。如果你能够有这么大的突破,理应获得图灵奖。我迫不及待地想听到他们获奖的消息。还有这个名为 NKN 的协议,他们声称他们能够在全网拥有 10000 个节点的同时每秒处理 100 万笔交易,目前我还不知道他们是如何做到的,但是我对他们实现的方式非常好奇。我也很好奇为什么 Stellar 和 Ripple 也将自己的协议归类为 NC,我也非常好奇 10000 个节点如何实现每秒处理 100 万笔交易的。而如果你想做个梦的话,你最好做一个伟大的梦,比如这个协议。它声称能够在低于 1 秒的最终确认时间内拥有 1000000000000TPS 。嗯,我真的觉得地球对他们而言已经不够大了,他们真的需要另找一个更大的星球来部署他们的协议。我们要注意的是,自称的 TPS 是没有可比性的。因为它们是在不同的网络环境中做模拟,某些模拟甚至使用 1Gbit/s 的带宽,显然这和现实网络情况相差甚远。并且这些协议都忽略了真实的情况。他们之中没有一个考虑到交易的同步。对它们来说似乎所有的交易都是已经在区块中同步好的一样,共识协议只是用来对交易进行排序的。而且一些模拟假设委员会成员(节点)之间有直接的连接,但事实是,在公有链网络中所有的消息都是通过广播进行的,而广播消息会占用公共节点的带宽。知识点:Fresh Transaction,为什么说要考虑交易的同步呢?要认识到,在比特币中一个用户从钱包客户端发起的交易并不是被所有矿工都接受到,而是相邻的几个矿工。这些矿工在接受到用户发起的交易的时候会对交易进行验证才能放到交易池中,以便在未来将这些交易打包出块。因此若一个矿工成功挖到一个块并广播 Compact Block,其他矿工在检查 Compact Block 中交易 ID 的时候若发现对应的有些交易并不在自己的交易池中,则需要向发送方请求完整交易进行验证来保障区块中所有交易都是合法的,这些交易就是「Fresh Transaction」。若不进行验证就在收到区块之后挖矿,一旦完整区块广播后被发现有非法交易,将不会被矿工认可,在这个非法区块之后挖出的区块都会作废。Fresh Transaction 的概念我们会在后面用到。比较吞吐量的简易模型这里我们有一个评估 TPS 的模型。如图所示,首先我们相信所有公共节点的带宽是有一个上限的,最多能够使用 100% 的带宽,你不能使用超过 100% 的带宽。在这里带宽的占用有三个组成部分。如上图所示,第一部分是用于同步最终确认的交易所占用的带宽比例,这一部分是真正的 TPS(This is the real TPS)。交易首先要被同步,之后才能进行交易确认。第二部分是被共识协议「浪费」的带宽所占的比例。第三部分是未被利用的带宽。所以如果想要提高 TPS,能够做的只有两件事。1、降低共识协议占用的带宽比例2、降低未被利用部分的带宽比例能做的只有这两件事情,对,没有其他的方式了,并且对于 Layer 1 的协议带宽占用不能超过 100%。那我们先来看看其他替代性共识协议的带宽占用。事实上,很多协议将它们珍贵的带宽资源浪费在委员会成员之间的通信上。Algorand 存储区块证书以此来向新用户证明一个区块被提交。每个区块证书的大小是 300KB ,独立于区块容量限制之外。如果你按照一个区块 1MB 的大小来计算,那么这意味着大约 25% 的带宽会永远被用于同步这些证书。因此我非常好奇为什么它们声称他们的吞吐量比 NC 更好,这根本不合理。另外一种在共识协议中浪费带宽的方式是区块型 DAG 和孤块中的冗余交易。如上图的论文中所说,如果所有的节点在区块中选择包含同样的一组子交易,任何两个平行创建的区块将可能出现冲突,并且吞吐量就不会很高。而目前所有的区块型 DAG 协议对这种情况视若罔闻。如何突破中本聪共识困境?从上面的分析中看到,显然目前的吞吐量不能满足我们,因此,Nervos CKB 的共识协议 NC-Max 对 NC 做了一些改进:NC-Max 有三个主要的创新采用两步交易确认来降低孤块率动态调整区块间隔和区块奖励来更好的提升带宽利用率在难度调整的时候考虑周期中的所有区块,来抵御自私挖矿攻击。接下来我会进行详细解释。NC 有一个天然的吞吐量限制,因为想要提高 NC 中的吞吐量,只能做两件事情:第一件是更大的区块,就如 Bitcoin Unlimited 和 Bitcoin Cash 那样,还有很多其他的项目也这样做;第二件是降低出块间隔。但是由于区块广播需要时间,广播期间若其他节点发现区块并广播,会和正在广播的区块产生竞争,其中之一会成为孤块。更大的区块会需要更长时间广播,降低出块间隔实际上是降低出块难度,节点更容易发现区块。这两种方案容易带来的结果是孤块率变高了。这些孤块占用更多的带宽,但是它们并不为交易确认做出贡献。当孤块率提高时,系统的安全性会降低并且吞吐量也会降低。因此对于这两种方案最终会达到一个平衡,当区块大小或出块间隔调节到一定程度时,孤块率会高到一定程度,即使你进一步增加区块大小或者降低出块间隔,吞吐量也不会得到提高。为什么太多的孤块会对网络的安全和性能产生负面影响呢?在上图中我们能够看到,当孤块率非常高时,攻击者能够非常轻易地私自构建一条更长链。攻击者只需要拥有比全网算力的 51% 低很多的算力,就能够覆盖掉区块链。并且孤块会消耗公共节点大量的带宽,这会对整个系统的吞吐量造成很大的负面影响。那我们如何打破 NC 吞吐量的限制呢?经过上面分析,如果我们想要打破这个限制,就必须降低孤块率。如果孤块率下降,那么网络的安全性和吞吐量都能够提高。如何降低孤块率呢?孤块的出现是由于区块广播的延迟,若在一个区块广播的过程中,有另一个区块被发现,那么其中一个区块就注定会成为孤块。如果区块广播能够瞬间完成,自然不会有孤块出现。那我们如何确保区块能够足够快速地被广播出去呢?比特币的开发者已经投入了非常多的资源和精力来加快区块的广播速度,我们需要进一步找出哪些区块的广播速度较慢,或是出了问题。我们来详细看看这是如何发生的,请看下图。目前的比特币网络,如果一切顺利的话,一个区块是通过一个Compact Block 中继协议来广播的。在 Compact Block 中,并不会将整个交易(比特币每个交易大约 250Bytes)广播出去,而是广播 Compact Block 中的交易 ID。这些交易 ID 组成了 Compact Block,这些 Compact Block 比实际的区块小很多,因此速度会快很多。当节点 A 广播 Compact Block 给节点 B 的时候,节点 B 检查这些交易 ID ,如果对于节点 B 这些交易都不是 Fresh Transaction(也就是节点 B 的交易池中包含这些交易),节点 B 能够立刻转发这些 Compact Block 给相邻节点,这种情况非常棒,过程很顺利。然而如果在 Compact Block 中有 Fresh Transaction,节点 B 将首先需要从节点 A 那边同步 Fresh Transaction,然后验证这些交易的签名,这些步骤都很耗费时间。只有当整个区块都经过验证无误之后,节点 B 才能继续广播这个区块。这个过程避免收到的区块非法,这样矿工才会在这个区块之后挖矿并广播,若不经过验证万一之后发现是非法区块,那么在这个非法区块之后的区块都是无效的。同步 Fresh Transaction 的过程是比特币区块广播延迟的主要原因。所以,以太坊是一个糟糕的尝试,我来分析一下他们是怎么做的。以太坊简单地缩短了出块间隔,但是以太坊有一个问题,就是它不能够在收到区块之前验证交易的有效性。因为在以太坊中一个交易的有效性依赖于区块中交易的顺序,因此如果你想要验证一个交易的有效性你必须等到整个区块都被接收到才行,这样的话每一个区块实际上都是 Fresh Transaction。并且以太坊的网络协议维护得非常差,自从 2015 年开始就没有任何的迭代。而且在交易广播过程中也有大量的冗余。以太坊客户端会将同一笔交易向不同的节点广播 7 次,这意味着每一个节点将会收到同一笔交易 7 次。(以太坊有不同的客户端,如 Parity Ethereum,Geth 等)而且不同类型的客户端之间有不一致性,两个主要的以太坊客户端之间基本都是独立的。因此能够链接两个不同的网络的节点非常少,这也是为什么以太坊孤块率有时会高达 30%,并且交易吞吐量非常低。而且大矿工没有加快区块广播速度的激励。因为如果我的区块能够更慢地广播出去,意味着我实际上能够实现「自私挖矿」(这里大矿工并不扣留区块,只是区块广播比较慢,在这个过程中出现了其他的竞争块,而因为我是大矿工有较大的概率在和其他竞争块竞争过程中胜出)。这对我来讲是好事,为什么我要加速区块广播呢?以太坊中的叔块奖励也没有提供任何帮助,毕竟如果产生了的孤块,矿工还是能够获得奖励。因此小矿工会采用先广播区块头和空块的方式,因为广播区块头的速度会快很多。并且由于不知道下一个区块中会包含哪些交易,因此矿工通常会挖一个空块来确保区块中不会包含和之前区块交易产生冲突的交易。这非常糟糕,因为空块并不为交易确认做出贡献。下面是我们的设计,来缓解上面提到的一些问题。这张图是区块的结构,我们在比特币区块结构的基础上增加了几个字段。上图是我们的完整区块的区块结构。首先我们有一个交易提案区(青色区域)。只有交易提案区可包含 Fresh Transaction,而传统的交易确认区(橙色区域)只能包含前几个区块的交易提案区的交易,若当前区块高度是 h 的话,那么就是 h-m 到 h-n 区块的交易提案区内的交易。只有这些交易能够被确认,Fresh Transaction 不能被交易确认区确认。交易提案区不包含完整的交易,只包含交易 ID(Truncated Transaction ID),因此交易提案区会非常小。在叔块头区可以包含任意数量的叔块(紫色区域),叔块应该包含它们的区块头和交易提案区。叔块头区不计入区块大小,因而不受区块大小的限制,所以不会限制矿工添加叔块。下面我进一步来解释交易提案区。这个区域非常小,因为它只包含交易 ID。完整的交易与区块同步广播,因为这是一个并行的过程,所以交易的广播不会影响到区块的广播。并且节点在收到广播的交易后只需要验证哈希,不会影响区块的验证过程。尽管这意味着在交易提案区可能会有无效的交易,双花交易以及矿工可能不愿意接受的交易,但是这都没有关系。类比之前提到的比特币区块广播过程,在我们的协议中,发现区块的节点会先广播 Compact Block(也就是区块头和交易的 ID),Compact Block 较比特币的稍微大一点,包含交易提案区和若干叔块的区块头和叔块的交易提案区。但由于 Compact Block 本身足够小通常会立刻广播给相邻的节点。新提出的交易,如果有一部分不在节点的交易池中,它们会在发出 Compact Block 之后进行广播。这些都是并行过程,不会相互影响。节点收到交易,经过哈希验证后广播给相邻的节点。这很自然地会有几个问题:如果矿工拒绝提供提案交易的完整版本怎么办?我把这个交易放到我的交易提案区,但是当你问我要完整的交易的时候,我装作不知道。实际上这个对区块广播不会有影响,因为不论交易提案区是否有 Fresh Transaction,区块都能够广播。并且其他矿工也会继续挖矿,因为总是有足够的提案交易需要确认。该矿工也没有必要挖空块,因为之前区块的交易提案区包含了它将打包的这些交易 ID,已经被发现的区块在 Compact Block 中都广播了打包进的交易确认区的交易 ID,矿工都知道哪些交易被打包了哪些没有,不会选择和被发现区块交易确认区内相冲突的交易,因此矿工会选择继续打包交易出块并获得手续费,为交易确认做贡献。那么如果矿工在他们最新的区块中包含了这些提出但未广播的交易,以获得一个类似自私挖矿的优势怎么办?在比特币的 NC 中,矿工减慢区块广播速度可以获得挖矿优势。矿工通常能够在挖出一个区块时,只广播区块头,而在广播完整区块的时候放慢动作。在这个过程中只有该矿工能够挖矿(因为只有他知道下一个区块的信息,能够基于这个新块挖矿,这个过程类似扣留区块)。但是在我们的协议中,采用这种方式只会减慢 n 个区块之后的区块广播速度。因为提出但未广播的交易只有自私矿工知道,也只有自私矿工能以此作为优势。然而这个不能被用在下一个区块中,因为在我们的协议中只能挖 n 个区块之前提案区中包含交易,中间需要有一个间隔。矿工只能够挖 h-m 至 h-n 个区块内的提案交易,但是不能挖前一个区块的提案交易,除非这个区块也是被攻击者挖到的。如图所示,这是我们的共识协议和比特币 NC 的对比。在比特币 NC 中当自私的矿工找到区块 h, 它能够立刻开始挖区块 h+1,此时诚实矿工只能够在收到完整的区块 h 之后才能开始挖矿,因为其他矿工需要知道区块包含的完整的交易并验证来确定区块是合法的,而自私矿工能够通过减慢区块 h 传输的速度来让其他矿工更晚收到区块。在区块广播期间就是自私挖矿者的优势期。然而在我们的协议中当一个自私矿工找到一个区块 h,广播了包含区块头和交易 ID 的 Compact Block,诚实矿工能够立刻开始挖 h+1。如果自私矿工想要利用这些提出但未广播的交易,它必须找到 n 个区块之后的区块(这些区块才能包含这些提出但未广播的交易),这样他们才能利用这个优势。然而这很难发生,你不能确定在 n 个块之后的那个块是你挖出来的,这个非常难预测。为了更好地利用带宽,我们的协议使用了另一种不同的难度调整机制,设定一个固定的孤块率(根据上一个难度调节期的叔块数来计算)。如果孤块率在上一个难度调整周期低于设定的孤块率,挖矿难度会降低,出块间隔将降低,吞吐量会提高。也就是说,更少的孤块意味着当前的网络状态实际上有能力更快地同步交易,我们能够在提高吞吐量的同时不损害网络的去中心化。反过来看如果难度提高,那么出块间隔会增加,吞吐量也会降低。如果孤块率很高那么意味着当前的网络在这个难度调整周期内并不能处理那么多的交易,那么协议就会降低吞吐量。同时出块奖励会和 1/(预期出块间隔)成正比,因此在每个难度调整周期中预期的总出块奖励是固定的。这意味着假设我们每十分钟出一个块,每个块中有 12.5 个比特币,如果难度调节变成每 5 分钟出一个块的时候,每个块会有 6.125 个比特币。因此货币的发行率也是保持恒定的。最后,抵抗自私挖矿攻击。前面我们提到我们的协议和 NC 的一个区别在于,我们的难度调整机制是根据难度调整区间中出现的所有区块来计算的,在估计总算力的时候也会包含叔块。在 NC-Max 中,假设攻击者占总算力的 30%,诚实矿工 70%,如果没有自私挖矿攻击,在 10 个区块中攻击者能够找到 3 个区块,诚实矿工找到 7 个。如果进行自私挖矿,攻击者在 7 个区块中能够找到 3 个区块,诚实矿工找到 4 个,3 个诚实区块会成为孤块,主链会增长缓慢。前面也提到自私挖矿在第一个难度调整周期内是没有收益的,那么在第二个难度调整周期会出现什么?在下一个难度调整周期,难度会保持不变(因为难度会根据所有区块计算,包含孤块),攻击者并不能用同样的算力找到更多的区块,因此自私挖矿不再有利可图。也就是说,我们假设币价在短时间内维持稳定,由于自私挖矿攻击者是短视的,他们的奖励是根据单位时间内获得的奖励来定义,可以等价于同样的电力消耗能够获得的奖励。在比特币中,自私挖矿攻击者能够通过降低链增长速度,「迫使」协议降低出块难度,从而在难度调整之后单位时间内能够获得更多的奖励。而在 NC-Max 协议设计中,出块难度会根据所有区块来计算,包括孤块,攻击者让诚实矿工的区块成为孤块,却并不能「迫使」协议降低出块难度,以在单位时间内获得更高奖励。最后总结一下,我们的协议会很好地利用孤块:我们希望能够通过两步交易验证来降低孤块数量,在孤块数量降低之后,我们利用孤块率作为一个带宽利用水平的指标来动态地调节吞吐量。并且孤块信息被写在了区块链中,我们在挖矿难度调整算法中利用这个信息从而让自私挖矿无利可图。NC-Max 是 Nervos CKB 的 PoW 共识协议。NC 是 Nakamoto Consensus 的简称,也就是比特币的共识协议。如果读完这篇文章,你觉得这个共识协议应该有一个更好的名字,欢迎告诉我们,或许我们能够采纳:)欢迎讨论:https://talk.nervos.org/t/ner…。推荐阅读:张韧博士的共识安全性分析文章《制定通用的标准:评估 PoW 共识协议的安全性》 ...

February 21, 2019 · 3 min · jiezi

Conflux吐槽君:IOTA物联网电磁炉-让PoW的耗电没有遗憾

鉴于有不少小伙伴反映,觉得区块链技术圈乱象横生,鱼龙混杂,导致大家很难去辨识哪些是真正的技术。甚至有些人,打着说技术的名号,其实自己本身都没弄懂弄明白,只是懂个皮毛,就开始拿着各种技术专有名词去唬人。这样的现象,导致想好好学习技术知识的小伙伴们甚至会被混淆和误导,学到和接收到的是错误的信息。小编对于存在的这样的乱象也深感痛心,作为一支来自与清华姚班的公链团队,Conflux的小伙伴们,决定来帮助真正想学习技术的大家!推出《吐槽君小C》专栏,小C会用最直接,最犀利的言语来道出区块链项目技术的优势劣势,真正讲清楚技术,讲清楚技术之间的区别,让大家对技术和整个行业有更深刻的了解认知,本文就是Conflux吐槽君第一期~一个荒唐的故事几年前,打车平台激烈大战的时候,有这样一家创业公司横空出世,号称实现了零打车费,从根本上解决了人们出行中的痛点。而实现的方式是,让用户自己买辆车,然后自己给自己当司机。让服务需求方自己给自己提供服务,从而节省了服务费。这一想法让投资人非常惊讶,然后将创业者打出门去。上面这个故事是小C我编的。但在区块链这个圈子里,却真的有这样一个公链项目,凭借着区块链的技术认知门槛,编概念讲故事,号称解决了区块链+物联网的痛点。这个项目在区块链泡沫最高的时候,一度登上了市值榜TOP10。这就是小C今天的要和大家讲的项目:IOTA。IOTA是个啥?首先,IOTA是一个使用DAG账本结构的区块链系统。(注:DAG,Directed Acyclic Graph,中文全称“有向无环图”,所谓DAG结构,就是让每个区块或交易引用多个区块或交易作为父亲。这样所有的区块或交易之间的父子关系构成一个有向图。每个区块或交易必须引用比自己早的交易,因此,这些区块或交易的父子关系不可能出现循环。因此,这个结构被称为有向无环图) 它的账本数据结构叫做Tangle,翻译成中文就是“纠缠,混乱”的意思。没错,这个名字非常贴切。因为小C从研究IOTA的第一天开始,就被IOTA技术上各种奇葩不靠谱的方案绕晕了。IOTA的项目愿景非常美好:它通过无区块链,无交易费,无限可扩展,解决了物联网场景中各种痛点。这简直是重新定义了区块链啊。但是,如果深扒IOTA的技术原理,你会发现IOTA实现方案非常不靠谱。有多不靠谱呢?比对着excel喊“二百五,求和”还不靠谱。IOTA到底怎么不靠谱小C先来说说这个无限可扩展。在IOTA原始的设定中,所有的交易构成一个 DAG。任何人(或物联网设备)想发起交易,只需要引用其他两个交易就可以了。没有矿工,没有区块,没有矿工赚交易费,你发交易的速度有多快,IOTA的TPS就有多高。只要好人的交易总数足够多,它就是安全的。这简直太awesome了,攻击一个区块链系统从来没有像攻击IOTA那样简单。不需要屯币,不需要买矿机,我只要搞一台电脑不停地,每分每秒不停地发交易,让我的交易占据全网的50%以上,我就攻击成功了。IOTA 大概也意识到了这个问题(被大家抨击到不得不意识到这个问题)。于是IOTA后面改了,说每笔交易必须算一个 PoW,来防止女巫攻击带来的双花问题的。纳尼?说好的无限可扩展呢?有了PoW的IOTA真是妙不可言啊。要知道,IOTA应用场景是物联网设备,物联网设备跑PoW真是天才的想法啊。所谓的物联网设备,就包括现在最火的智能家居,比如智能插座,智能音箱,智能冰箱等。那什么样的物联网设备可以把PoW的优势发挥到淋漓尽致呢?机智的小编我,马上想到了物联网智能电磁炉!我简直迫不及待想买一个 IOTA 物联网智能电磁炉,每次打开电磁炉的时候,它就开始进行PoW运算,发出的热量也可以加热食品。当你的晚饭做好了,一笔 IOTA交易也就发出去了。不仅如此,这个IOTA电磁炉还能提高烹饪的安全系数。它通过占满你家网络的带宽,让你上不了网,杜绝你在烹饪的时候因为刷微信刷微博把房子点着。因为在IOTA中,发送每笔交易时,需要选择两笔交易作为父亲。这个要求看似简单,但你需要保证:这两笔交易的历史中没有非法交易,没有冲突的交易。这需要同步大量的历史,验证历史交易的正确性,处理冲突交易,并且保持与IOTA的DAG最新状态同步。如果你偷懒不同步,那你的交易可能就因为违反了一些规则被无效掉了。为了重新发起这笔交易,你只好再做一顿饭。在比特币中,矿工负责做PoW运算,负责同步、验证网络交易,并处理冲突,用户向矿工付交易费。IOTA重新定义了区块链,消灭了交易费,取而代之的是这些事情都得用户自己来做。当比特币的用户坐在餐桌上吃烤鸭的时候,IOTA的用户还蹲在后厨亲自养鸭子。小C认为,IOTA所谓的无交易费,本质上就是用从商品经济回到自然经济,这是倒退,不是创新。当然,由于这个实在太不合理,于是IOTA的社区就有了弥补的方案。有一个叫 IOTA PoWer的服务,它允许用户付一笔钱,将自己的交易PoW计算等任务外包。可是小C我仔细一想,这不就是用户发出一笔交易,然后付钱让矿工给我打包进区块吗?这个区块很特别,只能放一笔交易而已。由此可见,IOTA所谓的无区块链,不过是自欺欺人的宣传点罢了。对于上面荒诞的故事,IOTA的拥护者可能会不服,他们认为IOTA的PoW与比特币的PoW目的是不一样的,IOTA的PoW只是为了减少网络中的垃圾交易,不会给用户造成负担。那就让小C来带着大家,具体算一算IOTA 中PoW 的难度怎么设比较合理。首先,我们要算一下IOTA网络最高能跑到多少个TPS?如果IOTA每秒产生10000笔交易,网络带宽的局限性导致IOTA无法保证DAG账本在全网的同步。如果账本始终无法及时同步,那么不同的节点就可能在不同的分叉上越走越远,从此分道扬镳,共识不再。所以 IOTA的网络中,每秒 10000 笔交易,不能再多了。然后,我们要算一下IOTA的全网算力达到多少 TH/s 才算安全?全网算力达到多少 TH/s,一个普通的家用电脑,才能在一顿饭的时间里(1小时)发出一笔交易?一个Intel Core 2 Duo的算力大概是2.5MHash/s, 1小时内可以尝试9G次Hash尝试。9G次Hash尝试发出一笔交易,目前 IOTA主网的吞吐率只有5TPS,如果坏人有>45GHash/s的算力,那么他们就可以每秒产生>5笔交易,就可以在交易数量上占据主导,从而进行51%算力攻击。即使达到了10000 TPS,90THash/s依然可以进行51%算力攻击。 90THash/s是个什么概念呢?一个蚂蚁S9矿机的算力是13.5THash/s,七台蚂蚁矿机的算力就可以超过 90THash/s。哪怕普通用户算1小时才能发起一笔交易,七台S9蚂蚁矿机就能完成对IOTA的双花攻击。IOTA面临着一个选择:去让用户忍受更长的等待时间,还是让攻破IOTA的门槛更低?IOTA选哪个?IOTA哪个都不选,IOTA选择中心化!为了解决上述矛盾,IOTA网络中要额外使用一个中心化的Coordinator来定期的验证DAG和交易。这使得IOTA实际上变成了一个中心化的系统。IOTA声称,未来会取消这个中心化的 Coordinator。然而,基于上面的计算,即使网络带宽增加100倍,即使用户愿意忍受1小时才能发一笔交易,700台S9矿机依然能对IOTA发起双花攻击。与之相对应的是,比特币的全网算力大约是(50 EHash/s),相当于4000000台S9矿机。给IOTA的建议小C认为,摆在IOTA面前两条路,要么在中心化的道路上继续走下去,要么积极推广PoW外包方案。让专门的矿工来处理交易打包、PoW挖矿等事宜,让用户为矿工付费。摒弃“无交易费、无区块链、无限扩展”等这些不负责任的言辞。但是即使IOTA“改过自新”,接受了小C的建议,IOTA本质上还是一个1个区块只能包1笔交易的区块DAG。它违背了系统设计中最最通用的一个常识性的优化思想–batching,就是批量处理。这意味着元数据带来的开销会显著增加,同时会带来很多系统实现上的性能挑战。比如,当区块链系统的吞吐率达到每秒几千笔交易的时候,网络带宽通常会成为瓶颈。而交易就是区块链网络中主要需要传输的数据。如果每笔交易都附带许多DAG相关的元数据(例如对其它DAG结点的引用),那么对网络带宽的压力就会大大增加。另外,维护交易粒度的DAG也会大大增加本地计算的复杂度。IOTA的DAG中需要对每个交易结点维护一个累计权重,也就是所有直接或间接引用了该交易的交易个数。当一个新的交易被加入到DAG的尾部,所有它能够直接或间接引用到的交易的累计权重都要需要更新,这个复杂度是和交易的个数成正比的 。假设系统的吞吐率是1000TPS,那么系统从刚开始运行到1小时后,DAG中的交易个数就会达到360万。一天之后就会达到8600万。之后每笔新加入的交易都会带来接近1亿次的权重更新,而且这个复杂度会越来越大。小C有话说我们需要认清几个事实。吞吐率有限,是因为网络带宽有限。PoW的难度高,是为了避免轻而易举地被 51% 攻击。交易费的存在,让专职矿工来解决普通用户的需求。一个区块容纳多个交易的设计,提高了运行的效率。如果看不到这些背后的原理,却盲目地去掉限速,去掉交易费,去掉区块,然后用一个漏洞百出的底层技术,去设计产品方案,去讲一个所谓天方夜谭的故事,这样只会断送这个项目的未来。(注:如果代币是增发的,通胀本质上就是持币者向矿工付服务费。)欢迎关注我们的微信公众号:Conflux中文社区(Conflux-Chain)添加微信群管理员 Confluxgroup 回复“加群”加入 Conflux官方交流群

February 21, 2019 · 1 min · jiezi

Bytom BIP-32协议和BIP-44协议

我们知道HD(分层确定性)钱包,基于 BIP-32;多币种和多帐户钱包,基于 BIP-44;最近比原社区的钱包开发者对比原的BIP-32和BIP-44协议有疑问,所以我今天就专门整理了一下该协议的内容以及在比原中涉及的代码。来做一个详细的介绍!BIP-32协议BIP32协议原英文地址:地址:https://github.com/bitcoin/bi…BIP32:定义 Hierarchical Deterministic wallet (简称 “HD Wallet”),是一个系统可以从单一个 seed 产生一树状结构储存多组 keypairs(私钥和公钥)。好处是可以方便的备份、转移到其他相容装置(因为都只需要 seed),以及分层的权限控制等。具体的内容细节可以翻阅文档。那么下面我列出了在比原链中BIP-32协议的具体实现,具体的实现的代码逻辑可以在:https://github.com/Bytom/byto… 找到下面的方法。研究代码实现过程.比原链中BIP32协议的代码实现:BIP-44协议BIP-44原英文协议地址地址: https://github.com/bitcoin/bi...BIP-44协议是基于BIP-0032和BIP-0043中描述的目的方案中描述的算法定义确定性钱包的逻辑层级。赋予树状结构中的各层特殊的意义。让同一个 seed 可以支援多币种、多帐户等。各层定义如下: m / purpose’ / coin_type’ / account’ / change / address_index //purporse’: 固定值44’, 代表是BIP44 //coin_type’: 这个代表的是币种, 可以兼容很多种币, 比如BTC是0’, ETH是60,BTM是99’ //btc一般是 m/44’/0’/0’/0 //eth一般是 m/44’/60’/0’/0 //btm一般是 m/44’/99’/0’/0HD(分层确定性)钱包树状结构提供了极大的灵活性。每一个母扩展密钥有 40 亿个子密钥:20 亿个常规子密钥和 20 亿个强化子密钥。而每个子密钥又会有 40 亿个子密钥并 且以此类推。只要你愿意,这个树结构可以无限类推到无穷代。但是,又由于有了这个灵活性,对无限的树状结构进行导航就变得异常困难。尤其是对于在不同的HD钱包之间进行转移交易,因为内部组织到内部分支以及亚分支的可能性是无穷的.BIP-43 提出使用第一个强化子索引作为特殊的标识符表示 树状结构的“purpose”。基于BIP-43,HD(分层确定性)钱包应该使用且只用第一层级的树的分 支,而且有索引号码去识别结构并且有命名空间来定义剩余的树的目的地。举个例子,HD(分层确定性)钱包只使用分支 m/i’/是为了表明那个被索引号“i”定义的特殊为目地。在BIP-43 标准下,为了延长的那个特殊规范,BIP-44提议了多账户结构作为 “purpose”。所有遵循BIP-44的HD(分层确定性)钱包依据只使用树的第一个分支的要求而被定 义:m/44’/。 BIP-44 指定了包含5个预定义树状层级的结构:第一层的 purpose 总是被设定为 44’。第二层的“coin_type”特指币种并且允许多元货币 HD 钱包中的货币在第二个层级下有自己的亚树状结构。常见的数字资产定义:Bitcoin is m/44’/0’、Ethereum Testnet is m/44’/1’,以及 Bytom is m/44’/99’。完整注册数字资产类型列表: https://github.com/satoshilab…第三层级是“account”,这可以允许使用者为了会计或者组织目的,而去再细 分他们的钱包到独立的逻辑性亚账户。 举个例子,一个HD钱包可能包含两个比 特币“账户”:m/44’/0’/0’ 和 m/44’/0’/1’。每个账户都是它自己亚树的根。第四层级就是“change”。每一个HD钱包有两个亚树,一个是用来接收地址一个是用来创造找零地址。注意无论先前的层级是否使用强化衍生,这一层级使用的都 是常规衍生。这是为了允许这一层级的树可以在不安全环境下,输出扩展公钥。被HD(分层确定性)钱包衍生的可用的地址是第四层级的子级,就是第五层级的树的“address_index”。比如,第三个层级的主账户收到比原支付的地址就是 M/44’/99’/0’/0/2。下面介绍一下比原链中BIP-44协议的实现,我们在 :https://github.com/Bytom/byto… 找到下面的方法。可以研究具体的代码实现过程。比原链中BIP44协议的实现:比原中用BIP-44生成钱包地址在项目中找到 CreateAddress 方法,这个方法会用到BIP-44协议来创建地址:比原现在会默认使用BIP-44协议,所以在下面的switch语句中,会默认到BIP0044.到此BIP-32协议和BIP-44协议已经介绍完,并且在比原的代码中的实现也已经列出来了。感兴趣的小伙伴可以读代码研究详细的实现过程,如果有什么问题,欢迎在比原技术社区提问!比原项目仓库:Github地址:https://github.com/Bytom/bytomGitee地址:https://gitee.com/BytomBlockc… ...

February 21, 2019 · 1 min · jiezi

第12期 DApp 榜单 : “吸睛”+“吸金”的小游戏

作者:DD君欢迎添加作者微信 btcbtc555 与他进行交流!未经授权禁止转载!截止到今天为止,以太坊上DApp数量合计为1,336,EOS上DApp数量合计为349,波场上DApp数量合计为173,三大公链中竞猜类DAPP均居龙头位置。目前宏观经济形势不稳定已成为绝大多数人的共识,春节期间年年爆火的返乡置业潮相较于往年都有所降温,DApp在节期间的表现不尽人意也可以理解。一方面来自用户群体注意力的转移,另一方面则是由于用户现金流的缺失。整个虚拟货币市场是个联动的生态系统,春节期间一直处在盘整阶段的各个主流币种,今天以太坊率先领跑,比特币柚子等也有小幅上涨,不知道此波行情能否也为DAPP带来一些关注度。以下进入今天的榜单。ETH榜单相较于EOS在春节期间的用户数流失,ETH的交易人数却有所增加。但我们发现1812个以太坊DApps中只有180个与ERC-20交易相关联,通过简单的算数得知,这大约相当于10%,大量的以太DAPP已经处于死亡状态。加拿大加密货币研究者和行业评论员Kevin Rooke的言论也巩固了以太坊应用程序缺乏活动的事实。这样来看春节期间以太坊交易人数的激增,可能又是某些项目方自导自演的戏码。EOS榜单可以注意到EOS榜单在春节期间有很大的波动变化,除了雷打不动的PRA CandyBox、EOS Knights依旧霸榜之外,其余名次皆有较大变化,且竞猜类DAPP占据主要名额。游戏BIG.GAME早在去年九月份就已经推出,表现一直不温不火,但近日的用户数增长堪称飞速。相较而言每日成交量的增速远远低于用户数,我们有理由怀疑该团队通过刷用户量的方式提升自己的Dapp排名,以获得更高的曝光度。TRON榜单本周波场前三名依旧为节前前三,而后半部分的变动较大。波场的DApp的爆发时间远晚于EOS,从去年12月份才进入爆发期,1月步入红利期,目前每天仍有新的波场DAPP推出。由于波场主要用户都集中在海外,所以整个春节期间,其交易量并没有太大的下滑幅度。观点分析春节假期明显可以感觉到Dapp圈内迅速冷却,不知道的人还以为是Dapp要凉了。原因篇首已提,此处便不再赘述,目前三大公链的数据已经基本回暖。缺乏新用户入场是目前所有DAPP遭遇的普遍难题。我们DAPPDiscover团队已经不止一次提到过,只有出现一些新的好玩的游戏,才有吸引新用户的可能性。春节期间一款名为Celex的五子棋游戏就引起了我们团队的关注,大家可以感受一下游戏界面。界面简洁,使用流畅,没有繁杂的注册钱包步骤,是DD君体验该游戏的直观感受。也许有读者疑问:“这个游戏这么常见,有必要放在单独拎出来讲吗?”有!!!原因有两点:其一,从游戏层面上,该五子棋属于小游戏,能有效吸引更多的用户群体。我们可以对比微信的小游戏“跳一跳”。2017年12月28日下午,微信小游戏“跳一跳”正式上线,一经推出,微信指数几乎直线上升超过2亿,2018年春节期间同时在线人数最高2800万/小时。抛开微信的熟人生态和满足用户相互攀比分数高低的原因外,小游戏耗时少难度低,用户的碎片化时间可以得到更有效占用,从而能获得更多的用户群体。其二,结合DAPP的通性,包括上面我们提到的Celex,本质依旧是“游戏即挖矿”。以该游戏为例,这款游戏主要通过与人实时PK五子棋来确定输赢,筹码就是GT(该游戏代币)。该游戏还含有邀请好友奖励等等,由于该游戏还处于测试阶段,后续有可能会上线更多的玩法,但本质估计仍差不多。小游戏带来更多用户,区块链又给该小游戏赋予了金融属性,“吸睛”+“吸金”,你不心动吗?你有哪些感兴趣的DApp?欢迎留言回复下一次讨论的,也许就是它。

February 19, 2019 · 1 min · jiezi

【Filecoin源码仓库全解析】第二章:如何创建账户钱包并获取FIL Mock代币

欢迎大家来到第二章,经过 前章《【Filecoin源码仓库全解析】第一章:搭建Filecoin测试节点》的内容阅读后,我们应该已经具备在自己的机器上部署Filecoin测试节点的能力,本章我们将介绍Filecoin节点信息,用户账户钱包,矿工角色等相关概念,以及如何获取FIL Mock代币。2.1 前章问题补充感谢之前一些读者给的建议,有一些没有叙述清楚的地方,这边就上一章问题补充一下:之前大部分的依赖安装流程需要科学上网,gx在编译时候默认拉取的是源自https://go.googlesource.com/…。对于一些使用linux系统的朋友:其实linux与macOS系统差异并不大,如果觉得源码编译环节比较繁琐,可以直接使用官方发布的filecoin-Linux.tar.gz release包进行后续操作:下载地址:https://github.com/filecoin-p…#传输至linux远程机器scp Downloads/filecoin-Linux.tar.gz user_name@remote_server_ip:/user_name#解压tar -zxvf filecoin-Linux.tar.gz#运行节点程序./go-filecoin *注意:官方的release是2月13号发布的,并不是最新的包,可能在后续操作中,与官方文档在一些细节地方会有出入。2.2 区分节点ID、账户、钱包地址、矿工ID、内容ID在创建账户钱包,获取FIL Mock代币之前,我们需要重点区分节点ID、账户、钱包地址和矿工ID这几个概念意义,以及其所对应的标识:如图所示,它们的层级关系一目了然:在第一章中,我们在自己的主机上安装了go-filecoin的客户端,你可以理解为这个客户端是用来初始化、启动和管理节点的应用程序。没有网络拓扑,何来节点的概念? 当我们启动daemon,开放自身主机端口,发送网络请求,加入Filecoin对等网络之后,我们才能被称为是一个Filecoin节点(如果之前了解过区块链,应该很好理解)。下面分别集中介绍一下其他几个概念:节点ID节点(Node)的职能包含了两重角色,四重身份, 其中有三种不同角色的矿工身份属性:1)存储使用方(user)2)矿工(miner:存储提供、检索、修复)节点ID是节点的唯一标识,类似姓名(永不重复)查看方式:go-filecoin daemongo-filecoin id用途:主要用于节点的查找发现、节点与节点之间的通信,节点日志Trace等。账户ID账户(account)是无论哪一重角色都需要的基本属性,账户ID和节点ID呈一一对应关系,和钱包地址一对多关系(即一个节点账户下,可存在多个钱包地址),直接和交易FIL Balance挂钩,由节点自动初始化生成。钱包地址钱包地址:顾名思义,类似银行卡卡号,是区块链系统中必不可少的一环,一般是非对称加密的公钥。这里钱包地址是由节点自动初始化生成,由go-filecoin wallet *管理,如下图所示,地址信息十分重要,查询余额,导出和导入都需要。钱包地址在一个账户下,可支持新增,导入,非常灵活同时,我们也可以通过go-filecoin wallet addrs *或在.filecoin/config.json下,查看、管理和配置钱包地址的相关信息。矿工ID与账户钱包不同,矿工(Miner)相关信息和配置并不会在部署好Filecoin节点后自动创建,需要通过后面miner创建的命令手动选择:go-filecoin miner create 10 100 –price=0 –limit=1000 –peerid go-filecoin id | jq -r '.ID'且通过–peerid go-filecoin id | jq -r ‘.ID’ 的后缀参数可以看出,矿工ID与节点ID存在一一对应关系,节点ID将参与矿工ID的生成。内容ID内容ID也叫CID,与IPFS中所强调的一样,在Filecoin网络中将为每份文件数据生成唯一的CID,这是为了方便Merkle去重以及直接通过内容快速索引数据(IPFS与Filecoin数据传输协议层的精髓),在后续存储需求方的使用操作中,我们就会用到。这也是未来基于Filecoin编写商业应用、迁移自身业务系统数据的核心键值对数据。2.3 创建账户钱包默认生成节点在初始化过程中,将自动为我们生成一个defaultAddress,我们可以在节点配置文件中可以查看到:vim ~/.filecoin/config.json"wallet":{ “defaultAddress”:“fcq3t…29” },创建新的钱包go-filecoin wallet addrs new导出节点钱包go-filecoin wallet export <address>导入其他钱包go-filecoin wallet import <wallet_file>2.4 获取FIL Mock代币FIL代币的获取一直是很多人关心的问题,这节我们详细来看看FIL代币的一些重点问题:FIL MockMock代表假数据、纯测试。 目前因为Filecoin处于公测阶段,这一阶段内,我们所能接触到的FIL代币基本都属于FIL Mock,不存在真实的Token权益价值,仅供测试使用,Filecoin正式上线前肯定将重新删档清零。大家不要频繁撸羊毛,无意义,且测试网机房资源部署不多,压力大,别添乱了。FIL 代币份额分布与职能FIL代币的份额一直是很多人关心的问题,目前的FIL的份额分配比如下:总数:20亿枚(估值25.7亿美金)投资人拥有量:10%第一批约5200万美金,成本:0.75美元/FIL第二批约2.05亿美金,成本:1-5美元/FIL协议实验室团队:15%基金会:5%矿工预留量:70%FIL Faucet (水龙头)FIL Faucet是一个代币水龙头,可以让一些早期参与的Filecoin节点用户提前获取一定数量的FIL代币参与市场活动:存储需求方:用户需要在他们的帐户中使用FIL来与矿工进行存储交易。矿工:使用FIL作为抵押品,参与挖矿。目前因为Filecoin处于公测阶段,这部分Token基本都属于FIL Mock代币,不存在真实的Token权益价值,仅供测试使用,Filecoin正式上线前肯定将重新删档清零。大家不要频繁撸羊毛了,无意义,且测试网机房资源部署不多,压力大,不稳定。小编推测,当Filecoin正式上线后,依然会存在FIL Faucet,届时会有一个更全面的发放策略且发放后的代币肯定具有真实Token价值,将从基金会(5%)或者团队(15%)的部分份额之中解锁。通过Faucet获取FIL可以使用两种方式,而且都比较简易方便,直奔主题。不像某些区块链项目,还需要帮忙转发扩散到推特、微博,等一些平台,验证回链后才能获取。首先,需要通过2.3节中的步骤获取到我们的钱包地址数据,形如:fcq3t…291)可视化表单访问:http://user.kittyhawk.wtf:9797,直接提交钱包地址表单即可:2)命令行发送Curl请求当然也可以直接在命令行内解决,更加高效,获取钱包地址,并赋值shell变量:export WALLET_ADDR=go-filecoin wallet addrs ls 通过curl的形式post钱包地址,请求表单数据,同时输出反馈值 Message_CID,方便遇到问题traceecho MESSAGE_CID=curl -X POST -F "target=${WALLET_ADDR}" "http://user.kittyhawk.wtf:9797/tap" | cut -d" " -f4过几分钟后,验证是否发放FIL Mock代币:go-filecoin wallet balance ${WALLET_ADDR}成功如下图所示,每个账户将拿到1000枚FIL Mock代币,且每隔24小时都能重新获取一次,不用担心不够用:至此,我们应该可以通过《【Filecoin源码仓库全解析】第二章:如何创建账户钱包,获取FIL Mock代币》的学习,了解并清楚Filecoin中钱包账户,FIL代币的概念和关系,并顺利获取到自己的FIL Mock代币,准备参与接下来的矿工挖矿和存储数据等操作了,期望帮正在电脑前研究Filecoin源码仓库的你,少走弯路!下一章,我们将介绍 《【Filecoin源码仓库全解析】第三章:存储提供方(矿工)的配置操作》参考文献get-fil-from-the-filecoin-faucet :https://github.com/filecoin-project/go-filecoin/wiki/Getting-Started#get-fil-from-the-filecoin-faucet本章赞助品牌:科极星球 坐标中国深圳,是国内第一批IPFS和Filecoin生态布道者。科极星球团队一直专注于研发、生产、销售基于IPFS的硬件设备以及IPFS生态应用,为IPFS生态体系的不同层次参与者提供包括矿机、矿场、托管、数据支持、应用开发、知识服务等在内的全方位立体化服务;目前已经部署北上广深港及周边多个矿场,并率先推出存储矿池CSPOOL,产品和服务已经覆盖包括日韩、欧美、东南亚在内全球各地。感谢 科极星球 对嘉乐SOHO的原创内容提供支持。联系作者:深夜写作,不免有不足之处,欢迎指正和更多讨论,可私信微信公众号:jialesoho,或者加我微信:daijiale6239,如果觉得对您有帮助,可以帮点击好看推广和打赏支持噢,感激不尽!(识别图中二维码,关注嘉乐SOHO微信公众号) ...

February 18, 2019 · 1 min · jiezi

【Filecoin源码仓库全解析】第一章:搭建Filecoin测试节点

2019.2.14 情人节,Filecoin项目开放了核心源码仓库go-filecoin,并更新了 filecoin-project organization下的诸多核心成果,这意味着,Filecoin已然度过了最困难的难点攻关期,进入到了全民公测阶段。本系列文章将协助大家对源码仓库进行全解析,帮助大家系统地学习和了解Filecoin这个项目,发现新的机遇和商机,小编将在这段时间密切关注Filecoin动态,和大家一起度过Filecoin全民公测阶段。章节目录前言Filecoin里程碑第一章:搭建Filecoin测试节点第二章:如何创建钱包,获取FIL Mock代币第三章:存储提供方(矿工)的配置操作第四章:存储需求方的配置操作第五章:如何让自己的节点加入测试网络第六章:如何组建多节点矿工集群(‘矿池’)第七章:如何参与复制证明游戏测试第八章:Filecoin Organization介绍MoreFilecoin 里程碑(万事开头难,一起追溯和回顾一下Filecoin的革命历程)2015年7月15日,Filecoin发布了第一版白皮书:《Filecoin: A Cryptocurrency Operated File Storage Network》2016年,Juan Benet首次对外发布Filecoin主题演讲,向大众宣告:IPFS准备添加一个名为Filecoin,基于区块链的货币层,以激励IPFS网络上的数据存储。2017年7月19号,Filecoin发布了第二版白皮书:《Filecoin: A Decentralized Storage Network》。2017年8月-9月,Filecoin发布了SAFT协议,开始在Coinlist上发起众筹,吸引来自50个国家的2100+投资人参与,成功募集2.57亿美金,并承诺于2022年之前完成此项目。2018年8月,Filecoin在Lab Day技术日,发布了Demo和测试网络模拟器演示,并向大众开放Github之上的filecoin-project organization。2019年2月14日,filecoin-project organization开源了核心源码库:go-filecoin,开启全民公测阶段。未来,更多期待…第一章 搭建Filecoin测试节点本章我们将一步一步,尝试在自己的macOS和Linux服务器上搭建Filecoin测试节点,小编的实战操作系统环境如下:Darwin daijialedeMBP.lan 17.4.0 Darwin Kernel Version 17.4.0: Sun Dec 17 09:19:54 PST 2017; root:xnu-4570.41.2~1/RELEASE_X86_64 x86_641.1 准备环境依赖在安装和配置go-filecoin的测试节点之前,需要做的准备工作比较繁多,相对复杂,因为小编机器采用的是macOS,将使用homebrew包管理器来安装语言环境。1.1.1 golang安装为啥安装就不解释了…# 需要安装大于v1.11.2版本的golangbrew install gogo version go1.11.2 darwin/amd64设置GOPATH,由于小编采用的是zsh,而非macOS自带的bash,所以环境变量设置在.zshrc中:vim ~/.zshrc编辑.zshrc,添加如下图所示内容:记得重启终端,新的环境变量GOPATH才会生效1.1.2 rust安装Filecoin的复制证明工程实现,基本都是使用rust编写的,为此,我们需要安装rust环境:# 需要安装大于v1.31.0版本的rust/Cargobrew install rustcrustc -Vrustc 1.32.0cargo -Vcargo 1.32.01.1.3 pkg-config安装处理编译go-filecoin产生的linker flagsbrew install pkg-config1.2 安装配置go-filecoin这里,将介绍两种release安装包的获得方式,一种是通过源码进行自编译,另一种是下载官方发布的release安装包,两种方式各有利弊,小编都实测了一下。1.2.1 自编译release安装包可以重构go-filecoin相关源码,定制自己专属的go-filecoin binary release包,方便大伙们来炫技、PR、以及装B。好处:可自定义的源码编译环节。坏处:编译准备环节比较复杂,需要较强的Debug和运维能力,同时编译耗时长,对机器CPU性能要求更高。下载go-filecoin源码仓库mkdir -p ${GOPATH}/src/github.com/filecoin-projectgit clone git@github.com:filecoin-project/go-filecoin.git ${GOPATH}/src/github.com/filecoin-project/go-filecoin熟悉go语言的朋友肯定不会陌生,源码路径习惯统一维护在${GOPATH}的src下,协议实验室也是提倡大家遵守这样的开发规范。检查并更新gcc/Clang版本go-filecoin在构建时需要引用到cgo-compatible rust-proofs library 证明依赖,因此需要c编译器支持,比较常见的c编译器工具有:gcc/clang,下面分别介绍两个工具的配置:ClangmacOS用户如果安装过xcode,默认应该是高版本的clang配置,小编机器的Clang配置如下:如图所示,Clang-902.0.39.1版本,是符合接下来的编译需求的。gccgcc需要v7.4.0的高版本支持,以及指定特殊系统变量$CCbrew install gcc-7export CC=gcc-7安装gx包管理工具gx需要单独介绍一下,这是一个很有意思的golang包管理工具,其管理的所有依赖库都存储于IPFS网络之中,由协议实验室的核心工程师whyrusleeping所创造,并灵活运用于协议实验室的各个代码库之中,而go-filecoin的依赖安装也离不开gx:go get -u github.com/whyrusleeping/gxgx version设置了GOPATH,gx是能被识别为全局环境变量的,否则无法进行后续依赖安装。安装依赖并编译源码cd ${GOPATH}/src/github.com/filecoin-project/go-filecoinFILECOIN_USE_PRECOMPILED_RUST_PROOFS=true go run ./build/.go deps提示:此过程比较漫长,小编机器跑了44分钟多,且CPU过热导致风扇不停,大家可以看一下自己机器的情况….构建、安装、测试自编译包洗了个澡、泡了杯茶,刷了会抖音…45分钟过去了:嗯…终于看到了安装并编译好的半成品…别急,release成品就快了:# 构建release包go run ./build/.go build# 安装go-filecoin至${GOPATH}/bin目录下go run ./build/.go install# 单元测试go run ./build/.go test1.2.2 获取官方release安装包如上图所示,可以在https://github.com/filecoin-project/go-filecoin/releases中直接下载官方于2019年2月11日发布的0.0.1版本,将安装包解压至{$gopath}/bin目录下。好处:绕过了复杂和漫长的源码编译环节。坏处:由于官方代码仓库在频繁更新,无法获取最新的代码包,实时性滞后。PS:好奇官方为啥不配置个自动化持续集成…我也是无语了1.3 验证安装经过1.2节操作后,全局运行go-filecoin -help,出现如下图菜单栏,说明节点已经成功安装。 1.4 初始化节点测试网络有多种类型:devnet-user 针对普通用户devnet-nightly 针对开发者用户我们在初始化的时候,可以按照需求,指定flag:go-filecoin init –devnet-user –genesisfile=http://user.kittyhawk.wtf:8020/genesis.car1.5 运行Filecoin节点如下图所示,完成初始化操作后,即可正式启动并运行我们的Filecoin测试节点了:go-filecoin daemonFilecoin发现节点的过程是遵循着gossip协议,逐渐向外发散,我们可以通过go-filecoin swarm peers 来查看所连接对等方的信息和过程。PS: 存在一些网络连接的错误日志,看来NAT的问题依然存在,测试网并未在libp2p上针对多层NAT进行方案解决升级。1.6 为节点定义专属昵称与IPFS不一样,Filecoin考虑到了以Qm..开头的冗长NodeID并不好记忆,这里加了一些比较人性化的设计,即,可以为自己的节点创建专属昵称(nickname),不过仅限字符串:#设置go-filecoin config heartbeat.nickname “jialesoho”#核对go-filecoin config heartbeat.nickname1.7 节点与网络的可视化监控设置节点心跳配置,与Filecoin网络监控建立连接:go-filecoin config heartbeat.beatTarget “/dns4/stats-infra.kittyhawk.wtf/tcp/8080/ipfs/QmUWmZnpZb6xFryNDeNU7KcJ1Af5oHy7fB9npU67sseEjR"如下图所示,登录可视化控制台,https://stats.kittyhawk.wtf/,可查看Filecoin测试网(devnet)状态以及个人节点信息:如图所示,刚刚我们自定义命名的Filecoin节点——jialesoho,已经被点亮在Filecoin的全网可视化监控面板中,除此之外,可视化控制台还有许多全网的交易数据,吞吐量,区块信息可供我们查阅和分析…至此,我们应该可以通过《【Filecoin源码仓库全解析】第一章:搭建Filecoin测试节点》的学习,顺利搭建并测试自己的Filecoin节点了,期望帮正在电脑前研究Filecoin源码仓库的你,少走弯路!下一章,我们将介绍《【Filecoin源码仓库全解析】第二章:如何创建个人钱包,获取FIL Mock代币》参考文献:go-filecoin | github本系列文章赞助合作招募:本系列文章预计10+篇,欢迎感兴趣的朋友参与,同时将开放赞助渠道,你们的赞助和打赏是支持我业余时间持续写作的动力,我也将尽自己所能,最大化地为阅读者和相关创业公司品牌带来帮助和权益, 具体如下:品牌和赞助商所享受权益文尾品牌Logo展示一条品牌的推荐语公众号文章转载权限为平衡用户体验,每篇仅限1家个人知乎、公众号、简书、头条号等多渠道投放参与方式私信我即可,联系方式已在上方联系读者处给出。示例星鉴网 是一家专注于IPFS生态的垂直媒体,集信息传播,技术推广,应用孵化于一身;感谢星鉴网(ipfsfirst.com)对嘉乐SOHO原创内容的支持。联系作者:深夜写作,不免有不足之处,欢迎指正和更多讨论,可私信微信公众号:jialesoho,或者加我微信:daijiale6239,如果觉得对您有帮助,可以帮点击好看推广和打赏支持噢,感激不尽! ...

February 18, 2019 · 1 min · jiezi

Golang 实现凯撒密码

一.凯撒密码加密代码思路基本思路:设置明文 和 位移步长(秘钥)将明文转成小写,准备 明文字节切片 与 密文切片循环将每个明文字符 按照 位移步长 做位移,存入密文切片返回密文导入包import ( “fmt” “strings” // 包含字符串操作相关方法)凯撒密码加密代码//一、凯撒密码加密func caesarEn(strRaw string, step byte) string { //1.明文 转成 小写 str_raw := strings.ToLower(strRaw) //2.位移步长 step_move := step //3.将字符串 转为 明文字符切片 str_slice_src := []byte(str_raw) fmt.Println(“明文字符切片:”, str_slice_src) //4. 创建 密文字符切片 str_slice_dst := str_slice_src //5.循环明文切片 for i := 0; i < len(str_slice_src); i++ { //6.如果当前循环的明文字符 在位移 范围内,则直接 加上 位移步长 存入 密文字符切片 if str_slice_src[i] < 123-step_move { str_slice_dst[i] = str_slice_src[i] + step_move } else { //7.如果 明文字符 超出 范围,则 位移后 步长再减去 26 str_slice_dst[i] = str_slice_src[i] + step_move - 26 } } //8.输出结果 fmt.Println(“加密结果为:”, step_move, str_slice_dst, string(str_slice_dst)) return string(str_slice_dst)}二.凯撒密码解密代码思路基本思路:设置密文 和 位移步长准备 密文字符切片 与 明文字符切片循环将每个 密文字符 按照位移步长 做位移,存入明文切片返回明文凯撒密码解密代码//二、凯撒密码解密func caesarDe(strCipher string, step byte) string { //1.明文 转成 小写 str_cipher := strings.ToLower(strCipher) //2.位移步长 step_move := step //3.将字符串 转为 明文字符切片 str_slice_src := []byte(str_cipher) fmt.Println(“密文字符切片:”, str_slice_src) //4. 创建 密文字符切片 str_slice_dst := str_slice_src //5.循环明文切片 for i := 0; i < len(str_slice_src); i++ { //6.如果当前循环的明文字符 在位移 范围内,则直接 加上 位移步长 存入 密文字符切片 if str_slice_src[i] >= 97+step_move { str_slice_dst[i] = str_slice_src[i] - step_move } else { //7.如果 明文字符 超出 范围,则 位移后 步长再减去 26 str_slice_dst[i] = str_slice_src[i] + 26 - step_move } } //8.输出结果 fmt.Println(“解密结果为:”, step_move, str_slice_dst, string(str_slice_dst)) return string(str_slice_dst)} ...

February 15, 2019 · 1 min · jiezi

2019年第一份DApp调查报告出炉

原文链接:https://medium.com/fluence-ne…文章内容有部分删改2017 年的 ICO 狂潮催生出了一系列新的区块链平台,2018 年也因此被称为 DApp 元年。CryptoKitties的大获成功,使得人们越发期待会有其他DApp能同样呈现出爆发式增长。我们一直都很好奇 DApp 市场上都发生了什么。这项调查从一开始就是为了联系 DApp 开发者社区以便深入了解这个市场正在发生的事情。我们向众多 DApp 开发者和创业者发起问卷调查,希望能通过这项调查来澄清有关 DApp 的事实、猜测和谣言。我们将阐明他们是谁、他们正在做什么、他们将要面临什么样的挑战、在当前市场上有多少活跃的 DApp 项目,以及实现这些 DApp 究竟有多难。要点:尽管 2018 年市场环境恶劣,受调查的大多数项目却都是在这一年启动的。在受调查的项目中有四分之一都是游戏相关的 DApp。大约有一半的项目采用了集中式云服务作为后端,并使用了像 Infura 这样的集中式工具来连接以太坊区块链。在交易过程中收取交易费用是大多数项目采取的主要盈利模式。有超过四分之三的受访者认为,引导新用户是影响用户采用的主要障碍。这份调查报告的结构和产品开发的生命周期类似。从技术平台的选择开始介绍,然后进入到开发中的常见问题,最后再讨论在用户接受度和业务方面所遇到的挑战。一般信息DApp 定义首先,我们需要确定哪些项目可以被称为 DApp。“DApp“ 一词来源于以太坊社区,可以用来定义任何以“智能合约“为核心组件的应用程序。为了减少歧义,该报告中所指的 DApp 仅指那些关注最终用户的应用程序。基于该定义,我们共收集到了 1624 款 DApp。在这些应用程序中,我们只找到了其中 900 款应用的联系信息,包括 Email、Telegram 或 Discord 。最终,共有 160 款 DApp 的代表填写了调查问卷。DApp 调查综述尽管 2018 年的市场环境相当恶劣,但大多数项目(72%)都是在这一年启动的。其中有 12.5% 的受调查项目由独立开发者运营。大多数 DApp 团队成员规模在 2 至 5 人之间(47.5%),团队成员规模超过 5 名的占 40%。DApp 组成平台(Layer 1 区块链)大多数 DApp 采用以太坊平台(87%),排名第二的是 EOS(19%),第三名是 TRON(8%)。还有 10% 的受调查项目同时构建在多区块链之上,虽然我们对采用了其他区块链的 DApp 非常好奇,但并不能准确的统计出这些项目的数量。整体技术栈大多数 DApp 都是基于网页作为前端,在受调查项目中,有近一半(48%)的 DApp 采用了传统基于云的后端技术方案。值得注意的是,在选择存储方案方面,采用了去中心化存储方案(比如 IPFS)的项目数量(32%)和采用中心化 CDN 的项目数量(31%)几乎相同。在数据库的选型方面也发现了类似的比例:31% 的 DApp 依赖于集中式数据库,而 25% 的 DApp 采用了分布式数据库。从所使用的技术来看,React 和 Node.js 的采用量遥遥领先,远远超过其他语言和框架。被提及的数据库包括 MongoDB、PostgreSQL 和 MySQL ,其中被提到最多的是 MongoDB。技术栈的集中式部分超过一半的受访者都提到,他们在开发去中心化项目时,有些基础设施必须采取集中式设计。48% 的受调查项目依赖于集中式后端,31% 的项目采取了集中式的文件存储,以及 21% 的项目采用了身份验证 API。DApp 开发 工具质量和文档通常来说,新的开发者加入对促进新技术的采用是至关重要的。与此同时,DApp 的开发者也提到,在去中心化的技术生态中工具和框架都是极不稳定的,它们可能彼此不兼容、缺乏项目文档,有时候它们的运行结果也是不可预知的。“对于区块链开发者来说,文档的缺失也是一个大问题。”—— CryptoKube区块链网络的状态在以太坊 DApp 开发者中,63% 的受访者提到 Infura 是他们连接以太坊网络的一种方式。一些开发者指出,有时候他们需要采用多种技术来连接到区块链,以保证 DApp 的数据状态和用户接口都是最新的。区块链的连接性问题和节点稳定性问题也是采用多种技术连接到区块链的原因之一,这些问题将影响 DApp 的整体质量,并对最终用户体验产生负面影响。事件追踪和数据查询受访者表示,从区块链中检索数据也将是一项挑战,尤其是当项目要求具备实时处理性能时。一些开发者采用了内部工具来追踪智能合约中的事件和处理传入的数据。“处理大量 RPC 请求通常是最令人沮丧的。现在主要采用内部负载均衡来解决这个问题。” —— Local Ethereum“当前维护数据库事件是最令人头疼的。我认为应该采用一种现收现付(pay-as-you-go)的服务来解决这类问题。” —— Known Origin“有时网络中的节点非常不稳定(特别是在一年半之前我们遇到了宕机问题),我们需要开发自己的中间件来追踪交易。” —— AliceDApp 的业务问题 应用的受众虽然可以通过收集发送到智能合约的交易来获取用户信息,但并不是每一次用户和应用的交互都涉及到智能合约调用。由于我们认为开发者能够通过内部分析工具获得准确的用户数量信息,因此我们直接向他们询问了 DApp 的用户数量。尽管有 58% 的 DApp 日活跃用户少于 50 人,但仍然有 12% 的受调查项目日活跃用户在 500 人以上。资金情况从 2017 年以来,DApp 的主要收入来自于自筹资金(38%)和代币的销售(31%),风险投资参与的项目仅占了 24%。2018 年,大部分去中心化项目仍然是自筹资金,只有一小部分项目通过代币销售(10%)和风险投资(16%)获得资金。然而,从数字的绝对值来看,这些差别并不明显:代币的销售数据略有下降,而风险投资的数据略有增加。2017 年和 2018 年最大的不同在于,自筹资金的 DApp 数量有了近 4 倍的增长。货币化大多数的受访者(55%)表示希望通过收取交易费用来赚钱。还有一些受访者表示计划通过用户订阅(16%)和广告(11%)收益来赚钱。另外,还有一些受访者建议出售 NFT 或者将以太坊作为潜在的货币化模型。还有其他一些人提到的其他商业模式如下:“部署代币作,作为桌面客户端使用许可,从通过我们的 DApp 获利的用户那里收取许可费用。” —— Kryptium“发布一款基于 ERC-20 标准的代币,比如 Augur 或者 KEEP,然后随着时间的推移,他的价值会得到升值。我们可以动态改变代币机制,并设置独立的实体来提供集中式的服务,从而增加收入。但是在这个过程中,最重要的组织服务应该还是免费的,不收取任何费用。“ —— 佚名用户体验 用户引导当被问起在推广 DApp 时遇到的挑战时,开发人员提到新用户引导是他们最担心的问题,因为接受加密应用程序的用户群体数量是有限的。向新接触 DApp 的用户解释这些概念很难,比如:创建钱包、获得代币以及什么是 gas。“应用程序新用户也不知道他们该设置多少 gas 比较合适。” —— Riot Cats“新用户引导。只要钱包已经被设置好了,并且手里有一定的以太币,那么接下来的事情就比较容易理解了。” —— Crypto Care“如果对于开发者来说创建钱包都觉得很复杂的话,那么我们又怎么能期待一个非技术人员愿意采用用户体验很糟糕的加密产品呢?” —— FundRequest一些基于以太坊区块链开发 DApp 的开发者表示,MetaMask 的用户体验需要得到进一步改善。其中的一个原因就是:单独对每一笔交易进行签名会导致过多的问题,特别是对于那些复杂一点的应用程序来说。“对于简单的单页游戏来说,MetaMask 表现良好。但是像“赤壁战士 (Chibi Fighters)“这样的复杂游戏,可以支持同时开十个网页,这使得它在各个地方风靡。” —— Chibi Fighters“每一笔交易都需要在 MetaMask 中签名。” —— FABG理解 DApp 和加密技术一些受访者也提到了另一个问题:他们需要去教育那些对密码学没有深入研究的用户。在调查报告中体现的问题之一就是,用户总是对加密应用程序中没有 “修改密码” 选项感到很吃惊。另一个问题是,用户总是不能够理解加密货币、ERC20 代币和非同质代币的区别。“我们没有预料到的一件事情是,我们还需要帮助人们理解 CryptoKitties 不是一种加密货币。” —— CryptoKitties“我们并没有存储用户的密码,因此我们无法帮助用户重置他们的账户。” —— Primas技术要点 可扩展性为了解决可扩展性问题,大多数受调查项目的开发人员计划使用 Layer 2 区块链或者其他相应的解决方案来处理用户增长所带来的问题。然而,仍然有 33% 的 DApp 开发者对于如何扩展持续增长的容量没有明确的计划。39% 的受访者计划使用现有的 Layer 2 区块链平台,27% 的受访者表示他们将构建自己的区块链平台。去中心化受访者对采用分布式计算和存储平台作为构建块来实现未来可伸缩性持乐观态度。然而,还有大约四分之一的开发者计划采用集中式的硬件设备进行密集计算。尽管如此,32% 的受访者表示,他们可能会在未来使用分布式数据库服务作为主要的数据存储解决方案,另外有 33% 的受访者表示他们正在考虑采用分布式的文件存储方案。总结在区块链生态体系中,人们普遍认为可扩展性是基于区块链应用程序首要面临的主要障碍。相反,DApp 开发者回应说,他们目前遇到的最大痛点是“有限的用户数量“(占 67%)和“用户体验差“(占 44%)。尽管只有 36% 的受访者提到了可扩展性可能带来的限制,但一旦项目拥有了更多的用户,可扩展性最终将会成为优先考虑的问题。我们相信以下这些有助于减少 DApp 和用户之间的摩擦:Web 浏览器和加密钱包之间更深层次的集成。这样的集成可能是双向的:浏览器与加密钱包的集成(比如 Opera 浏览器 正在这么做)以及在加密钱包中集成去中心化浏览器(参见以太坊的 Status 和 Trust Wallet,以及 EOS 的 Token Pocket、Math Wallet 和 Lynx)。一些新兴的可重用跨平台认证和用户引导工具,为用户提供了更好的移动端、网页端和桌面端交互体验(比如 Scatter 和 UniversallLogin)。被广泛采用的解决方案为最终用户消除 Gas 成本(比如 Loom network、Meta transaction)。我们热切期待着 2019 年 DApp 的发展。作为区块链领域的一个基础设施类项目,我们也一直在关注着 DApp 整个生态系统,并尽力与之保持联系。在未来的一年内,我们将尽可能为我们的研究提出更多的见解。你有哪些感兴趣的DApp?欢迎留言回复下一次讨论的,也许就是它。 ...

February 14, 2019 · 2 min · jiezi

Nervos 双周报第 3 期:佛系新年之后的开工大吉!

今年的朋友圈突然变得不那么活跃了?大家是否开始过上了佛系新年,不再是好友相聚胡吃海玩,而是安静地懒在家中陪伴家人看春晚?除夕之夜,公司大群「杭州七院」下起了红包雨,伴随着红包雨,大家一起看完了春晚,现在翻翻当时的聊天内容,竟是春晚节目播报、春晚节目评价和各路人马的红包,这是一个什么样的佛系公司?开工第一天,收到来自 Jan 亲手奉上的大红包,我司的红包都是有特色的红包,来看这张图(达成共识)打造共同知识库,Nervos 团队全速前进!听说我们的 Dev Meetup 从 3 月份就正常开始了呢?讲师和内容已在筹备中了,小伙伴们可以安排自己的时间啦 ~ 也欢迎更多区块链的讲师推荐或自荐哦!以下进入正题,最近两周 Nervos 发生了什么?Nervos 社区动态Scaling Bitcoin MeetupNervos 在旧金山举办以「共识和优化 Layer 2」为主题的 Scaling Bitcoin Meetup 中,张韧(鲁汶大学 COSIC 实验室博士生 & Nervos 研究员)从「带宽利用率」这个角度清晰地分析了诸多共识协议的效率以及可行性,并在最后提出了 CKB 共识协议的设计思路,视频链接: https://www.youtube.com/watch...CKB-VM (肖雪洁大神的分享)CKB-VM 使用 RISC-V 指令集,上周由 CKB 开发工程师肖雪洁分享了 CKB-VM 的设计原理以及运作方式,并且解释了为什么 CKB-VM 选择了 RISC-V 而非 WASM 。这里推荐我们的视频链接:CKB-VM Walkthrough ,推荐配套阅读文章,更好了解 CKB-VM: An Introduction to CKB-VMFork It 4 :如约谈一谈「MimbleWimble」为何 MimbleWimble 如此受推崇?它解决了区块链的什么问题?张韧 (鲁汶大学 COSIC 实验室博士生 & Nervos 研究员)早在 2016 年就推荐了 MimbleWimble,这次邀请到他来做详细的介绍和对比分析。本期由 Terry 主持,Jan、 Daniel 1、Kevin 参与讨论,张韧将 MimbleWimble 拆分成了 Confidential Transaction、Coin Join、OWAS 三部分进行阐述,非常清(ying)晰(he),大概是 4 期节目中最 Hardcore 的一期!《区块链正在重塑法律》秘猿科技法务总监钱靖(最早系统了解和研究区块链技术的律师之一)受邀参加北京大学数字金融研究中心举办的数字金融 Workshop 第十讲,作为主讲嘉宾就《区块链正在重塑法律》做了主题演讲,目前已整理成文字稿件「区块链正在重塑法律(上)」和「区块链正在重塑法律(下)」,受到行业内疯狂转载和好评。文章中钱靖主要介绍了区块链技术对文明带来的重大变革;针对区块链与时间、空间、能量的基本问题给出了答案;就区块链和开源运动、密码学和加密经济学、智能合约、对赌协议、产业链条重组等方面提出了见解;针对区块链对宪法、民法、商法等各部门带来的思考做出了详细的分析;最后,就区块链未来在政治、经济、法律上做出了展望。Nervosfans & Nervosfans club每晚 8 点,Nervosfans 爱好者社区群主乐乐和小美加会和大家一起分享区块链专业知识。近两周主要从区块链的应用分析及随机性进行讨论学习,近期重点推荐文章「区块链在资产证券化中的应用」Nervos CKB 开发动态CKB v0.6.0 版本准备发布,此版本将实行 RFC0013 (去中心化的 CKB 挖矿协议的重要组成部分),同时新的 RPC local_node_info (64e41f6)将迭代旧的 local_node_id ,使得新节点返回到更好的节点地址新版本将实现 5 个重要重构:只完整验证当前主链上的块,以通过缓存提高验证性能通过配置文件实现 rocksdb 可配置服务停止处理程序可确保节点正常关闭使用新的 Merkle 证明提取 Merkle 树作为 Ctate新的 RFC 发布:占用容量增量率,是一个限制每个区块的容量占用的 RFC,间接地控制着网络的总占用能力和网络的容量增量RFC0003 的最新更新: 删除了 CKB-VM 中的原子操作支持,更多更详细的更新,可以查看Nervos CKB Development Update #4Nervos 的粉丝们近期好玩的推荐论坛上关于 Nervos 生态建设的讨论,Jan 提前透露诸多 CKB 设计的亮点:请点击Jan 在讨论中总结道:CKB 是一个非常抽象的系统。抽象的意思是,凡是我们认为可以在上层实现的逻辑,全部放到上层实现,保持底层的最小化。这样做的好处有两个:1. 底层足够小、足够简单,更容易保证安全;2. 上层开发者拥有更强大的编程模型,更多的选择,可以更好的应对自己的场景,不需要削足适履。 我们基于过去的底层和 DApp 开发经验做了这些考虑,未来也希望能从社区得到更多的反馈,帮助我们完善 CKB 的设计。被遗漏的好用推荐:我司工程师大大们的「酷炫键盘」,据说这种键盘叫「硬分叉人体功能学键盘」,深受喜爱!新年电影推荐《流浪地球》,终于有值得一看的国产科幻电影啦!特效有了好莱坞水平,自由主义者最担心的弘扬民族主义叙事的色彩并没有很浓烈。可以确认会让很多投资者看到中国人也能做科幻片了。国产片的理想之作,国产科幻片的先行者,未来可期!Nervos 活动预告2 月 23 日,Nervos Co-founder Jan 将参加在 Boston 举办的活动: HBS Blockchain & Crypto Conference2 月 23 日,Nervos Co-founder Daniel 受邀参加由碳链价值主办的 2019 年首次线下活动「碳话」:主题为「论区块链共识机制」关注我们Nervos 官网:https://www.nervos.orgNervos 论坛:https://talk.nervos.orgCommunity blogs: https://medium.com/nervosnetworkTwitter: https://twitter.com/nervosnet...Reddit: https://www.reddit.com/r/Nerv...Telegram: http://t.me/nervosnetworkGithub: https://github.com/nervosnetwork这是 Nervos 双周报的第 3 期,如有任何建议或者想法,欢迎大家来 Nervos Talk 讨论留言哦! ...

February 14, 2019 · 1 min · jiezi

DAppDiscover | 盘点2018年度十大DAPP

作者:DD君欢迎添加作者微信 btcbtc555 与他进行交流!未经授权禁止转载!2018年可以说是DApp爆发的元年,这一年出现了好几款现象级DApp。有曾经让以太坊严重拥堵的CryptoKitties(加密猫),有史上最大的资金盘游戏Fomo 3D,还有区块链房地产EOS Pixel Master(像素大师)——一个像素最高价达到了4483.87EOS(折合人民币17万多)!当然,除了资金盘游戏之外,也出现了像EOS Knights、加密英雄这样,制作精良、质量上成、高可玩性的区块链游戏。DAppDiscover团队从2000多个DApp中筛选出了2018年度十大DApp,综合考虑了它们的影响力、可玩性和游戏设计三个方面,一起来看一看吧!10. 波场虾农影响力:3.5分可玩性:3.5分游戏设计:3.0分平台 :TRON发布时间 :2018-12-14网址:https://tronshrimp.farm/波场虾农属于养殖类游戏。逻辑就是买蛋,孵蛋,生蛋,卖蛋。“蛋"可以无限孵化,但相应价格会越来越低。这是波场第一款爆款游戏,上线后一举创下波场 DAPP 日活记录,达到 3 万 DAU。但此款游戏严重抄袭游戏以太虾农,二者连UI都相差无几。9.PoWH 3D影响力:3.5分可玩性:3.5分游戏设计:3.5分平台 :ETH发布时间 :2018-02-26网址 :https://powh.io/PoWH 3D同样属于资金盘类游戏。玩这个游戏须先购买虚拟代币,购买代币需要交10%手续费。持有虚拟代币后,会收到分红,这个分红比例则根据游戏每日产生的收益,按照你持有代币的量分配。该游戏利用新玩家的钱来向老玩家支付利息和短期回报,以制造赚钱的假象,进而骗取更多的玩家入场,属于典型的庞氏骗局游戏。8. CryptoCountries影响力:3.5分可玩性:4.5分游戏设计:3.5分平台 :ETH发布时间 :2018-02-01网址 :https://cryptocountries.io/《CryptoCountries》是一款基于以太坊的卡牌类游戏。游戏主要玩法就是将每个国家在区块链上做成类似虚拟代币一样的token,玩家通过购买这些token来“征服”这个国家。“征服”后,你的名字将写在国家的token上。这款游戏的本质就是击鼓传花。该游戏中玩家拥有一个国家的所有权后,如若其他玩家要想获得,需支付更高的价格。由于宣传噱头到位,2018年春节前后的一周时间里,它创造了4.5万ETH的交易流水。7. BetDice影响力:4.0分可玩性:4.5分游戏设计:3.5分平台 :EOS发布时间 :2018-09-21网址:https://betdice.one/BetDice是一款掷骰子游戏,玩法简单,只要玩家投出小于其设定的数字就获胜。前期的代币空投活动,以及后续的抽奖活动,使BetDice吸引了大量的用户,上线三周后累积成交量就超过3400万EOS。6. 以太水浒影响力:4.0分可玩性:4.5分游戏设计:4.0分平台 :ETH发布时间 :2018-02-17网址 :http://cryptohero.pro/《以太水浒》也是一款由区链块技术打造的水浒题材的策略卡牌类手机游戏,游戏中,每张卡牌都代表一位英雄,玩家可以进行自由的买卖,获得以太币的奖励。《以太水浒》是中国第一个国产DApp。该款游戏发行时刚好卡在击鼓传花类游戏高峰期,外加上打着中国第一旗号,它着实火了一把。尽管现在看这款游戏的方方面面做的都很差,但火爆时卡牌人物宋江曾被炒到50ETH+。5. EOS Pixel Master影响力:4.0分可玩性:4.5分游戏设计:4.5分平台 :EOS发布时间 :2018-09-23网址:https://pixelmaster.io/EOS Pixel Master是EOS ASIA制作的一款EOS链上画板。主要就是在一块1000x1000像素的画布上作画,再使用 EOS 去购买相应位置上的像素。此款游戏同属于现象级DApp,上线9天之内吸金80万美元,并获BM点赞。4. 加密英雄影响力:4.5分可玩性:4.5分游戏设计:4.5分平台 :ETH发布时间 :2018-09-21网址 :https://www.mycryptoheroes.ne…加密英雄是由日本游戏公司double jump制作的,它是一款RPG游戏。此游戏使用了历史或者传说中的英雄人物作为原型。该游戏正式推出后,几天内就冲入ETH游戏榜单的第一名。游戏整体呈像素风格,UI设计和用户体验都还可以,在游戏DAPPs中的表现也可圈可点。3.CryptoKitties影响力:5分可玩性:4.5分游戏设计:4.5分平台 : ETH发布时间 :2017-11-23网址 :https://www.cryptokitties.co/《CryptoKitties》是一款由Axiom Zen开发的区块链宠物养成游戏。在游戏中,玩家使用以太币进行电子猫的购买、喂食、照料与交配等,但其最为核心是玩法是将以太坊区块链中的电子猫进行出售。该款游戏是以太坊上第一个现象级的区块链游戏,也是至今为止生命周期最长的游戏类DApp,创造了单日14000+日活跃地址记录(2017年12月09日),一度造成以太坊交易堵塞。2.Fomo 3D影响力:5分可玩性:4.5分游戏设计:5分平台 :ETH发布时间 :2018-07-05网址 :https://exitscam.meFomo 3D是一款典型的资金盘游戏。游戏玩法简单:只要你是最后一个出价的人,并且这个价格维持 24 小时,那么奖池里的所有以太坊都给你。它包括了:闪拍系统、分红系统、战队系统、排行榜系统和邀请系统,加强了游戏的可玩性。此游戏由于有最终Key购买者独占奖池的诱惑,玩家会主动向奖池持续注入ETH。第一轮游戏结束时,奖池金额高达10469.66ETH,轰动整个DApp圈。同时也是由于此款游戏的成功,后续引出了近百个仿品。1.EOS Knight影响力:5分可玩性:5分游戏设计:5分平台 :EOS发布时间 :2018-07-08网址 :http://eosknights.io/EOS Knights是一款由韩国BADA工作室开发的RPG游戏。玩家首先需要用EOS在游戏中购买英雄,然后通过打怪让英雄升级。玩家在打怪的过程中,获得系统奖励的宝物。玩家可以通过出售宝物,赚取EOS。该游戏从去年7月份上线到现在,日活交易量等都保持良性发展态势,是EOS游戏中的一股清流。小结复盘2018,我们不难发现去年火爆的DApp基本都属于博彩类,从狂热到崩塌,“戏里戏外"间人性的贪婪演绎的淋漓尽致。但狂热过后,伴随着的确是理性的回归。目前已有越来越多的正规游戏厂商开始关注DApp,准备着手进军这一领域。DappDiscover团队也由衷希望2019DApp领域呈现新气象。所有的游戏种类,该佩奇的都“佩奇”,而非仅仅是菠菜类的天下。你有哪些感兴趣的DApp?欢迎留言回复下一次讨论的,也许就是它。

February 12, 2019 · 1 min · jiezi

宜信 | 供应链金融+区块链双链合璧

区块链是什么区块链是一种按照时间顺序将数据块以特定的顺序相连的方式组合成的链式数据结构,其上存储了系统诞生以来所有交易的记录。区块链上的数据由全网节点共同维护并共同存储,同时以密码学方式保证区块数据不可篡改和不可伪造。所以区块链本质是一个分布式共享数据库。区块链让参与系统中的任意多个节点,通过密码学方法产生相关联数据块(即区块,block),每个数据块中都包含了一定时间内的系统全部信息交流的数据,并按照时间顺序将数据区块组合成一种链式数据结构。区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术在互联网时代的创新应用模式,是一种解决信任问题、降低信任成本的信息技术方案。区块链技术的应用,可以取缔传统的信任中介,颠覆传统上存在了几千年的中心化旧模式,在不需要中心化信任中介的情况下,解决陌生人之间的信任问题,大幅降低信任成本。名词解释分布式:相对于集中式而言,分布式是区块链的典型特征之一,对应的英文是Decentralized,完整的表达形式是不依赖与中心服务器(集群)、利用分布式的计算机资源进行计算的模式。共识机制:区块链系统中实现不同节点间建立信任、获取权益的数学算法。分布式数据库:一个可以在多个站点、不同地理位置或者多个机构组成的网络中分享的数据库。区块+链=历史+验证区块结构有两个非常重要的特点:每个区块的块头包含了前一区块的交易信息的哈希值,因此从创世区块到当前区块形成了链条;每个区块主体上的交易记录前一区块创建后、该区块创建前发生的所有价值交换活动;绝大多数情况下,新区块创建成功被加入到链中,该区块的数据记录则不可被改变或更改。区块链的特点去中心化区块链的分布式结构使得数据并不是记录和存储在中心化的电脑或主机上,而是让每一个参与数据交易的节点都记录并存储下所有的数据信息。为此,区块链系统采用了开源的、去中心化的协议来保证数据的完备记录和存储。区块链构建了一整套协议机制,让全网络的每个节点在参与记录数据的同时,也参与验证其他节点记录结果的正确性。只有当全网大部分节点(甚至所有节点)都确认记录的正确性时,该数据才会被写入区块。在区块链的分布式结构的网络系统中,参与记录的网络节点会实时更新并存放全网系统中的所有数据。因此,即使部分节点遭到攻击或破坏,也不会影响这个系统的数据更新和存储。不可伪造区块链记录原理需要所有参与记录的节点,来共同验证交易记录的正确性。由于所有节点都在记录全网的每一笔交易,因此,一旦出现某节点记录的信息与其他节点的不符,其他节点就不会承认该记录,该记录也就不会写入区块。不可篡改改变某一区块及区块内的交易信息几乎是不可能的。如果该区块被改变,那么之后的每一个区块都将被改变。因此试图篡改数据的人必须同时入侵至少全球参与记录的51%的节点并篡改数据。从技术上讲,这几乎是不可能的。数学加密每笔交易需要一个有效签名才会被存储在区块中。只有有效的数字秘钥才能生成有效签名。密钥是成对出现的,由一个私钥和一个公钥组成。其中,公钥是公开的,私钥仅限拥有者可见并使用,用于交易签名,以证明数字身份。区块链如何解决供应链金融痛点供应链金融是以核心客户为依托,以真实贸易背景为前提,运用自偿性贸易融资的方式,通过应收账款质押登记、第三方监管等专业手段封闭资金流或控制物权,对供应链上下游企业提供的综合性金融产品和服务。供应链金融的基础,又是供应链。供应链涉及信息流、资金流、物流和商流,天然是个多主体、多协作的业务模式。在这种情况下,要进行贸易融资,首先会遇到很多真实性的问题,比如交易的真实性,单据的真实性,这都需要多方确认,耗费大量的人力物力;其次,涉及的多主体,存在互联互通难的问题,例如每个主体用的供应链管理系统、企业资源管理系统,甚至是财务系统都有所不相同,导致对接难。就算对接上了,会由于数据格式、数据字典不统一,而导致信息共享很难。供应链金融还存在一些行业痛点:第一,如前所述,供应链上存在很多信息孤岛,企业间信息的不互通制约了很多融资信息的验证;第二,核心企业信用并不能有效传递,根据合同法,核心企业是跟一级供应商签订合同,但是一级供应商和二级供应商签订合同时并没有核心企业参与,并不能传递相关的核心企业的信用到多级供应商;第三,银行缺乏中小企业的可信数据。在现存的银行风控体系下,中小企业无法证实贸易关系的存在,难以获得银行资金。相对地,银行业无法渗透入供应链进行获客和放款;第四,融资难、融资贵现象突出,在目前赊销模式盛行的市场背景下,供应链上游的供应商往往存在较大资金缺口,然而没有核心企业的背书,他们难以获得银行的优质贷款;第五,结算并不能自动完成。现在很多约定结算没有自动完成,涉及多级供应商结算时,不确定性因素更多。因此,供应链金融需要数据穿透和信息共享,通过把资金流、信息流、物流,商流等融合在一起,来提升信息的真实性、信用的可传递和融资的高效率。基于区块链的供应链金融,通过区块链技术将各个相关方链入一个平台,通过多方记账确权数据存储,实现数据的横向共享,进而实现核心企业的信任传递。基于物权法、电子合同法和电子签名法的约束,借助核心企业信用额度,提升中小企业的融资效率,降低小微企业的融资成本,加速实现普惠金融。引入区块链带来哪些优势呢?第一,解决信息孤岛问题,多个利益相关方可以提前设定好规则,加速数据的互通和信息的共享;第二,根据物权法、电子合同法、电子签名法等,核心企业的应收账款凭证可以通过区块链转化为可流转、可融资的确权凭证,使得核心企业信用能沿着可信的贸易链路传递。基于相互的确权,整个凭证可以衍生出拆分、溯源等多种操作;第三,提供可信贸易数据,比如在区块链架构下提供线上化的基础合同、单证、支付等结构严密、完整的记录,提升了信息透明度,实现可穿透式的监管;第四,实现资本降本增效。核心企业信用传递后,中小企业可以使用核心企业的信贷授信额度,降低融资成本,提升融资效率;第五,实现合约智能清算。基于智能合约的自动清结算,减少人工干预,降低操作风险,保障回款安全。总而言之,从整个信息流转来看,从以前的信息孤岛变成现在全链条的信息打通,从传统的核心企业只能覆盖一级供应商,变成能够覆盖多级供应商。基于加密数据的交易确权、基于存证的交易真实证明、基于共享账本的信任传递和基于智能合约的合约执行,形成回款封闭可控、穿透式监管、全链条数据打通的新生态,主要是有助于中小微企业解决“融资难,融资贵”的难题。区块链应用案例-大大买钢网解决方案翼启云服构建的Blockworm Baas(blockchain as a service)平台,是提供区块链服务的云平台,可以帮助用户快速构建区块链基础设施,将业务数据上链。翼启云服以区块链上的数据为依托,为供应链上下游的中小企业提供金融服务。平台采用区块链多链结构,B2B平台、供货商、采购方、仓储机构、物流机构作为数据录入节点,将供应链中的信息流、商流、物流数据存储在区块链上。首先,区块链打通了各个参与方的信息系统,提供了可信的协作环境,提高了交易协作的效率。其次,多个参与方基于交易本身协作,共同见证了交易的过程,为交易的真实性提供保障。最后,金融机构作为授信方和资金提供方,基于可信的数据源,利用数据分析等手段,为企业进行授信,放款。简化了融资流程,提高了融资效率,降低了融资成本。以下为钢铁B2B电商大大买钢在Blockworm平台利用区块链进行业务数据记录的案例。各方交易从订单生成的时刻起,包括仓储、物流过程中的关键节点都进行数据记录,数据存储在交易链上,整个交易可进行溯源,并根据各方信息交叉验证,防止虚假交易,保障交易真实性。图1. 交易全过程关键节点记录在交易链上具体流程为:大大买钢网的新增订单的信息被记录在区块链上;大大买钢变更订单状态为待出库;第三方仓储在链上发现待出库订单,对货品进行出库操作,并标记订单状态为已出库;承接货品运输工作的第三方物流公司开始运送货物,并更新订单状态为运输中;下游买家收到货物,将订单状态标记为已签收。所有交易中产生的应收账款、票据等可以作为融资标的,登记在资产链上,形成数字资产,此过程被称为资产数字化,这些数字资产本质是供应链中企业的债权。资产链记录所有资产的融资过程。部分过程可由链上的智能合约自动执行,节省人力成本。图2.融资链记录融资资产产生的过程同时,在交易链中,数字化资产可以进行拆分,做为债权(或资本)向上游供货商进行采购,这样依托于核心企业的信用,就可以传递到整个供应链中,为供应链中的中小企业增信。图3.融资资产可以在链上进行流转整合图(1) – 图(3), 最终就会演变成多链的模式(图(4)), 首先各个交易链提供资产的真实性溯源,中间是资产链,需要进行融资的资产都可以登记到资产链中,金融机构基于资产链,对资产的真实性进行溯源,评估风险,进行有针对性的金融服务。图4.多链结构,交易链为资产链上的融资资产增信宜信技术学院 作者:于明扬

February 12, 2019 · 1 min · jiezi

区块链基础知识

区块链技术基础什么是区块链技术?运行区块链客户端的计算节点彼此可以相互通信。每个节点维护一个账本。每个节点的收支记录都会广播给其他节点。筛选出一个节点作为一段时间的总记录。其它节点接收该被选中的节点的记录,和自己账本对照后,没有问题则进行存储。被选中的节点会因为这段时间付出的劳动而获得一定的报酬。节点通过非对称加密的公钥来表示身份,通过加密来传递数据。区块链的组成模块区块链账本。区块链账本用来记录数据,区块分为区块头和区块体,区块头会存储上一个区块的哈希值,这样各个区块就串联起来,区块头通过梅克尔根关联记录的交易事务。如果修改链中的某个数据块,则会导致该数据块无法链入区块链账本,在其它节点中验证时会被发现,所以区块链账本可以防止对数据的篡改。共识机制。一种筛选算法,可以选出特定的节点,该节点会作为大家对账的参考。密码算法。其中包括,计算区块hash值得算法,计算区块中交易事务的hash值和梅克尔根的算法,创建账户、签名交易的算法等。脚本系统。脚本系统驱动着节点收发数据,通过实现不同功能的脚本来实现不同的业务。网络路由。在由这些节点组成的网络中,没有固定节点路由服务器,所以每个节点都起到了路由服务者和使用者的角色,通过路由进行数据的交换。什么是挖矿挖矿就是竞争获得区块的打包权,通过计算打包获得报酬。 什么是难度值?难度值描述了获得打包权的门槛,计算所得结果要小于该难度值才有机会获得打包权,每段时间整个系统会更新难度值,保持10分钟就能计算出一个区块的速度。 初始难度值很大,很容易竞争获得,如下是0号区块链的难度值:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF值越大越容易满足,随着计算能力提升,为了保持每10分钟创建一个区块的速度,值会逐渐减小,也越来越难满足。初始难度值表述信息如下,bits是上述值的压缩值,可以通过0x00FFFF2^(8(0x1D-3)恢复上述值(近似值)。将0号区块的难度作为1,当前difficulty为初始难度值除以当前难度值:“nonce”: 2083236893, “bits”: “1d00ffff”, “difficulty”: 1如何获得打包权? 每笔交易都会通过广播的形式发送给其它节点,所以计算节点会拉取一段时间内缓存的交易记录,然后采用如下公式计算:SHA256(SHA256(version + prev_ hash + merkle_ root + ntime + nbits + nonce)) < TARGET如果计算出的值小于TARGET,也就是目标难度值,就算成功了。参数解释如下:名称含义描述version区块的版本号固定值prev_hash前一个区块的hash值固定值merkle_root准备打包的交易事务hash树的根值,也就是梅克尔根值可变的,由获取的交易事务决定的,获取交易事务也是有一定优先级规则的,比如根据手续费大小ntime区块时间戳要大于前11个区块的平均时间戳,不得超过当前网络时间2个小时,可能小于前一个区块的时间戳nbits当前难度值固定值nonce随机数0~2^32的数值想要小于目标难度值,需要不断的尝试各种参数组合,这个过程消耗大量计算资源。一旦计算成功,就会广播新的区块,其它客户端验证通过后会写到自己的区块链账本中。什么是挖矿?当获得打包权后,整个区块链系统会给予该客户端账户一定的奖励,这个奖励就是打包的交易事务的第一条记录,这个奖励相当于发行新的货币。整个比特币的数目是有限的,每隔4年奖励的比特币减半,真到2140年所有的比特币将被挖完,到时挖矿的收入来源为交易的手续费。 多个节点符合条件这么办?如果同时多个节点计算出符合条件的区块,则会一起广播,最后传播最广,处于最长链中的区块将会被保留。比特币地址如何生成随机数生成器产生一个随机数作为私钥。私钥作为参数,用SECP256K1算法生成公钥,SECP256K1算法是一种椭圆曲线算法。但是无法从公钥计算出私钥。计算公钥哈希值。通过SHA256和RIPEMD160计算公钥的哈希值,确保数值的唯一性。将地址版本号连接到公钥哈希值,比特网主版本号为0x00,然后两次SHA256取得前四个字节作为校验值。将版本号+公钥哈希值+校验值连接起来,进行BASE58编码,最后得到比特币地址。比特币如何验证一个交易SPV钱包的验证过程:下载完整的区块链头数据,头数据中包含梅克尔根。计算出想要验证交易的哈希值。根据哈希值找到对应的区块头。获取计算梅克尔根所需要的哈希值。计算梅克尔根。对照梅克尔根是否正确。根据所在区块高度位置,可以确定该交易得到了多少确认。比特币如何管理交易记录比特币中交易事务的模型为UTXO(Unspent Transaction Output),未花费事务输出。用户拥有的UTXO相当于他的资产,UTXO只记录用户获得的比特币,一个未花费事务输出只能被使用一次。一笔交易分为输入和输出。在A转10个比特币给B的事务中,整个模型运转如下:A账户有两个UTXO,分别是5个比特币和6个比特币。A找出自己名下满足10个比特币的UTXO,可以由多个未花费事务组成(5+6),这些UTXO作为输入。输出则是B获得10个比特币的UTXO,A获得1个比特币(找零)的UTXO。区块链技术的意义数据不可篡改。分布式存储,数据在多地存有备份。匿名性。通过地址来标识用户,而地址是通过公钥生成,所以仅仅通过该地址无法获取其背后的真实用户。价值专递。自成体系的信任机制,工作量表明比特币是有价值的,比特币可以在任何比特币节点传递。自动网络共识。一个交易被其它所有节点见证,自动的达成了共识。区块链的发展什么是合约?合约是大家行为的共同准则,少数人的不守约对整个系统不造成影响。 在比特币中,所有节点都遵循合约来处理每笔转账交易。比如A将100比特币转账给B,则A所在节点需要验证使用的UTXO是否属于A,并且保证里面有足够的钱给B,然后将该交易记录广播给其它所有节点,其它节点会验证A用作输入的UTXO是属于A的,且真实存在的(查看交易记录签名),并且这笔转账输入和输出是持平的,验证成功后才将该交易记录进区块链。如果部分节点没有按照上述过程转账和验证,但是整个系统最终会保证结果的正确。密码算法哈希计算哈希计算的特性:输入长度是任意长度输出是固定长度计算过程是有效率的哈希函数为了满足密码学上的安全性,需要满足如下条件:抗冲突。两个不同的输入产生了相同的输出,这就产生了冲突。为了满足安全性,哈希函数需要保证找出两个输出相同的输入是很困难的,需要付出很大的时间代价。信息隐藏。获得了哈希函数的输出,不能倒推出输入。难题友好性。在已知结果需要满足的条件下,很难找出输入满足该条件。常见的哈希算法:MD5,SHA1,SHA2,SHA3。 区块链中用到的哈希计算:区块链哈希。区块链中会对区块头进行哈希计算,得出该区块的哈希值。该哈希值会作为下一个区块的一部分被保存,所以该哈希值起到了一个指针的作用,将各个区块链接起来。这保证了每个区块被加入链后不可被修改。梅克尔树。梅克尔根用来验证区块中交易记录是否正确。比特币中的梅克尔根是一个二叉梅克尔树,首先对交易事务的哈希值两两结对计算出新的哈希值,然后将新的哈希值两两结对计算出下一个哈希值,依次递归,只到算出最后一个哈希值,从而构成了一个哈希树。梅克尔树可以验证交易记录的完整性。非对称加密算法常用的非对称加密算法:RSA。RSA算法的公钥和私钥是一对大质数,从公钥和密文恢复明文的难度等价于分解两个大质数之积,质数越大破解难度越大。但是计算速度较慢。椭圆曲线密码算法。安全性高、生成公钥方便,存储空间小。比特币中使用的是SECP256k1算法。编码解码算法ASCII编码。常用的字节编码。Base64编码。用64个字符来表示二进制文件,所以每3个字节被表示为4个字符,不足3个字节的补x00。Base58编码。去掉了Base64中一些容易混淆,如0,O,I,1和容易转义的+、/。Base58Check。在Base58的基础上加上了校验码,比特币在生成地址时最后就采用了Base58check,可以在接收到地址时进行校验,如果计算出的校验值和接收到的校验值不同,则认为数据无效。密码算法具体的应用生成账户地址。利用公钥生成地址和作为账号,用私钥验证账号。价值转移保卫。用私钥签名交易,他人用公钥验证交易是本人发出。用他人公钥加密交易数据,只有接受者才能解密数据。完整性证明。通过哈系数来校验区块数据。零知识证明。为了证明自己对某笔交易的所有权,只需要解码交易中部分内容,就能证明所有权,而不需要提交自己的密码来验证。共识算法FLP定理(信道可靠,节点失效)在网络可靠,存在节点失败的最小化异步模型中,不存在可以解决一致性问题的确定算法。CAP定理分布式计算不可能同时保证一致性、可用性和分区容错性。一致性。所有节点在同一时刻,所处状态相同。可用性。系统可以正常被访问。分区容错性。因为网络故障导致节点被划分为不可联通的几块,但系统仍能正常使用。两军问题(信道不可靠)A->B<-CA和C需要联合攻击B才能取得胜利,所以双方需要约定一个确定的时间发起进攻,两方的信使都需要经过B,所以信使可能被B截获。A发送消息给C,C需要发送确认告诉A消息到达,如果不发送确认,A同样会认为消息被B截获;同样,A收到C的确认后,同样需要发送确认消息给C,否则C会认为消息被B截获。如此往复,导致A和C无法达到最终的一致。 两军问题的关键点在于两点之间的信道传输不可靠。拜占庭将军问题(信道可靠,节点不失效,节点产生错误数据)N个将军通过传令兵传递消息,并且需要达成一致的计划,但是这N个将军中存在叛徒,会故意发送假的消息来扰乱计划。已经证明,如果背叛的将军超过了1/3,则不可能达成一致的计划。如何实现共识既然保证一致性存在上述问题,那么如何实现一套实际可用的的共识算法?激励机制:采用一定的激励机制,依据博弈论,每个节点会最大化自己的利益,最后大部分节点会依照规则行事。随机性:拜占庭问题是每个将军通过协调达到一致,如果有一个大将军做出最后决定,那么问题就会简单很多。在去中心化的系统中,如何选出这个“大将军”呢?根据计算力,PoW共识。根据资源,PoS共识。常用的共识算法:PoW。如,比特币。PoS。如,PeerCoin。DPoS。Paxos。如,ZooKeeper。PBFT。Raft。如,etcd。以下是对部分共识算法的简单介绍。Paxos算法Paxos算法解决的是非拜占庭问题,存在失败节点,但没有恶意节点。算法分为提案者、接收者。提案者发出提案,由接收者投票,超过半数则认为提案通过。在处理多个提案者、多个接收者场景的时候,采用了“两阶段提交”的方案:准备阶段解决对哪个提案做出表决,提交阶段确认提案是否通过。Raft算法该算法通过选出一个“大将军”角色的方式来解决一致性问题。容错数目为(n-1)/2。没有“大将军”时会发起选举,每个人进行投票,票数居多的成为“大将军”。出现平票时选举失败,每人被分配一个随机的睡眠时间,睡眠者只能投票,无法被选举。第一个醒的人会发起新一轮的选举。被选出的“大将军”和每个人保持心跳,一旦“大将军”失效,则需要进行新的选举。由“大将军”负责下发指令,村长收到上级指令后会向所有人发送指令,等接收到超过半数的反馈后,“大将军”向上级确认数据已经接收。“大将军”接收到上级的响应后,会通知所有人数据已提交。PBFT算法Pbft算法的基本流程主要有以下四步,f表示错误节点数目。容错数目为n/3。客户端发送请求给主节点。主节点为随机挑选出来的。主节点广播请求给其它节点,节点执行 pbft 算法的三阶段共识流程。节点处理完三阶段流程后,返回消息给客户端。客户端收到来自f+1个节点的相同消息后,代表共识已经正确完成。PBFT算法多应用于联盟链中,它达成共识的延时为秒级,基本满足商业要求。PoW工作量证明算法算法流程:向所有节点广播交易;每个节点收到交易信息并放入块中;每一轮,获得打包权的节点广播它保留的块;其它节点验证块中的交易无误后接收该区块;其它节点将接收的区块的哈希值放入他们创建的区块中,以表示承认该区块的正确性。节点以最长的链为合法的链。节点在收到一个他人的区块后可以选择拒绝,或者基于该区块继续挖矿。如果选择拒绝,则不得不自己计算出一个正确的区块,但是会导致该自己另起炉灶的链不会长于主流的链,所以自己构造的链不会得到承认;根据“不利原理”,节点会积极的接收其他人广播的区块,并且基于该区块接着挖矿。PoW的特点:完全去中心化;性能消耗高,效率低;达成共识的周期较长;1/2的容错率。PoS股权权益证明PoS不像PoW,任何人都可以参与产生区块,而是事前需要投入一些利益在区块链中,投入越多则越被信任。整个流程如下:加入PoS机制的成为持币人,成为验证者validator;根据持币的多少挑选一个给予打包区块的权利;如果没有在规定时间内计算出新的区块,则选择下一个节点给予打包权;打包成功后进行广播,被大家接受后可以获得一定的利息,这个利息通过持币数量和币龄决定,每次打包成功后,会清零币龄。DPoS委托权益人证明机制(Delegated Proof of Stake),在PoS的基础上进行了改造,每个持币人可以选出代表来代替自己计算、验证区块链,代表因此会收到一定的酬劳,代表可以主动退出、或被淘汰。该算法减少了参与节点的数量,减少了节点响应的时间,提高了交易效率。区块链遇到的问题区块扩容比特币的区块限制在1M,导致记录的交易数量很少,限制了比特币在大规模快速交易中的应用,所以提出了两种方案来解决这个问题:区块扩容。将区块大小设置的大一些。隔离见证。从区块中去掉见证交易合法性的签名。由于比特币是无中心化的,让所有节点进行改造是不可能的,并且这些节点的拥有者对改造的意见也不相同。所以节点的不同选择会导致整个链分叉,从而形成两种区块链。侧链为了让资产可以在不同区块链之间转移而提出了侧链的概念,主、侧链之间的转移步骤如下:在比特币主链上锁定一定的比特币,在侧链上激活对等的资产;侧链按照自己的游戏规则交易这些资产;相应的,侧链可以冻结相应的资产,将比特币归还到主链。闪电链为了加快交易速度,减少对主链的压力,提出了闪电网的概念。闪电网是在主链外开辟快速交易通道,临时记录一段时间的频繁交易,定期将最后结果提交到主链。区块链存在的问题分叉由于部分节点采用新版本的合约,而导致和老版本的节点不兼容,导致区块链分叉为老节点产生的区块链和新节点产生的区块链,如果一直保持这种状况,则会导致整个区块链分裂为两个系统,形成“各玩各的”局面。除了版本差异导致的分叉,还有可能是网络问题导致部分节点被孤立起来,从而这些被割裂的节点组成一个小的区块链系统,产生的区块链和主链也会产生较大差异。在某个时刻这部分节点重新加入主链,则整个系统需要耗费一些代价来弥合原来产生的分歧。51%算力如果一个人拥有了区块链超过一半的算力,他就拥有了大多数的打包权,那么他就可以在对交易打包时进行作弊,从而从中牟利。拥有算力优势的人还可以拒绝一些交易记录,使得一些交易长时间无法完成。如果拥有算力优势的人采用一些手段违反当初的约定,这会打击其他人挖矿的积极性,对整个区块链产生负面的影响。私钥丢失私钥丢失代表着在整个区块链中所拥有的财富丢失,目前还没有办法找回。交易确认延迟非所有的交易会被立刻打包进区块,一笔交易需要耗费一定的时间才能被计入区块链。交易被确认前是缓存在内存中的,打包区块需要时间进行计算,并且区块有大小限制,即使被打包进区块还要被大多数节点接受,所以一笔交易本最终确认周期较长。 有的节点会根据手续费来控制打包的顺序,所以普通的交易更难被打包进区块了。不断膨胀的区块链随着交易数量的日积月累,承载记账功能的区块链数据会越来越多,对这些数据的查询和存储会越来越困难。内容参考《白话区块链》

February 11, 2019 · 1 min · jiezi

去中心化预言机 DOS Network 白皮书正式发布!

各位区块链爱好者和 DOS Network 的支持者,感谢各位长期以来的支持和等待!我们非常高兴地宣布:DOS Network 项目白皮书已正式发布在官方网站:https://dos.network/为了保证项目设计的严谨性,团队经过几个月的努力,精心修改和整理的白皮书现在终于和大家见面了!我们在白皮书中对 DOS 预言机网络进行了详细的描述,深入分析了DOS的特性与功能,并具体介绍了 DOS 体系结构、技术细节、业务计划以及未来应用场景。下面简单介绍一下DOS预言机网络DOS预言机网络是什么?DOS网络是一个为多条主流区块链提供实时的链外数据输入以及可验证链外计算能力的一个去中心化预言机二层网络。它连接了链上智能合约与链外数据源和算力,赋能智能合约更多的应用场景。可支持各种主流区块链,如以太坊、EOS、TRON、ThunderCore 等。DOS预言机网络能解决什么问题?除了人们广泛讨论的公链性能问题之外,目前还存在两大阻碍智能合约和大规模商业去中心化应用落地的问题:问题1:去中心化应用往往需要与现实世界进行数据交互,但区块链无法直接获取链外真实世界的数据。 问题2:去中心化应用存在进行复杂运算的需求,但链上计算资源有限且昂贵,难以在链上实现复杂的运算。DOS网络的使命和价值在于解决以上提及的两个问题,作为一项基础设施,给智能合约和去中心化应用提供现实世界的数据和更多的链外计算能力,为区块链的落地和大规模应用铺路。DOS预言机网络架构我们将DOS预言机网络分为链上和链下两部分:链上部分: 由部署在支持的链上的系统合约和管理合约组成,主要包括对预言机请求的处理、对结果的验证、节点注册、代币抵押、节点状态监控,支付等功能。不同链上的开发者和智能合约可以通过链上系统合约提供的统一接口来请求预言机服务。链下部分: 由第三方用户(即节点运营者)运行的、实现了核心协议的客户端所组成的第二层分布式点对点网络。协议客户端包括几个重要模块:事件监听和链适配器、分布式随机数引擎、密码学和链下组内共识、请求/计算任务处理等,具体包含哪个模块取决于用户节点所提供的预言机服务类型。DOS预言机网络如何保证返回的数据没有被篡改?DOS 网络利用了可验证随机方程 (VRF) 和阈值密码学 (Threshold Cryptography) 來驱动安全、无法被预测、并且可验证的工作组的选取。不同的预言机请求将会被随机选中的工作组来处理,没有工作组或节点能提前预知自己会在何时处理来自哪儿、什么样的请求。选中的工作组中的节点获取数据,使用阈值密码学协同产生一个对数据完整性的证明。该证明随同数据结果以一条交易的方式发回链上系统合约并验证 - 恶意提交者会在验证过程中失败从而被监测以及惩罚。如何成为DOS预言机网络的节点?有什么好处?DOS网络是一个无需许可的分布式点对点网络。任何人在链上系统合约中抵押一定数量的网络通证后,都可以运行客户端协议软件加入DOS网络来赚取奖励。为了激励早期节点加入来快速启动DOS网络,节点除了赚取正常的预言机请求的服务费之外我们还引入了类似权益证明的挖矿机制,占总量 35% 的通证会被预留作为挖矿奖励。我们期望给感兴趣的、潜在的节点运行者们分发运行DOS节点所需要的绝大部分通证来吸引大量节点并且减轻它们的获取成本。同时为了公平、广泛的通证分发,以及运行一个DOS节点需要的通证数量、运行环境等更详细的信息会在未来公布。此外,节点运营者将会享有整个网络和生态系统的治理投票权。DOS预言机网络如何实现跨链数据调取?DOS网络的长期发展方向是成为支持多条主流公链的预言机网络,为区块链之间的跨链信息交互打开一扇大门。假设DOS网络同时向Ethereum和EOS提供数据传输预言机服务,那么理论上,Ethereum上的智能合约能够触发跨链状态变化,通过DOS客户端节点,调用EOS上的智能合约。因此,DOS网络在未来有潜力实现跨链智能合约数据调取。了解项目详情,请阅读 DOS Network 白皮书(英文版):https://docsend.com/view/ak3rdft项目中文简要介绍请访问官网:https://dos.network我们将会在 3 月份发布项目 Beta 版,请大家保持关注!如果你对项目感兴趣,欢迎添加小助手进入社区!如果你有意参与 DOS 白皮书翻译,也欢迎与小助手私聊~关于DOS NetworkDOS NETWORK 是一个实现了去中心化预言机的可扩展的二层网络,为主流区块链提供数据上链服务和计算力。它将区块链智能合约与真实世界的数据和事件连接起来,还为区块链提供可验证的计算能力,从而使更多应用场景能够在区块链上实现。可支持各种主流区块链,如 Ethereum、EOS、TRON、ThunderCore 等。

January 31, 2019 · 1 min · jiezi

以太坊合约的安全性弱点,你都绕开了吗 III

新年前,我们最后来谈一谈以太坊安全性的特点。不可能修改的bug当合约公开在区块链上之后,它就不能去修改了。相应的,合约中出现的任何 bug 也没有机会改正。如果希望能够修改bug,合约编写者就需要在编写合约的时候预留一些用来修改或终止合约的代码。但预留修改后门这一方式具有争议,因为在以太坊的愿景中,智能合约一旦部署,其设定就应当是不可更改的。正式因为 bug 不可修改,可能会导致一些很严重的攻击事件没有弥补的方法。DAO 攻击是唯一的例外。以太坊使用了一个硬分叉解决了这一问题。但这种做法没有得到整个社区的赞同,因为它违背了“代码即法则”这一准则。调用栈大小限制每次合约调用另一个合约的时候,调用栈就会增加一个 frame. 上限是 1024 个。当这一上限达到的时候,下一次调用会触发一个异常。如果攻击者先将自己的调用栈离填满只差一个 frame,然后去调用受害者合约的函数,那么受害者函数执行中任何调用将会导致执行失败。如果受害者函数没有正确的处理执行成功与否,将可能导致意料之外的结果。在文章后续部分,我们将以一个例子说明这一点。为了解决这一问题,在一次以太坊升级中,规定了每次通过 call 或 delegatecall 调用合约函数时,只能为被调用函数分配最多 63/64 的剩余 gas. 而以太坊中每个区块最多只能包含约 470 万的 gas。也就是说,如果调用者最初投入了数量为 a 的 gas, 在 10 层递归调用后,最内层的函数最多只有 (63/64)^10*a 的 gas. 因此,调用深度不可能超过 1024. 后面的攻击案例中,假设还没有这一修补方案。时间约束大量的应用使用时间约束来决定某些行为什么时候被允许。比如在一个 ERC 20 合约中,从某个时刻开始,允许用户使用 ether 购买一个 token.在智能合约的执行过程中,当前时间取自给定交易所在区块的区块时间戳。所以,一个区块中的所有交易在执行时使用的是相同的时间戳。这一设定保证了智能合约在每个矿工那里的执行结果是一致的。但这个设定也可能导致一些攻击,因为矿工在选择时间戳的时候有一定的自主权,这可能为一些攻击埋下了后门。GovernMental 合约的攻击GovernMental 是一个“庞氏骗局游戏”型合约。严格来说,其实不能叫骗啦,因为庞氏骗局的规则被公开地写在合约里。在这个合约中,每个人通过向合约中转一笔钱来加入这个庞氏骗局游戏。合约通过两个数组记录参与者的地址和每个参与者转入的钱的数量。如果最后一个人加入后 12 小时后都没有下一个人加入,那么最后一个人就可以获得全部的收益。(这个设定是不是有点像著名的 Fomo3D,值得注意的是,Fomo3D 的出现晚于这篇论文呦。)下面是一个简化版的 GovernMental 合约在这个合约中,参与者可以通过 invest() 函数来投入 ether 并加入这个游戏。合约维护一个名为 jackpot的变量,表示如果后续没有人加入,赢家将拿走多少 ether. 新来的参与者必须投入多于 jackpot 一半的 ether, 同时,新来的参与者投入的 ether 中,会有一半被加入 jackpot. 如果连续一分钟没有人新来的参与者,最后一个人获得 jackpot 中的 ether,同时合约拥有者拿走剩下的钱(留下 1 个 ether 作为下一轮的启动资金)。需要注意的是,这里并没有检查最后分钱的时候,通过 send() 函数进行的转账是否成功。这个简化版的合约有几个点可供被攻击。攻击一这个攻击来自合约拥有者自身,目的是让本来的游戏赢家无法拿到钱。合约拥有者利用 send() 函数的异常处理和调用栈大小限制进行攻击。攻击的方式是,通过预先进行大量的递归调用,导致执行 resetInvestment() 时,调用栈达到了大小上限,无法再执行给游戏赢家和合约拥有者的 send() 函数。合约拥有者和游戏赢家都拿不到钱,钱依然留在合约中,但之后重置合约状态的代码会照常执行。只要再进行一轮正常的游戏,合约拥有者就可以将本该属于上一轮游戏赢家的钱收入囊中。攻击二这一攻击方式来自矿工。矿工可以通过拒绝打包其他人与 GovernMental 合约的交易,来使自己希望的人成为合约游戏的赢家。更多地,进行攻击的矿工在打包区块时可以任意决定交易顺序,来影响这个区块过后谁是 lastInvestor.之前也提到过,每一个新参与者需要投入的 ether 数量不能低于合约中 jackpot 中 ether 数量的一半。而一个人在发起交易的时候看到的 jackpot 数值,与它的交易被执行时 jackpot 的数值可能是不一样的。这就导致这个人可能发起交易时以为自己投入的 ether 数量是符合要求的。但是执行时,由于 jackpot 数值的改变,变成了一笔无效交易。这就是上篇文章中提过的不可预测状态问题。另外,矿工拥有决定区块时间戳的权利。而合约在执行时,判定 resetInvestment 是否可以执行,就是读取矿工决定的区块时间戳。通过影响区块时间戳,也可以影响游戏结果。结语通过这几期对参考文献 [1] 的学习,我们看到了一些以太坊 Solidity 合约中设计的弱点。虽然这些弱点称不上是漏洞,但是如果在编写合约时,对这些点不了解,没有充分考虑,就可能写出有安全问题的合约出来。参考文献:[1] Atzei, Nicola, Massimo Bartoletti, and Tiziana Cimoli. “A survey of attacks on ethereum smart contracts (sok).” Principles of Security and Trust. Springer, Berlin, Heidelberg, 2017. 164-186.–Conflux 是致力于打造下一代高性能的 DAPP 公链平台欢迎关注我们的微信公众号:Conflux中文社区(Conflux-Chain)添加微信群管理员 Confluxgroup 回复“加群”加入 Conflux官方交流群 ...

January 31, 2019 · 1 min · jiezi

使用智能合约实现自动分账

自动分账是很多平台都会用到的支付功能。很多互联网内容售卖平台都会跟内容提供者分账。比如:Apple 的 App Store 跟 App 开发者三七分成。很多平台都使用了支付宝、微信支付作为支付手段,但是要同时实现给内容提供者分账,却是一件不太容易的事。使用 FIBOS 智能合约可以很容易实现这个需求。文中代码已在 GitHub 上开源。https://github.com/fengluo/fi…设计思路在 FIBOS 转账是通过 token 合约的extransfer方法来实现的。extransfer方法在执行的时候会给转账方账户和入账方账户发送通知。所以用户给平台方账户转账的时候,平台账户就会收到通知。所以整体业务逻辑如下: quantity: 10 FO memo: 内容提供者账户 quantity: 8 FO用户账户 ——————-> 平台账户 —————-> 内容提供者账户 extransfer 2/8 分成 extransfer用户给平台方账户转账,memo 中填写内容提供者的账户名。平台方的账户合约监听 extransfer 方法的通知,然后做出分账计算,给对应内容提供者的账户转账对应金额。整体逻辑很简单,整个合约代码逻辑差不多用20行就可以写完。编写合约FIBOS 的智能合约分为 ABI 文件和 JS 合约两部分。ABI 相当于合约接口,JS 合约则是功能实现。本案例目前没有接口设计需求,不过 ABI 文件还是合约不可缺少的部分。所以我们简单创建一下就好。我们先创建一个 contracts 文件夹,合约文件都会放在这里。然后在此文件夹下,创建 subaccount.abi 文件,内容为:{ “version”: “eosio::abi/1.0”}JS 合约部分也没有太复杂。在 contracts 文件夹下创建 subaccount.js 文件,代码为:exports.on_extransfer = (from, to, quantity, memo) => { // 需要在开头做一些判断 if (to === action.receiver && action.is_account(memo)) { const num = parseInt(quantity.quantity.split(’ ‘)[0]) // 假设我们约定平台方跟内容提供者是2/8分成。 const subnum = (num * 0.8).toFixed(4); trans.send_inline(’eosio.token’, ’extransfer’, { from: to, to: memo, quantity: { quantity: ${subnum} ${quantity.quantity.split(' ')[1]}, contract: quantity.contract }, memo: ‘sub account’ }, [ { // 需要提供合约账户的 active 权限 actor: action.receiver, permission: ‘active’ } ]); }}合约代码开头我们需要做一些验证。收款方的账户为合约账户,否则因为下面代码执行给内容提供者转账时,因为转帐方也是合约账号会再次收到通知,造成无限递归,超出最大 send_inline 层数而报错。我们用 memo 参数来放内容提供者的账户,所以我们需要对此参数校验一下该账户是否存在防止打错。合约代码中我们使用 send_inline 调用 eosio.token 合约来执行转帐操作。转帐操作需要对应账户的 active 权限才能执行。为了解决权限滥用问题,FIBOS 定义了一个特殊权限 eosio.code。我们需要在平台合约账户中配置权限,在 active 权限下添加该合约账户的 eosio.code 授权。具体的配置操作会在下面说明。在 FIBOS TestNet 上注册账号为方便测试,我们在测试网 http://testnet.fibos.fo 上注册三个账户。用户账号 helloworld11内容提供者账号 helloworld22平台合约账号 helloworld33我们需要记录这三个账号的账户名以及公私钥。以便下面的开发使用。创建一个统一的配置文件来记录这些数据:const config = { // 平台合约账户的客户端配置 client: { chainId: ‘68cee14f598d88d340b50940b6ddfba28c444b46cd5f33201ace82c78896793a’, httpEndpoint: ‘http://testnet.fibos.fo’, keyProvider: ‘PRIVATE_KEY_OF_helloworld33’ }, // 用户账户的客户端配置 callClient:{ chainId: ‘68cee14f598d88d340b50940b6ddfba28c444b46cd5f33201ace82c78896793a’, httpEndpoint: ‘http://testnet.fibos.fo’, keyProvider: ‘PRIVATE_KEY_OF_helloworld11’ }, // 平台合约账户信息 contractAccount: { name: ‘helloworld33’, publicKey: ‘PUBLIC_KEY_OF_helloworld33’, privateKey: ‘PRIVATE_KEY_OF_helloworld33’ }, // 用户账户信息 account1: { name: ‘helloworld11’, publicKey: ‘PUBLIC_KEY_OF_helloworld11’, privateKey: ‘PRIVATE_KEY_OF_helloworld11’ }, // 内容提供者账户信息 account2: { name: ‘helloworld22’, publicKey: ‘PUBLIC_KEY_OF_helloworld22’, privateKey: ‘PRIVATE_KEY_OF_helloworld22’ }}module.exports = config配置权限在合约代码中,我们调用了 trans.send_inline 函数调用合约 eosio.token 来实现转帐操作,但是转帐操作是需要账户的 active 权限。所以我们需要更新一下合约账户的权限,需要添加调用者的 eosio.code 授权到它的 active 权限。这个调用者自然也是这个合约账户。const FIBOS = require(‘fibos.js’);const config = require(’./config’);const fibosClient = FIBOS(config.client);let ctx = fibosClient.contractSync(’eosio’);var r = ctx.updateauthSync({ account: config.contractAccount.name, permission: ‘active’, parent: ‘owner’, auth: { threshold: 1, keys: [{ key: config.contractAccount.publicKey, weight: 1 }], accounts: [{ permission: { // 将调用者账号的 eosio.code 授权添加到它的 active 权限下。 actor: config.contractAccount.name, permission: ’eosio.code’ }, weight: 1 }] }},{ authorization: ${config.contractAccount.name}@owner //更改账户权限需要使用 owner 权限});console.log(r);部署合约const FIBOS = require(‘fibos.js’);const config = require(’./config’);const fibosClient = FIBOS(config.client);const fs = require(‘fs’);// setcodeconst jsCode = fs.readTextFile(${__dirname}/contracts/subaccount.js);fibosClient.setcodeSync(config.contractAccount.name, 0, 0, fibosClient.compileCode(jsCode));// getcodeconst code = fibosClient.getCodeSync(config.contractAccount.name, true);console.log(‘code:’, code);// setabiconst abi = JSON.parse(fs.readTextFile(${__dirname}/contracts/subaccount.abi));fibosClient.setabiSync(config.contractAccount.name, abi);转账测试我们先来写一个脚本 account.js 来查看三个账户的余额。const FIBOS = require(‘fibos.js’);const config = require(’./config’);const fibosClient = FIBOS(config.callClient);const account1 = fibosClient.getTableRowsSync(true, ’eosio.token’, config.account1.name, ‘accounts’);console.log(config.account1.name);console.log(account1);const account2 = fibosClient.getTableRowsSync(true, ’eosio.token’, config.account2.name, ‘accounts’);console.log(config.account2.name);console.log(account2);const contractAccount = fibosClient.getTableRowsSync(true, ’eosio.token’, config.contractAccount.name, ‘accounts’);console.log(config.contractAccount.name);console.log(contractAccount);执行 fibos account.js 来查看三个账户信息。 目前我们的账户还没有 FO,所以大致情况是这样的:用户账户:helloworld11 金额:0.0000 FO内容提供者账户:helloworld22 金额:0.0000 FO平台合约账户:helloworld33 金额:0.0000 FO测试网会自动给每个账户发放10 EOS 的通证用以测试使用。账户中还并没有 FO 通证。所以我们再来写一个兑换脚本,用1 EOS 换一点 FO 通证。const FIBOS = require(‘fibos.js’);const config = require(’./config’);const fibosClient = FIBOS(config.callClient);let ctx = fibosClient.contractSync(’eosio.token’);const r = ctx.exchangeSync( config.account1.name, ‘1.0000 EOS@eosio’, ‘0.0000 FO@eosio’, ’exchange FO to EOS’, { authorization: config.account1.name });console.log(r)再次执行 fibos account.js 来查看账户信息。目前我们的账户金额大致是这样的:用户账户:helloworld11 金额:146.4245 FO内容提供者账户:helloworld22 金额:0.0000 FO平台合约账户:helloworld33 金额:0.0000 FO下面写个脚本 transfer.js 来执行转帐操作。const FIBOS = require(‘fibos.js’);const config = require(’./config’);const fibosClient = FIBOS(config.callClient);let ctx = fibosClient.contractSync(’eosio.token’);const r = ctx.extransferSync( config.account1.name, // 用户账户 config.contractAccount.name, // 平台合约账户 ‘10.0000 FO@eosio’, // 转帐金额 config.account2.name, // 附言填写内容提供者的账户名,平台合约会给它分账 { authorization: config.account1.name //提供用户账户的授权 })console.log(r)我们要从用户账户 account1 给平台合约账户 account3 转帐 10 FO。memo 参数为要分成的内容提供者账户 account2。根据合约中定的2/8分成,平台合约账户 account3 将会分得2 FO,而内容提供者账户 account2 将会获得8 FO。使用命令 fibos transfer.js 执行该脚本完成转帐操作。下面我们再来看一下目前三个账户情况。执行命令 fibos account.js。三个账户金额大致如下。用户账户:helloworld11 金额:136.4245 FO内容提供者账户:helloworld22 金额:8.0000 FO平台合约账户:helloworld33 金额:2.0000 FO结果显示,分账账户和平台合约账户如预期那样获得8 FO 和2 FO。综上,我们成功使用了智能合约实现了自动分账。平台方还可以继续根据自己业务需要定制自己的合约。文中的代码请参考:https://github.com/fengluo/fi… ...

January 30, 2019 · 3 min · jiezi

盘他!以太坊合约的安全性弱点II

今天,我们继续介绍文献中提到的以太坊合约的安全性弱点与案例。数据保密Solidity 智能合约中的变量分 public 和 private 两种。Private 变量表示这个数值不能被其他合约直接读取。但是,将一个变量标记为 private 不意味着里面的信息就是保密的。因为以太坊是公开的,每次合约函数执行的字节码,参数都是公开的,任何人都可以推断出每次函数执行后是否修改了变量,修改后的数值是多少。Private 只是能够保证其他合约执行的时候,无法读取其中的变量罢了。然而,一些本应该隐藏玩家数据的游戏,却错误地使用了这一点。以下是一个示例:两个玩家在玩一个赌博游戏,每个玩家选一个正整数,两个正整数加起来的奇偶性,决定了获胜者。存储玩家选择的变量是 players, 这个变量具有 private 属性。玩家通过调用智能合约函数选数的时候,决策并不是保密的。为了实现保密性,更好的方式是使用一个称为“委托”的密码学原语。当玩家需要秘密地做出一个决定时,可以将 sha3(决策内容,随机数) 得到的哈希值存到合约里。当玩家需要公开自己选择的时候,将 决策内容 与 随机数 公开,并由智能合约验证哈希值与先前存储的是否一致。可以实现类似于“先在纸上秘密写下选择,到后面一个环节再亮出来”的功能。随机数生成EVM 的字节码执行是确定性的。因此,如果智能合约想生成一个随机数,就需要通过一个随机数种子生成一个伪随机数。而随机数种子的选取方式,对生成随机数的公平性有很大的影响。一个常用的做法是,使用一个给定时间或给定高度区块的哈希值或时间戳。这件事情在给定区块被确认以后,在每个矿工看来都是一样的。看起来这是一个公平的做法,因为没有人能预测未来的区块。但是,一个恶意的矿工可能尝试操纵自己生成的区块来影响随机数的生成与合约的执行结果。一个分析表示,一个控制少数算力的矿工,只需要投入 50 个比特币就可以显著地改变输出结果的概率分布。另一个方式是使用“延时委托协议”。在这个协议中,每个参与者选择一个秘密的随机数,并将哈希值广播给其他人。在晚些时候,所有参与者公布它们选取的秘密随机数,或者丢失押金。最终随机数由所有公布的秘密随机数和一个公开的算法生成。攻击者可以在“其他所有人都已经公布了随机数,自己还没有公布”时,预先计算最终生成的随机数,如果生成的结果它不满意,就通过拒绝公布自己选择的随机数方式,来使这个结果无效。当然,攻击者要损失一些押金。所以,押金的设定要足够高,高于随机数生成中改变结果可能带来的收益。不可预测状态一个合约的状态包括合约变量和合约余额。一般情况下,当用户通过一笔交易调用合约函数的时候,从交易广播到交易被加入区块之间,可能有其他的交易改变了合约的状态。也就是说,当用户发起一笔交易时,并不能确定这笔交易被执行时,合约的状态是什么。一个基于 library 和不可预测状态的攻击下面我们来看一个例子,以下的 Solidity 代码定义了一个名为 Set 的 library。下面是一个名为 SetProvider 的合约,提供了一个 Set library 的地址,合约拥有者可以修改这个地址,任何人/合约可以获取这个地址。假设 Bob 合约是一个使用 SetProvider 的诚实用户,他的代码如下:Bob 记录了一个 SetProvider 合约的地址,在 getSetVersion() 中,使用这个地址获取了一个 Set library 的版本号。现在,假设 SetProvider 合约的控制者是个坏人。他制造了一个恶意的 Set library, 希望偷得一些钱存到他自己的钱包地址 0x42 中。如果合约 SetProvider 中 setLibAddr 的地址被修改为 MaliciousSet 的地址, Bob 合约中调用 getSetVersion() 函数时,会调用 MaliciousSet 的 version() 函数,而不是 Set 的。因为 Bob 合约中将 Set 声明为一个 library, 所以对 version() 的调用采用的是 delegatecall 模式。 delegatecall 模式意味着转账操作 attackerAddr.send(this.balance); 是从 Bob 合约中转账出来。 Bob 合约中的钱将被偷走。上述例子说明了,对 library 函数的调用使用的是较为危险的 delegatecall 模式。因此合约编写者在使用其他合约地址作为 library 时,一定要保证通过 library 加载进来的代码是自己可控的。比如,手动指定一个已经在区块链上不可修改的 library 的地址。而不是在本例中依靠于一个不可靠的 SetProvider 合约来获取 library 的地址。另外,“不可预测状态”问题也加剧了这件事情。即使在调用 Bob 合约的 getSetVersion() 函数时, SetProvider 指向的是诚实的 Set library. 攻击者也可以在这一交易还没有被加入区块的时候,通过发起一笔交易费数额较大的交易,抢在 getSetVersion() 被加入区块之前,将 SetProvider 的指向修改为 MaliciousSet。Conflux 是致力于打造下一代高性能的 DAPP 公链平台欢迎关注我们的微信公众号:Conflux中文社区(Conflux-Chain)添加微信群管理员 Confluxgroup 回复“加群”加入 Conflux官方交流群 ...

January 30, 2019 · 1 min · jiezi