【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
1. 分布式数字身份
分布式身份不止是人,包括组织,甚至未来也包括物品。这些人或者组织、物品不简单依靠于原先中心化权威机构,无法被拿走或者删除,而且是终身携带的身份。
1.1. 数字身份标识
国际电子技术委员会将“身份”定义为“一组与实体关联的属性”。数字身份通常由身份标识符及与之关联的属性声明来表示,分布式数字身份包括:分布式数字身份标识符和数字身份凭证(声明集合)两部分。
分布式数字身份标识符(DID)是由字符串组成的标识符,用来代表一个数字身份,不需要中央注册机构就可以实现全球唯一性。通常,一个实体可以拥有多个身份,每个身份被分配唯一的DID值,以及与之关联的非对称密钥。不同的身份之间没有关联信息,从而有效地避免了所有者身份信息的归集。
分布式身份标识(Decentralized Identifiers, DID)是一种去中心化的可验证的数字标识符,具有分布式、自主可控、跨链复用等特点。实体可自主完成DID的注册、解析、更新或者撤销操作。DID具体解析为DID Document,DID Document包括DID的唯一标识码,公钥列表和公钥的详细信息(持有者、加密算法、密钥状态等),以及DID持有者的其他属性描述。
并且,一个实体可对应多个DID。
“声明(claims)”是指与身份关联的属性信息,这个术语起源于基于声明的数字身份,一种断言(assert)数字身份的方式,独立于任何需要依赖它的特定系统。声明信息通常包括:诸如姓名,电子邮件地址、年龄、职业等。
声明可以是一个身份所有者(如个人或组织)自己发出的,也可以是由其他声明发行人发出的,当声明由发行人签出时被称为可验证声明。用户将声明提交给相关的应用,应用程序对其进行检查,应用服务商可以像信任发行人般信任其签署的可验证声明。多项声明的集合称为凭证(credentials)。
DID和一个DID文档(DID Document)关联。DID文档上记录的数据是由用户自己决定的,不必要的信息可以完全不记录在DID文档上。在DID系统中,有身份颁布者,身份持有人和验证者三类角色。持有人向颁布者申请身份,验证者在需要时验证持有人的身份。DID数据存放在区块链上,链上不存储隐私数据。而他们三者直接的相互交互使用非对称加密算法、零知识证明等密码算法。
1.2. 可验证声明
可验证声明(Verifiable Credential)提供了一种规范来描述实体所具有的某些属性,实现基于证据的信任。DID持有者,可以通过可验证声明,向其他实体(个人、组织、具体事物等)证明自己的某些属性是可信的。同时,结合数字签名和零知识证明等密码学技术,可以使得声明更加安全可信,并进一步保障用户隐私不被侵犯。
2. 可解决的问题
数字分布式标识可提供全局唯一的分布式实体身份标识、可信数据交换协议,促进跨部门、跨地域的身份认证和数据合作。摆脱对传统模式下单一中心ID注册的依赖。实体的现实身份和可验证数字凭证的内容可链下存储。支持实体将信息最小化或者选择性披露给其他机构,同时防止任何第三方反向推测出实体在现实世界或其他场景语义中的身份。
3. 使用场景
https://weidentity.readthedocs.io/zh_CN/latest/docs/use-cases.html
3.1. 数据共享 背景
当前,不同机构间存在着大量用户数据流通的需求。然而,由于各个机构之间通常难以组建有效的信任合作机制,因此,各机构间难以将各自保管的用户数据安全可信地授权共享给其他机构。通过分布式数字身份DID解决方案,可帮助机构间进行可信数据授权及共享,使得各机构可基于全面的数据为用户提供更高质量的服务。 参与方
用户、数据持有机构、数据使用机构、身份证明机构 解决方案及流程
1、在身份证明机构、数据持有机构、数据使用机构间搭建区块链网络,机构作为节点接入并注册DID
2、由身份证明机构为用户生成DID
3、用户授权数据使用机构使用自己的数据
4、数据使用机构生成授权凭证(Credential),标明授权对象、数据属主、有效期、授权内容等属性,并使用机构私钥进行签名;数据使用机构可选择将授权凭证生成摘要并写入区块链,达到增信目的
5、数据使用机构出示授权凭证给数据持有机构
6、数据持有机构通过凭证验证(Verify)接口,验证授权凭证
7、验证通过,数据持有机构将数据发送给数据使用机构
4. 如何实现与使用
4.1. W3C与DID标准
分散标识符(DID)是一种新型的标识符,它是全局惟一的、可解析的、高可用性的,并且可以通过密码验证。DID通常与加密材料(如公钥和服务端点)相关联,用于建立安全的通信通道。DID对于任何有利于自我管理、加密可验证标识符(如个人标识符、组织标识符和物联网场景中的标识符)的应用程序都非常有用。例如,目前W3C可验证凭据的商业部署大量使用分散的标识符来标识人员、组织和事物,并实现许多安全和隐私保护保证。
W3C的DID标准下的DID系统主要包括以下层次要素:
l基础层:DID规范,包括DID标识符(Identifier)和DID文档(Document)
l应用层:可验证声明或凭证(Verifiable Claims 或 Verifiable Credentials, VC)
有关w3c的DID标准官方地址:
A Primer for Decentralized Identifiers: https://w3c-ccg.github.io/did-primer/
Decentralized Identifiers (DIDs) 2019 v1.0: https://www.w3.org/TR/did-core
Decentralized Identifiers (DIDs) 2020 v1.0: https://w3c.github.io/did-core/
Verifiable Credentials Data Model 1.0: https://www.w3.org/TR/vc-data-model
4.2. DID与传统标识体系的区别
常见的有两种:UUID(全局唯一标识符)和URN(统一资源名称)。对于UUID,不用集中式注册机构即可提供全局唯一性,但不能全局解析。而URN,一次分配给实体并且永远不需要更改,需要集中的注册机构。此外,二者都没有加密验证标识符所有权的能力。
对于全新的DID,可提供不依赖任何集中授权的终生便携式数字身份,且满足:持久性,全局可解析性,密码可验证性和分散性。
4.3. DID格式
lDID示例一(W3C Credentials Community Group):did:example:123456789abcdefg
DID标识符不容易记忆。根据Zooko三角形理论,没有任何标识符能够同时实现易记忆、安全、去中心化。在这里,W3C的DID取了后两者。
lDID示例二(微众银行DID):did:weid:1:0x0086eb1f712ebc6f1c276e12ec21
Did **:** weid : chain-id : bs-specific-string
Did:遵循DID规范,固定前缀did
Weid:WeIdentity DID规范的method name字段,固定为weid
Chain-id:网络id,用于路由到不同的网络
bs-specific-string:基于底层区块链平台生成,代表Entity在链上的地址,保证全网唯一
关于更多合法地址: https://w3c-ccg.github.io/did-method-registry/
4.4.DID文档(DID Document)
DID基础设施可以被认为是全局键值数据库,其中该数据库是所有DID兼容的区块链,分布式分类帐或分散式网络。在此虚拟数据库中,键是DID,值是DID document。DID文档的目的是描述公钥、身份验证协议和服务端点,它们是引导与标识实体的密码可验证交互所必需的。
一个DID对应一个Document。DID文档是一个JSON-LD Object,包括以下几个部分:
DID文档内容 描述
DID主题 | DID标识符本身,也就是DID文档所描述的该DID。由于DID的全局唯一特性,因此在DID文档中只能有一个DID。 公钥 | 公钥用于数字签名及其他加密操作,这些操作是实现身份验证以及与服务端点建立安全通信等目的的基础。如果 DID 文档中不存在公钥,则必须假定密钥已被撤销或无效,同时必须包含或引用密钥的撤销信息(例如,撤销列表)。 |
---|
身份验证 | 身份验证的过程是 DID 主题通过加密方式来证明它们与 DID 相关联的过程。 | 授权 | 授权意味着他人代表 DID 主题执行操作,例如当密钥丢失的时候,可以授权他人更新 DID 文档来协助恢复密钥。 服务端点 | 时间戳 除了发布身份验证和授权机制之外,DID 文档的另一个主要目的是为主题发现服务端点。服务端点可以表示主题希望公告的任何类型的服务,包括用于进一步发现、身份验证、授权或交互的去中心化身份管理服务。 | 文档创建时间和更新时间 | 文档内容示例: { "@context": "https://w3id.org/did/v1", "id": "did:example:123456789abcdefghi", "authentication": [{ // used to authenticate as did:...fghi "id": "did:example:123456789abcdefghi#keys-1", "type": "RsaVerificationKey2018", "controller": "did:example:123456789abcdefghi", "publicKeyPem": "-----BEGIN PUBLIC KEY...END PUBLIC KEY-----\\r\\n" }], "service": [{ // used to retrieve Verifiable Credentials associated with the DID "id":"did:example:123456789abcdefghi#vcs", "type": "VerifiableCredentialService", "serviceEndpoint": "https://example.com/vc/" }] } 需要注意的是,DID文档中没有任何和个人真实信息相关的内容,比如你的真实姓名、地址、手机号等。因此光靠DID规范是无法验证一个人的身份的,必须要靠DID应用层中的可验证声明VC。 有关JSON-LD详解,可参见: https://json-ld.org/spec/latest/json-ld/ 有关DID文档详细规范,可参见“6. DID Documents”: https://w3c.github.io/did-core/#did-documents 4.5. DID相关操作 Create:创建一个新的DID DID方法规范必须指定客户端如何在DID注册表上创建DID及其相关的DID文档,包括建立控制证明所需的所有加密操作。 Read/Verify:解析验证DID文档 DID方法规范必须指定客户端如何使用DID从DID注册中心请求DID文档,包括客户端如何验证响应的真实性。 Update:DID文档升级 DID方法规范必须指定客户端如何更新DID注册表上的DID文档,包括建立控制证明所需的所有加密操作,或者声明不可能进行更新。 Deactive:停用DID DID方法规范必须指定客户端如何在DID注册表上停用DID,包括建立停用证明所需的所有密码操作,或者声明不可能停用。 有关DID方法和操作规范,可参见“8. DID Methodds”: https://w3c.github.io/did-core/#did-method-schemes 4.6. DIDs与隐私设计 隐私是任何身份管理解决方案的重要组成部分,对于使用不可变的全球身份系统来说,这一点尤为重要。 成对匿名的DID 尽管DID可以用作众所周知的公共标识符,但它们也可以用作基于每个关系发布的私有标识符。因此,一个自然人A可以拥有成千上万的成对唯一的DID,而不是一个单独的DID(例如手机号码或国家ID号码),而无需A的同意就可以将其关联起来,可以像通讯录一样轻松地进行管理。 链下私有数据 链下存储所有的私有数据,仅通过对等连接进行加密交换。 选择性披露 DID使得分散式PKI(DPKI)成为可能,这使个人可以通过两种方式更好地控制其个人数据。首先,它可以使用加密的数字凭据进行共享。其次,这些凭证可以使用 零知识证明密码术 来 最小化数据 透露,例如,可以透露自己已经超过一定年龄,而无需透露确切的生日。 有关DPKI解释: http://www.elecfans.com/blockchain/996128.html 4.7.DIDs与可验证凭证(Verifiable Credentials, VC) 至此,以上都是DID规范基础,可验证声明才是建立DID整个体系的价值所在。因为在这一层中,DID既可以用来标识个体的身份,也可以用来标识组织的身份,甚至是物品。 4.7.1. 可验证凭证系统架构 在VC系统中,有一下几种参与者: 发行者Issuer 拥有用户数据并能开具VC的实体,如政府、银行、大学等机构和组织。 持有者Holder 持有者即用户。用户向Issuer请求、收到、持有VC的实体,向验证者出示VC。开具的VC可以自我保存,方便以后再次使用,例如保存在钱包里。 验证者Verifier 接受VC并进行验证,由此可以提供给出示VC者某种类型的服务。 标识符注册机构Verifiable Data Registry 维护DIDs的数据库,如某条区块链、分布式账本(可理解为前面提到的DID里的example字段)。 之所以需有Verifiable Data Registry,是因为验证者要验证VC,也要验证用户。验证VC用VC和发VC的Issuer,验证用户用DID和存DID的数据库。 关于“可验证凭证系统”解释,可参考: https://www.w3.org/TR/vc-data-model VC的格式也是JSON-LD,示例如下: { // set the context, which establishes the special terms we will be using // such as 'issuer' and 'alumniOf'. "@context": [ "https://www.w3.org/2018/credentials/v1", "https://www.w3.org/2018/credentials/examples/v1" ], // specify the identifier for the credential "id": "http://example.edu/credentials/1872", // the credential types, which declare what data to expect in the credential "type": ["VerifiableCredential", "AlumniCredential"], // the entity that issued the credential "issuer": "https://example.edu/issuers/565049", // when the credential was issued "issuanceDate": "2010-01-01T19:73:24Z", // claims about the subjects of the credential "credentialSubject": { // identifier for the only subject of the credential "id": "did:example:ebfeb1f712ebc6f1c276e12ec21", // assertion about the only subject of the credential "alumniOf": { "id": "did:example:c276e12ec21ebfeb1f712ebc6f1", "name": [{ "value": "Example University", "lang": "en" }, { "value": "Exemple d'Université", "lang": "fr" }] } }, // digital proof that makes the credential tamper-evident // see the NOTE at end of this section for more detail "proof": { // the cryptographic signature suite that was used to generate the signature "type": "RsaSignature2018", // the date the signature was created "created": "2017-06-18T21:19:10Z", // purpose of this proof "proofPurpose": "assertionMethod", // the identifier of the public key that can verify the signature "verificationMethod": "https://example.edu/issuers/keys/1", // the digital signature value "jws": "eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..TCYt5X sITJX1CxPCT8yAV-TVkIEq_PbChOMqsLfRoPsnsgw5WEuts01mq-pQy7UJiN5mgRxD-WUc X16dUEMGlv50aqzpqh4Qktb3rk-BuQy72IFLOqV0G_zS245-kronKb78cPN25DGlcTwLtj PAYuNzVBAh4vGHSrQyHUdBBPM" } } 4.7.2. 验证者验证VC 因为VC中是没有Issuer的公钥的(也不应该有,因为就算有了,验证者还需要亲自验证公钥是否是真的)。这里VC的id是一个URI,而VC中的Issuer字段也是一个URI。而Issuer也可能是使用DID来作为其身份的。因此,通过VC中的Issuer字段——URI地址得到其DID,然后从DID对应的DID文档里可以得到其公钥。用公钥验证对VC的签名就能验证VC是否Issuer发的。 4.7.3. 验证者验证用户 用Holder(即用户)的DID对应的DID文档里的公钥来验证其数字签名的合法性。 5. 可验证凭证保护策略 5.1. 使用JSON网络签名确保 JSON Web Token(JSON 网络令牌 )的安全 https://tools.ietf.org/html/rfc7519 https://tools.ietf.org/html/rfc7515 5.2. 链接数据签名 https://w3c-dvcg.github.io/ld-signatures/ 5.3. Camenisch-Lysyanskaya 零知识证明 http://groups.csail.mit.edu/cis/pubs/lysyanskaya/cl02b.pdf 6. 微众银行的WeIdentity规范 https://weidentity.readthedocs.io/zh_CN/latest/docs/weidentity-spec.html 7. 微软的DID https://www.microsoft.com/zh-cn/security/technology/own-your-identity 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> Web3E,即Web3 for Embedded,是一个面向Arduino嵌入设备的全功能Web3开发框架,开发语言为C/C++。Web3E可以帮助嵌入设备开发者快速实现能够接入以太坊区块链的物联网/IoT设备,为物联网开发者打开了一扇新的大门。 1、Web3E简介 Web3E主要在ESP32上进行测试,ESP8266也可以正常工作。Web3E还包含了一个快速开发DApp注入器,可以很方便地将你的嵌入设备转换为以太坊DApp。 Web3E的开发始于一个简单的需求:开发一个能够在ESP32上运行的门禁DApp。这期间经历了相当多的挫折,我们意识到需要一个方法来简化物联网嵌入设备的DApp的开发,这就是开发Web3E的最初动机。 Web3E的主要特性包括: 支持TokenScript接口 开箱即用的以太坊DApp注入器,可以立刻将物联网嵌入设备转化为支持ECDSA密码学技术 的以太坊DApp 经过优化精简的密码学算法实现 交易系统已经充分优化,以太坊ERC20和ERC875合约都有实际使用 2、Web3E安装 建议使用Platformio安装Web3E,因为Web3E目前已经是Platformio开发库的一份子了,所以不需要克隆原始的Web3E代码库。 使用Web3E很简单,只需要在Platformio中创建一个新项目,然后参考如下内容修改platformio.ini: [env:esp32dev] platform = espressif32 board = esp32dev framework = arduino ; Serial Monitor options monitor_speed = 115200 lib_deps = # Using a library name Web3E 3、Web3E的示例及使用方法 在Web3E中预置了4个物联网+以太坊的示例应用: Simple DApp:展示如何创建可以运行在嵌入设备上的DApp。板载密码学引擎 可以与用户输入充分交互,在ESP32上的公钥恢复和签名验证可以毫秒级完成 查询钱包余额:展示在嵌入设备上如何查询ERC20代币余额以及非同质化通证(NFT)余额 交易广播:展示在嵌入设备上如何实现ERC20和ERC875代币的转账交易 以太币转账:展示如何在嵌入设备上实现以太币转账 例如,下面的代码展示了如何使用Web3E让物联网嵌入设备支持以太币转账: // Setup Web3 and Contract with Private Key ... Contract contract(&web3, ""); contract.SetPrivateKey(PRIVATE_KEY); uint32_t nonceVal = (uint32_t)web3.EthGetTransactionCount(&address); //obtain the next nonce uint256_t weiValue = Util::ConvertToWei(0.25, 18); //send 0.25 eth unsigned long long gasPriceVal = 1000000000ULL; uint32_t gasLimitVal = 90000; string emptyString = ""; string toAddress = "0xC067A53c91258ba513059919E03B81CF93f57Ac7"; string result = contract.SendTransaction( nonceVal, gasPriceVal, gasLimitVal, &toAddress, &weiValue, &emptyString); 下面的代码使用Web3E在物联网嵌入设备上查询指定的以太坊地址的以太币余额: //obtain balance in Wei uint256_t balance = web3.EthGetBalance(&address); //get string balance as Eth (18 decimals) string balanceStr = Util::ConvertWeiToEthString(&balance, 18); 使用Web3E让嵌入设备支持ERC20代币的发送要复杂一点,但考虑到这是在用C/C++,也还能够接受: string contractAddr = "0x20fe562d797a42dcb3399062ae9546cd06f63280"; Contract contract(&web3, contractAddr.c_str()); contract.SetPrivateKey(); //Get contract name string param = contract.SetupContractData("name()", &addr); string result = contract.ViewCall(¶m); string interpreted = Util::InterpretStringResult(web3.getString(&result).c_str()); Serial.println(interpreted.c_str()); //Get Contract decimals param = contract.SetupContractData("decimals()", &addr); result = contract.ViewCall(¶m); int decimals = web3.getInt(&result); Serial.println(decimals); unsigned long long gasPriceVal = 22000000000ULL; uint32_t gasLimitVal = 4300000; //amount of erc20 token to send, note we use decimal value obtained earlier uint256_t weiValue = Util::ConvertToWei(0.1, decimals); //get nonce uint32_t nonceVal = (uint32_t)web3.EthGetTransactionCount(&addr); string toAddress = "0x007bee82bdd9e866b2bd114780a47f2261c684e3"; string valueStr = "0x00"; //Setup contract function call string p = contract.SetupContractData("transfer(address,uint256)", &toAddress, &weiValue); //push transaction to ethereum result = contract.SendTransaction(nonceVal, gasPriceVal, gasLimitVal, &contractAddr, &valueStr, &p); string transactionHash = web3.getString(&result); 4、总结 让嵌入设备接入以太坊,是发挥智能合约能力的重要环节,因为机器天生容易按规矩办事。Web3E提供了一个相对完整的解决方案,虽然目前仅适用于部分Arduino设备,但这对于物联网嵌入设备开发者而言绝对是一个好工具。如果希望系统的学习以太坊开发知识,可以参考如下教程: 以太坊DApp开发入门 | 去中心化电商DApp实战 原文链接: Web3E物联网嵌入设备的以太坊DApp开发框架 — 汇智网 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 从2017年底曝出天价数字猫的全球第一款区块链游戏《CryptoKitties》从而让区块链游戏一炮而红,区块链宠物游戏从本质上说,区块链游戏应用只是一类电子宠物养成游戏,区块链游戏app玩家需要用以太币交易购买虚拟宠物,而区块链宠物游戏中的宠物其实是由不同的“代码”写成的,各类虚拟宠物也因此被赋予了不同的DNA,价值也就各不相同。 区块链领域除了货币和金融之外,游戏也一直备受瞩目,从加密猫开始,它点燃了人们对区块链游戏的热情。不过,由于用户体验和扩展斗玩网首发原创性等问题,区块链游戏一直处于较小规模的状态,那么,当前的区块链游戏进展到什么程度?它的未来会有希望吗?不管如何,有一个事转载自站长之家实不可否认,相比较于两年前,当前投入到区块链游戏的研发和资金已经极大增加,其用户数也比之前增长了不少。 随着更多好玩的区块转载自站长之家链游戏入场外汇交易术语http://www.gendan5.com/terminology.html它会让玩家逐步认识到区块链游戏跟传统游戏的不同,慢慢地它会开拓出自己的疆土,区块链游戏无法取代传统游戏,但因站长之家,斗玩网为它的独特属性,如道具所有权、跨游戏的资产交易等,终有一天,它会成长起来 什么是区块链游戏游戏归游戏,玩家归玩家,道具归道具,场地归场地,组织归组织。过去20多年发展出来的网络游戏,基本都是基于HTTP协议下的。这使得去中心化从技术上不可能实现。而区块链技术的出现和不断成熟,将使得虚拟资产去中心化储存、游戏规则去中心化制定从技术层面变得可行。相比现有的网络游戏,区块链游戏在去中心化技术的支持下,玩家将拥有虚拟资产的完全产权,开发者也无法随意更改游戏的规则。游戏开发者和玩家的关系会发生根本的改变。 这同时也意味着,数字资产将更接近实物资产,可以被玩家/用户所拥有。而玩家在数字资产上的投入,也将像在现实中种地、制作手工艺品、画画一样,产生价值并可以交易。而这些变动,将使得网络游戏可以更像打篮球、踢足球这些现实中的游戏。篮球的游戏制定者仅仅制定了篮球游戏的规则。最初的篮球、球场、球鞋这些游戏道具可能是由篮球发明人所创造,但是后续的开发完全由玩家/社区完成。 玩家如果觉得篮球好玩,就可以遵守他的规则,自行购买游戏道具进行游戏。而游戏道具随时可以出售,玩家也可以随时离开游戏并且不会有任何损失。而区块链游戏的开发者也将仅仅制定游戏的规则。最初的游戏道具可以由开发者制作,但是后续的开发可能将大部分交由玩家和社区完成。区块链游戏的玩家如果不想玩这个游戏了,随时可以选择退出这个游戏。游戏的账号和游戏中的道具可以随意出售。玩家同样不会有任何损失。在17年底堵塞以太坊网络的CryptoKitties就是类似这样的一款游戏。 现有区块链游戏进行了分类: 菠菜游戏 金融/数字游戏 游戏+通证 游戏+区块链 这四类游戏并没有明显的界限,有的还会互相包含。 区块链游戏表面上与现有的游戏玩法并无二致,但是有了区块链的加持,玩家能够拥有独一无二的真正属于自己的数字资产,并且更加安全。 现阶段大体可以将区块链游戏分为四大类:以太坊游戏、链克游戏、公有链游戏和私有链游戏。根据玩法和功能特性又可分为 10 种游戏类型,以下就是这 10 种类型的区块链游戏分类及代表游戏: 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 一、前言 自从2009年第一枚比特币诞生,九年多时间里,区块链技术正在被应用在人们生活的各方各面,从1.0时代的数字货币,到2.0时代的智能合约,再到当下3.0时代的全面应用,区块链每一次时代跃迁都必然具有划时代意义。 今天主要聊一聊区块链2.0时代的智能合约。相信币圈大多数投资者们都或多或少了解智能合约,但是可能也存在不少所谓的“投机者”只关心炒币,懒得去关心这些底层技术;可是从长远来看,不论你是投机还是投资都应该了解并学习它。 二、智能合约 智能合约(smart contract)是由尼克•萨博(Nick Szabo)提出来的。他的定义是“一个智能合约是一套以数字形式定义的承诺(promises) ,包括合约参与方可以在上面执行这些承诺的协议。” 简单来说,智能合约是一个事务处理模块和状态机构成的系统,它的存在是为了让复杂、带有触发条件的数字化承诺能够按参与者意愿正确执行 三、智能合约的实现方法 实现智能合约就需要“图灵完备”的计算机编程语言。“图灵完备”这个词大家似乎了解的不多,可以简单地理解为能把世间一切可以计算解决的问题都计算出来的,这样的一种虚拟机或者编程语言就叫图灵完备。 举一个不太精确但是很容易理解的例子说明一下:比如两口做饭的锅,一口锅可以实现一切的烹饪方法煎、炒、蒸、炖、炸、汆、涮、卤等,而另外的一口锅则只能实现蒸和炖,其他的都不能实现,那么前者就是图灵完备的,后者则不是。 智能合约之所以可以在以太坊上完美应用,就是因为以太坊在其区块链上提供了一种近乎图灵完备的计算环境。只要是编程语言能够实现的计算,其都能支持,这也为智能合约在更加广泛的环境中得以应用坚实了基础。 四、智能合约的作用 没有提供外汇返佣http://www.fx61.com/功能之前,区块链技术的应用范围还仅限于电子现金领域,有了智能合约区块链技术广泛应用成为可能,因为区块链上的智能合约一旦写入就不能被篡改,而且任何人都无法干预它自动执行,所以如果用智能合约来替代人的履约行为,可想而知信任成本会大幅下降,交易行为达成效率会大为改善,这对现实生活的改变将会是广泛的、全面的,毕竟我们生活的世界全靠信任工具维系。 举个例子:将一个农作物收成保险业务写成智能合约,合同约定当连续60天不下雨情况发生时,保险公司支付理赔款。保险公司在区块链上建立这样一个智能合约,代码设定自动从天气信息网站搜索天气信息,当数据达到指标,代码自动执行资金转账,执行理赔,整个过程不需要人参与,没有保险理赔申请、没有现场勘查、没有审批流程、不需要投保人跑来跑去和耐心等待。可能你觉得传统的技术也能做到,但是你是否意识到如果可以这样,那保险公司的作用是不是被削弱了,如果我们想不用保险公司来做个事,而是用户自发组织来做,那就会面临缺少信任工具的问题,只有运行在区块链上的智能合约才能解决这个问题,这个作物保险智能合约就是区块链制造的信任工具。理论上任何人都可以开发类似的智能合约,只要满足保险产品的风控逻辑即可达成。 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> Raft是Hyperledger Fabric 1.4.1中新增的排序服务模块,这个教程将介绍如何部署一个基于Raft排序服务的多机Fabric网络。 相关教程推荐: Hyperledger Fabric Java开发详解 Hyperledger Fabric Node.JS开发详解 1、用Raft排序服务启动byfn示例 BYFN是学习Hyperledger Fabric的一个很好的例子:它包含了Fabric网络的所有元素,并且在byfn.sh中完整表现出来。当我们不加任何参数运行这个脚本时,它将启动一个包含2个机构、4个peer和1个orderer(使用solo排序)的Fabric网络。byfn.sh的参数 -o 用来指定排序服务的类型: ./byfn.sh up -o 最新的BYFN网络设计中包含了5个orderer的密码学资料。如果使用Solo或Kafka排序服务,将值运行第一个Orderer(参见docker-compose-cli.yaml中的定义)。 当我们指定raft作为排序服务时的一个区别之处在于,使用configtxgen生成创世区块我们需要指定configtx.yaml中的SampleMultiNodeEtcdRaft配置端。其他的操作都保持不变。 最后,我们还需要启动其他4个orderer,这些内容在docker-compose-etcdraft2.yaml中定义。 下面时基于raft排序的BYFN网络启动后的情况,你可以看到有5个orderer在运行: 下面是基于Raft排序服务的BYFN网络的拓扑示意图: 在下面的内容中,我们将不再使用BYFN脚本,而是从零开始来学习如何构建多主机的Raft排序的Fabric网络。 2、Hyperledger Fabric多机部署的不同方案 由于Hyperledger Fabric的组件以容器形式部署,当这些容器都在本机时会很顺利的工作。但是当这些容器需要运行在不同的主机上时,我们需要找出让它们彼此通信的办法。 虽然Hyperledger Fabric官方没有给出正式的推荐方案,目前大致有三种方案: 使用静态IP :通过指定容器运行的主机IP,容器之间就可以彼此通信。可以在docker-compose文件中使用extra_hosts方法来指定主机IP,当容器运行后,就可以在/etc/hosts文件中看到这些项。这一方案容易理解,我们也不需要依赖于外部组件,缺点在于所有的东西都是静态配置的,不利于需要动态修改配置的应用场景。 使用docker swarm :Docker Swarm是Docker环境中的原生容器编排服务。简而言之,Docker Swarm为跨主机的容器提供了一个叠加网络层,使容器彼此之间能够通信,就像在一台主机上一样。这一方案的好处在于原始的配置只需要简单修改就可以使用,也不需要在配置中硬编码像IP地址这样的静态信息。缺点在于需要依赖外部组件Docker Swarm。在这个教程中我们将使用这一方案。 使用Kubernetes :k8s使目前最流行的容器编排工具,其机制类似于Docker Swarm。我们已经注意到有一些教程尝试利用k8s来进行fabric的多机部署,但是使用k8s的难度要明显高于前两种方案。 3、Fabrc Raft多机演示环境搭建 我们需要将容器分发到4个主机,本教程使用AWS上的4个EC2实例,但是并不使用AWS提供的特别功能,仅仅是用它来运行Ubuntu以及必要的软件,采用公共IP进行通信。当然你可以可以选择其他的云服务提供商。 在Fabric网络启动运行后,我们将使用Fabcar链码进行测试。总体流程如下: 启动AWS EC2实例,安装必要的镜像和工具。 构建一个叠加网络,将4个主机都加入该网络 在主机1上准备所有资料,包括密码学资料、通道配置交易、每个节点的docker-compose 文件等。然后拷贝到其他主机。 使用docker-compose启动所有组件 创建通道mychannel并将所有peer加入该通道 安装并实例化Fabcar链码 调用查询链码方法 4、Fabric Raft多机演示 4.1 启动主机 本教程使用AWS EC2 t2.small实例,使用fabric 1.4.4。注意在演示中我们使用了简化的全开放安全组,在生产环境中你应当根据自己的需求来决定开放哪些端口: 4.2 使用Docker Swarm构建叠加网络 现在我们可以打开4个终端,分别对应每个主机: ssh -i ubuntu@ 从Host 1执行如下命令: docker swarm init --advertise-addr docker swarm join-token manager 运行结果如下: 使用最后的输出,将其他节点以管理者身份加入swarm。 从host 2/3/4执行如下命令: 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 随着区块链技术越来越受到关注,区块链在安全方面也面临更大的挑战,因此需要从技术体制上保证链上数据和链上交易的安全。本文将简要介绍加密通信、数字签名以及匿名通信等几个与区块链紧密相关的安全技术。 区块链是一种去中心化的分布式电子记账系统,http://www.gendan5.com/mt5.html它实现的基础是一种受信任且绝对安全的模型。在加密算法的配合下,交易信息会按照发生的时间顺序公开记录在区块链系统中,并且会附带相应的时间戳。关键之处在于,这些数字“区块”只能通过所有参与交易的人一致同意才可以更新,因此攻击者无法通过数据拦截、修改和删除来进行非法操作。 因此,区块链就有成为安全社区一个重要解决方案的潜力,对于金融、能源和制造业来说亦是如此。就目前来说,验证比特币交易是它的一个主要用途,但这种技术也可以扩展到智能电网系统以及内容交付网络等应用场景之中。 如何将区块链应用到网络安全之中? 无论是保护数据完整性,还是利用数字化识别技术来防止物联网设备免受DDoS攻击,区块链技术都可以发挥关键作用,至少现在它已经显示出了这种能力。 爱丁堡龙比亚大学计算机学院的教授Bill Buchanan表示:“区块链可以弥补我们在安全实践方面的信任缺失度,在2018年,我们对任何数据都要进行加密,这是必须的。但是目前来说,我们没办法判断你的电子邮件有没有被其他人看过或者修改过,我们甚至还无法验证邮件是否真的是你朋友发过来的。 但是在区块链技术的帮助下,我们可以记录并验证我们的(交易)行为。虽然现在大家一提到区块链,可能首先想到的就是各种加密货币,但区块链技术其实还可以为我们的数字服务构造更加值得信任的基础设施。 虽然银行、金融和房地产市场时区块链技术最常应用的领域,但与互联网相关的教育,社交媒体和安全方面也受到了区块链技术的影响。尤其是区块链技术与网络安全有着本质性的联系,也有评论称区块链技术是加密和安全领域数十年研究的最高成果,它提供了一种完全不同的方法来存储信息、进行交易、执行功能和建立信任,这使得它特别适合在具有高安全性需求和相互未知的环境中应用。 因此,尽管类似于比特币的加密数字资产有时会出现价格波动,但以区块链为基础的底层技术已经成功经受住了8年多的网络攻击。这就是为什么像洛克希德马丁等行业巨头企业,决定将区块链用于网络安全的原因。其他一些初创企业也在探索区块链技术在网络安全方面的应用。 但对企业而言,目前在应用中的挑战在于,企业已成功实施很多区块链技术的概念验证,却苦于无法建立有效的业务案例。对于现有技术解决方案,区块链技术带来的额外好处很难量化。区块链项目是一项新兴技术,其优势尚待证实,再加上所需的彻底性变革、对多方外部力量的依赖、所带来的传统系统沉没成本和转换成本,都增加了该项目的风险。 使用区块链在网络安全中的缺点 1. 不可逆性 如果用户忘记或者是丢失用于解密密钥的所需的密钥,则可能会使得无法修复加密数据。 2.存储方面的限制 每块尽可以包含不超过1兆的数据,但是,区块链每秒只能处理7个任务 3.网络攻击仍有风险 尽管区块链技术将大大的降低恶意攻击的风险,但仍不是万能的。 4.适应性挑战 尽管区块链技术可以应用到几乎任何方面的业务,但公司如果遇到困难,区块链应用还是需要完全替换现有的系统,因此,公司在实施区块链技术之前,应该先考虑到这一点。 5.高运营成本 区块链的运行,需要大量的计算能力,与现有的技术系统相比,需要更多更高的成本、 6.区块链识字 就目前的技术而言,还没有足够的开发者拥有在区块链技术方面的丰富的有关密码学的知识。 总结 区块链在网络安全的分散管理方式,是当前行业要面 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 区块链作为一种崭新的、颠覆性的技术,是国内外活跃的研究领域和毕业设计选题方向。本文列出最新的一组区块链方面的论文,希望可以对选择区块链毕业设计的同学们有所帮助,这是 汇智网 编辑整理的区块链毕业设计论文系列中的第四篇。 1、比特币网络实体活动分析与可视化 本论文提出了一个可视化分析工具Bitcoinduite,用于探索分析 比特币 网络中的金融活动。 比特币是世界范围内最大的数字加密货币,它也对当下的传统金融系统形成了挑战 - 比特币用户可以绕过传统的银行系统以(伪)匿名的方式进行转账。虽然比特币交易都记录在可以公开访问的账本上,但是对于交易参与者(我们称之为:实体)是如何使用比特币的,我们了解的并不多。Bitconduite提供了一个以实体为中心的交易视图,通过向导工作流来帮助非技术专家探索比特币实体的行为模式,同时还包括相似性聚类分析、多尺度交易数据探索等等。论文中包含的两个用例展示了系统的工作流以及其分析能力。在论文的最后,给出了领域专家的使用反馈意见,并探讨了后续的潜在研究方向。 论文PDF下载: Visualizing and Analyzing Entity Activity on the Bitcoin Network 2、基于区块链的个人隐私信息管理系统 区块链是一个关于历史交易的分布式共识所建立的分布式账本,它是比特币等数字加密货币的底层技术,不过区块链在金融领域之外也有很多应用。由于其置的安全性以及不需要第三方信任的机制,区块链已经开始开始出现在其他的应用中。在本论文中,我们提出了一个基于许可制区块链的第三方审批管理系统,其策略可以由治理机构决定。 我们已经使用 Hyperledger Fabric 完成了概念验证(PoC)实现,为终端用户提供了控制和审批其隐私信息使用的服务。我们详细该解决方案可以满足欧盟的数据保护法案(DGPR)。虽然目前的性能和可用性评估还比较有限,但我们的设计和实现可以满足隐私保护的7个基本原则。 论文PDF下载: Design and Implementation of a Blockchain-based Consent Management System 3、ChainifyDB - 区块链化现有数据管理系统 目前的许可制区块链系统是单独形式提供的,要求用户在已经很复杂的数据管理体系中再增加一个新的交易处理系统。这看起来很七块,因为区块链和传统数据库在很多方面是有共性的。因此本论文提出了一种区块链化现有数据系统的思路,而不是全盘替代。不过不幸的是,这一任务要远比听起来更有挑战性:由于我们希望在异构的交易处理系统之上进行区块链化,就不得不放弃一些假设并引入更强大的处理模型。 我们提出的WLC模型可以创建一个高度灵活的许可制区块链层,我们称之为ChainifyDB,它有以下特性:(a)基于久经考验的数据库技术(b)比现有的许可制区块链更强的保障(c)提供复杂的恢复机制(d)六倍于Hyperledger Fabric的交易吞吐量(e)易于和已有的异构数据库集成。 论文PDF下载: ChainifyDB: How to Blockchainify any Data Management System 4、区块链游戏 - 拜占庭系统合成与纳什均衡 本论文从两个正交的视角——分布式容错系统和游戏理论 —— 提出了区块链合成观点。 我们在区块链上下文中定义了新的游戏理论问题并给出了该问题的纳什均衡推导。 论文PDF下载: The Blockchain Game: Synthesis of Byzantine Systems and Nash Equilibria 5、BDoS - 区块链拒绝服务攻击 采用PoW共识的区块链例如比特币有大量的资金沉淀,但目前针对区块链的拒绝服务攻击还不多见,这主要是攻击的成本问题:已知的攻击要么针对个体,要么需要控制大部分的系统资源。 在本论文中,我们提出了一种基于激励机制的攻击:BDoS,它的成本要低得多,据我们所知 这是第一个基于激励机制的DoS攻击。 论文PDF下载: BDoS: Blockchain Denial of Service 本文整理了最新的可用于区块链毕业设计的参考论文,如果需要访问区块链毕业设计必读 论文系列的最新文章,可以持续关注我们的 博客 ,或加入QQ群:532241998。 原文链接: 区块链毕业设计必读论文4 - 汇智网 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> BnbTool 开发包适用于为PHP应用快速增加对 币安链 / Binance Chain 数字资产的支持能力, 即支持使用自有部署区块链节点的应用场景,也支持基于第三方节点开放API服务的轻量级部署场景。 官方下载地址: http://sc.hubwiz.com/codebag/bnbtool/ 。 1、开发包概述 BnbTool开发包是一个完整的币安链PHP开发包,可以极大地提升区块链钱包、交易平台或区块链应用开发过程中与币安链的对接实现效率。BnbTool主要包含以下特性: 完善的币安链节点RPC API与Rest API封装 完善的Tendermint Amino编解码器PHP实现 离线管理私钥,离线签名交易,离线序列化/反序列化交易 透明支持自有节点或第三方节点访问币安链,例如查询数据或广播交易 BnbTool软件包运行在**Php 7.1+**环境下,当前版本1.0.0,主要实现类/接口及相互之间的关系如下图所示: BnbTool的主要代码文件清单见官网: http://sc.hubwiz.com/codebag/bnbtool/ 2、使用演示代码 下载开发包并解压后,进入demo目录运行演示代码。 2.1 CryotoDemo CryptoDemo.php演示了如何使用BnbTool的Crypto封装类实现币安链账户的创建与恢复,签名的生成与验证。 在终端执行如下命令启动CryptoDemo: ~$ php CryptoDemo.php 运行结果类似下图: 2.2 RpcClientDemo RpcClientDemo.php演示了如何使用BnbTool的RpcClient调用币安链节点的RPC API。 在终端执行如下命令启动RpcClientDemo: ~$ php RpcClientDemo.php 运行结果类似下图: 2.3 RestClientDemo RestClientDemo.php演示了如何使用BnbTool的RestClient调用 币安链的Rest API。 在终端执行如下命令启动RestClientDemo: ~$ php RestClientDemo.php 运行结果类似下图: 2.4 ToolKitDemo ToolKitDemo.php演示了如何使用BnbTool的ToolKit入口类实现币安链账户的创建、转账、余额查询与历史交易查询。 在终端执行如下命令启动ToolKitDemo: ~$ php ToolKitDemo.php 运行结果类似下图: 3、ToolKit类使用说明 ToolKit是BnbTool的入口类,利用它可以快速完成币安链账户的创建、转账、DEX挂单等操作。ToolKit的主要属性与方法如下: 属性 keyStore:密钥库实例 restClient:币安链Rest API客户端实例 方法 newAddress():创建新账户并返回生成的地址,新的私钥/地址自动加入密钥库 importKey():导入指定的私钥并返回对应的地址,该私钥/地址自动加入密钥库 transfer():执行代币转账交易 placeOrder():在DEX委托挂单 cancleOrder():取消DEX上的委托单 freezeToken():冻结指定数量的代币 unfreezeToken():解冻指定数量的代币 dexList():在DEX上市交易对 3.1 ToolKit的实例化 实例化ToolKit需要传入两个参数:币安链节点Rest API服务地址,以及该节点接入的网络。例如,使用本机的Rest API服务器接入Binance Chain的测试网: use BnbTool\ToolKit; $kit = new ToolKit( 'http://localhost:8080', //Rest API访问基地址 'testnet' //测试链,可选:mainnet | testnet ); ToolKit也提供了两个静态方法用来快速创建接入主网或测试网的实例: $kit = ToolKit::mainnet(); //使用 https://dex.binance.org接入主网 $kit = ToolKit::testnet(); //使用 https://testnet-dex.binance.org接入测试网 容易理解, ToolKit::mainnet() 等价于如下的代码: new ToolKit('https://dex.binance.org','mainnet'); 3.2 账户创建与恢复 使用ToolKit的 newAddress() 方法创建新账户,该方法将生成随机私钥并返回该私钥对应的地址,同时将私钥信息存入ToolKit的密钥库。例如下面的代码创建一个新的币安链账户并显示该账户的地址: $address = $kit->newAddress(); //创建新账户并返回地址 echo "new address: $address" . PHP_EOL; //显示新账户的地址 也可以使用 importKey() 方法导入已有的私钥,该方法将返回所导入私钥对应的地址。例如下面代码导入指定的私钥并显示该账户的地址: $prv = '49bd38a8...5af84709670fd'; //要导入ToolKit的私钥 $address = $kit->importKey($prv); //导入私钥并返回地址 echo "restored: $address" . PHP_EOL; //显示恢复的地址 3.3 使用密钥库 ToolKit使用密钥库来保存账户信息,密钥库遵从IKeyStore接口的4个方法: add():添加账户信息 getAll():返回所有账户的列表 getByKey():查询指定私钥的账户 getByAddress():查询指定地址的账户 使用ToolKit的 keyStore 属性就可以访问当前使用的密钥库对象。例如,下面的代码列表显示当前密钥库中的所有账户: $items = $kit->keyStore->getAll(); //返回密钥库全部账户 foreach($items as $item){ //逐行显示账户私钥和地址 echo "key:{$item->key}, address: {$item->address}" . PHP_EOL; } 可以使用密钥的 getByKey() 方法查询指定密钥的账户地址,例如: $prv = '49bd38a8...5af84709670fd'; //要查询的私钥 $item = $kit->keyStore->getByKey($prv); //返回该私钥对应的账户记录 if(!is_null($item)) //如果找到的话 echo "address => {$item->address}\n"; //显示账户地址 3.4 转账交易 使用ToolKit的 tranfer() 方法执行代币转账交易。例如下面的代码在两个指定账号间转账1.234个BNB代币,并附备注信息: $kit->importKey('....'); //导入转账发起账号的私钥 $ret = $kit->transfer( 'tbnb1hfw...x3kh9d7p5ryya', //转账发起账号 'tbnb1l5f...xcyt0ec40avsp', //转账接收账号 'BNB', //代币符号 1.234, //代币数量 'rent' //备注信息 ) echo "tx hash => {$ret[0]->hash}\n"; //显示交易哈希 注意,由于交易需要发起账号签名,因此在调用 transfer() 方法之前,务必保证ToolKit的密钥库中已有该发起账号的私钥。 3.5 查询账户余额 由于币安链的Rest API更容易使用,ToolKit使用RestClient而不是RpcClient来与币安链交互,可以通过ToolKit的 restClient 属性来访问预创建的RestClient实例。 例如,下面的代码使用RestClient的 getAccount() 方法来查询 指定账户的所有种类代币的余额并逐行显示: $ret = $kit->restClient->getAccount('tbnb1hfw...x3kh9d7p5ryya'); //查询账户信息 foreach($ret->balances as $b){ //遍历全部币种 echo "symbol: {$b->symbol}, free: {$b->free}\n"; //显示币种符号与可用余额 } 3.6 查询账户的历史交易 类似的,使用RestClient的 getTransactions() 方法,可以查询指定账户的历史交易。例如下面的代码: $ret = $kit->restClient->getTransactions('tbnb1hfw...x37p5ryya'); //查询历史交易 foreach($ret->tx as $tx){ //遍历全部交易 echo json_encode($tx) . PHP_EOL; //显示交易内容 } getTransactions() 方法支持分页处理,例如,下面的代码使用 offset 和 limit 选项声明需要返回从100#开始的20个交易: $ret = $kit->restClient->getTransactions( 'tbnb1hfw...x3kh9d7p5ryya', //要查询的账户地址 [ 'offset'=>100, //记录起始位置 'limit'=>20 //返回记录数量 ] ); getTransactions() 对应于Rest API中的 /v1/api/transactions ,可以参考该文档了解更多可用的查询过滤参数。 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 很多新手都在纠结怎么去选择一家靠谱的交易所,做为一个较为有经验的投资人,给大家做个简单的分析: 那么作为一个币圈小白该如何选择交易所呢?其实很简单的教大家一个工具:非小号,上线查查交易所排名。 1、首选主流交易所,排名前30的,基本靠谱。如果要选择注册,找个前五的吧。一般老韭菜都在好几个交易所有账号。因为不同的币种上线的交易所不一样。 2、根据使用习惯,比如PC端啊,有无手机APP,有无苹果系统app,再看看交易所的手续费、分红、推荐返佣金、交易挖矿的具体规定和费率。 最后,大家还比较关心最近新上线的交易所,没被非小号收录,而最近作得又比较火的。对这些新上线的交易所,我们从这几方面来做个判断: 1、网站技术,页面打开的流畅速度,注册的流程,交易承载量,交易的安全措施,api接口的安全性; 2、团队背景,技术、运营的团队背景,通过百度可以查询到一些信息,看是否有比较牛X的技术团队,比较有实力的投资机构,比较专业的运营管理团队; 3、看交易所的模式,最近发现很多朋友圈在推传销交易所,完全是做拆分盘、互助盘、传销币的原班人马搞的。这样的就没必要去碰了,非要拉个人头,排个左区右区,这不是传销是啥?新模式交易即挖矿,参与交易分红,然后也得看分红的周期,是日结,周结,月结还是每单交易完就结。最后再看看交易所上币的投票规则,研究一下常用币种的转出费率。 几乎所有区块链领域的人都认为,去中心化交易所是加密货币交易的未来。这是因为,在当今的行业,数字资产交易既不安全也不简单。 要开始交易,你必须首先通过OTC网站购买法币,该服务通常收取一定费用,外汇分析师www.gendan5.com/experts.html并提供糟糕的汇率。购买完成后,你就不能再完全控制自己的资金了,但是交易所可以。 该制度迫使中心化交易所负责持有和保护所有用户的资金。因此,交易所必须管理一些控制巨额资金的中心化钱包。 火币网(Huobi) 火币全球专业站,是火币集团旗下服务于全球专业交易用户的创新数字资产交易平台,致力于发现优质的创新数字资产投资机会,目前提供四十多种数字资产品类的交易及投资服务,总部位于新加坡,由火币全球专业站团队负责运营。火币集团是一家具有全球竞争力与影响力的数字资产综合服务商,为超过130个国家百万级用户提供优质服务。在新加坡、香港、韩国、日本等多个国家和地区均有独立的交易业务和运营中心。在技术平台、产品支线、安全风控体系、运营及客户服务体系等方面,火币集团在全球均处于领先地位。 币安网(Binance) binance是全球领先的区块链资产交易平台,为全球区块链爱好者提供多币种、多语言的币币兑换服务,目前包含 binance 区块链资产交易平台、binance info,binance labs,binance launchpad 等业务。binance 的团队核心成员来自 bloomberg、blockchain.info、摩根史丹利、野村证券等世界知名企业,他们是全球区块链社区、金融和科技领域的顶级精英团队。 Bitfinex bitfinex是全世界最大、最高级的比特币交易平台之一,支持以太坊、比特币、莱特币、以太经典等虚拟币的交易,每天的成交量达30多亿人民币。提供币币交易,美元与币的交易。注册非常简单。2016年,bitfinex大概有12万枚比特币通过社交媒体被盗。受此事件影响,当时比特币价格跌了20%。 K网(Kraken) 总部位于旧金山的kraken成立于2011年,是欧元交易量最大的比特币交易所,也可用加拿大元、美元、英镑和日元交易。kraken一直被独立新闻媒体评为最佳和最安全的比特币交易所。kraken是第一个在彭博终端上显示交易价格和交易量的比特币交易所,第一个通过了加密验证的外汇储备审计,是第一家加密货币银行的合伙人。 Bithumb 占有韩国比特币市场份额75.7%的bithumb是世界五大比特币交易所之一,每天交易量超过13,000比特币,约占全球比特币交易量的10%。该交易所也是世界上最大的以太坊市场。尽管韩元目前是比特币的第四大货币市场,落后于美元、人民币和日圆,但韩元市场是以太坊最大的市场。bithumb在韩国的以太坊交易中占比44%左右。 ZT ZT(www.zt.com)是全球性数字资产交易平台之一,主要面向全球用户提供比特币、莱特币、以太币等数字资产的币币和衍生品交易服务。目前,公司已完成对新加坡、美国、日本、韩国、柬埔寨、香港等多个国家及地区的布局。 特点是拥有100余项安全与风控措施,每秒10万笔的撮合效率,方便快捷的C2C服务,秒冲秒提,体验感和安全性能都非常不错,目前在非小号上排名前十位,对于初入币市的新人来说是一个不错的选择。 区块链交易所排名头部的无疑是币安、火币、ok等不过由于大对项目方的严格审核制度和高昂的上币费,而XT.com交易所针对这种情况,制定了一套专门为项目方服务的政策 我建议你在巴比特或者bittalk泡一段时间,了解了比特币以及区块链的基本知识之后再选择交易所。 同时要弄明白你为什么要投资币圈,这是一个新型的投资项目,价格波动范围很大,风险高同时可能收益也高。并且现在正是区块链的寒冬期,这些是否都是你已经考虑过了的。 如果这些都是你已经了解和思考过的,那么再来谈谈我所接触过的交易所的一些特点。 怎样判断交易所,主要看上线的币种,交易所成立的时间,以及安全保障。 像最早接触的火币/币安等交易所,这些交易所的优势就是平台已经较为成熟,上线币种多,资产安全也同样会有保障,但于此同时,成立时间久,套路也会更多一些,所以也适合一些初入币圈的人去交易。 而相对小一些的交易所,像Dcoin/kucoin这样相对小一些的交易所,因为平台时间不久,相对来说福利活动会多一些,并且套路也相对简单一些,针对一些想赚点小钱的用户,也是不错的选择。 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 一、前言 区块链根据不同的应用场景分为应用于公众的公有链,需要授权使用的私有链和联盟链,还有在原有区块链基础上进行扩展的侧链、跨链等,随着区块链的发展,相信还会有其他形式的应用出现。在开始之前我们需要先了解什么是哈希(Hash),哈希又称哈希函数或散列算法,简单的说,哈希函数是用于将任意大小(输入)的数据映射到固定大小输出的任何函数。散列算法应用于数据输入,并且得到的固定长度输出称为散列。 盖一间房子,它的基本单元结构是每一块砖;而组成区块链的基本单元结构,就叫做区块。每个区块由区块头和区块主体组成。 二、区块头 区块头交易数据的公开、可溯源、不可篡改是让区块链与中心化系统相比的最大优势。 区块链由一个个区块组成,每个区块相当于一个小账本。要保障这些小账本的安全,需按照严格顺序排列,并保存到成千上万台电脑上。如何保障这些小账本的顺序,就需要在区块中设置一些参数。这些参数放在一起就组成了小账本的扉页,这就是区块头。 区块头存储结构化的数据,大小是80字节;而区块主体利用一种神奇的树状结构,记录区块挖出的这段时间里所有交易信息,所需空间比较大。平均来讲,假设一个区块内有400笔交易信息,区块主体可能比区区块头中的参数信息规定每一个小账本在一条链的具体位置,让一个个没有关系的小账本组成了一个先后顺序严格确定、不可篡改、不断生长的区块链。 默克尔树的根哈希存储方式,既让区块链可以快速发现信息被篡改,又可以快速定位到具体的交易信息。 区块链的众多功能都在区块头的参数里得意体现。要想透彻了解一条区块链,就需要仔细研究分析它的区块头中的信息。 虽然区块头比区块主体小,但区块头总归是脑袋,大部分功能其实都由区块头实现。 三、区块体 对于矿池,它有两种模式,一种模式是老板个人投资,还有就是他投资了一部分矿机,然后负责托管其它矿机,或者进行算力出租等。目前,没有看到有学者去研究,我觉得这个其实很有意思。 比如我买了一些矿机,向社会融资,融了资以后,你的那笔钱可能就变成了几个矿机放在那里,根据它对应算力的比例,分配给你挖出来的币。其实这就涉及到一个民间融资相关法律的规范问题。 对于公有链,Axitrader返佣http://www.fx61.com/brokerlist/axitrader.html以及监管机构似乎还没有认真去思考法律上以及监管上的应对方式。其实这涉及两个阶段, 在公链脱离项目方之前,或者项目方能够长期控制公链运行的时候,从责任承担的主体来看是清晰的,看他有没有故意设置一些恶意的代码啊。如果没有的话,可能承担较少的责任。如果这个公链的项目方是完全匿名,甚至无法追查(比如中本聪),那么实质上也很难确定责任。 当公链正式运行脱离项目方掌控之后,就像比特币区块链网络系统一样,这时候它已经没有一个特定的主体为它的运行来承担责任负责。现在法律上和监管上可能都没有合适的应对方式。 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>>
如今,从理发师到在股市工作的朋友,人人都在谈论比特币。别担心,这篇文章不是那种讨论如何从比特币中赚钱的文章,我将努力帮助你理解比特币的基层技术,以及区块链在未来几十年里如何发挥作用。 历史回顾 2008年10月31日,一个名为Satoshi Nakamoto的匿名人士(或组织)发表了一份白皮书,介绍了一种不涉及任何金融中介机构、直接从发送方到接收方汇款的新方法。 文中给这个概念起了个名字——比特币。由于比特币使用了密码学的一些基本概念,这种新的货币交换方式被归类为加密货币。比特币的唯一用途是用于金融交易,但研究人员意识到,可以利用它的基础技术构建其他安全可靠的应用程序,从而彻底改变当前系统的工作方式。 “区块链”就是这个基础技术的名字。你觉得有很多专业词汇?没关系,让我们来简化一下! 什么是区块链?——类比真实世界 想象你住在一个城市,这个城市有一个可以同时停放200辆车的大停车位(假设只有一层)。这个停车位有一个大门,大门是锁着的,只有当有车辆进出时才会打开。现在让我们从不同的角度来分析这个单层的停车场建筑: 价格 :由于一些私人企业建造了这个专用停车位,所有的维护费用将由业主公司承担,所以出租一个停车位将会有很高的租金。 安全 :如果小偷进入大门,他们可以很容易地进入你的车(取走车轮燃料,或损坏刹车等任何东西!) 限制 :如果你所在城市的汽车数量从200辆增加到300辆会怎样?停车位将没有足够的空间容纳所有的汽车,一些其他的私人机构将不得不建造一个新的停车位。 信任 :你信任停车位公司,他们有责任确保车子的安全性和可靠性。 集中式 :因为所有的车都在一栋楼里,我们可以把它当成一个集中式停车场。 现在,让我们修改当前的场景。想象一下,你的城市里有200个住户,所有人都有两个车库。简单来说,我们假设每个住户只有一辆车(所有的车都填满了上面描述的大停车位)。所以,每户都有一个空车库。现在,假设这个城市的人们决定把多余的车库出租给任何需要停车的人。这种提供停车位的模式将解决200辆或更多汽车停车问题,而不需要为整个城市建造任何更大的中央停车位。与前面的场景类似,我们来分析一下这个场景: 价格 :由于第二个车库不是专门出租的,而且维修费用也比较低,所以相对于中央大停车位来说,多出的空间租金也比较低。 安全性 :每辆车都锁在不同的车库里,因此小偷必须打开所有车库里的门才能进入汽车,从而提供更多的安全性。(区块链中的安全性略有不同,但是为了简单起见,我们现在就这样考虑吧!) 限制 :随着房屋数量的增长,假设每个新房子都有额外的车库空间,那么容纳更多汽车的空间将持续增加,从而也增加了承租人和出租人间的联络网。 信任缺失 :由于没有中央机构控制这些分散的停车位,我们假设所有的车库业主在出租他们的车位时会制定一定的规则。 去中心化 :如前所述,这些停车位分布在整个城市,我们可以认为它是一个去中心化的停车场。 上面的类比为理解区块链的实际技术基础架构提供了基础。 停车模式到技术模式 这个停车模型用现实世界语言展示了区块链的基本概况。现在,让我们尝试将停车示例的组件与实际的技术模型匹配起来: 这个大型中央停车场是一个像AWS、Google Cloud等的集中系统(这些云平台也在一定程度上是分布式,但为了简单起见,我们将它们假设为一个单一的实体)。 汽车是数据和应用。 分布式停车场是一个分散的系统——区块链。 等等!我们似乎错过了一些东西。 不是所有的分散系统都是区块链!!是的,区块链是一种特殊类型的分散系统,具有独特的特性。哪种特性?我们来讨论一下。 “块”组成了区块链 让我们重新审视一下我们的分布式停车示例,并做一些小小的更改。我们假设一个特定车库的锁是当一辆车停在里面的时候产生的(假设同一辆车每天去同一个停车场)。另外,假设所有的分布式车库已经按顺序编号。50号车库的锁钥匙对是基于49号车库的锁钥匙对,也是基于50号车库内停放的汽车的特征(如颜色、重量、发动机编号等),这个过程从1号车库开始,一直持续到200号车库甚至更多。 每个车库的锁钥匙对取决于车库内汽车的功能和前一个车库的锁钥匙对。 因此,如果一个小偷试图进入49号车库并修改车子的特征时,说出它的颜色或注册号,停在49号车库的车的特点将会改变,这也意味着一个新的49号车库的锁钥匙对将会生成。因为50号车库的锁钥匙对取决于49号车库的锁钥匙对,50号车库的锁钥匙对也将改变,其他的车库也一样。 现在,让我们做一个最后的假设。假设计算一个锁钥匙对需要大量的计算资源,这意味着如果任何一个小偷修改了任何汽车的任何特征,我们必须重新计算这些对,这将是几乎不可能的。 如果一个锁钥匙对改变了,会发生什么? 希望你还记得我们说过的所有的车库主人都要遵守一些规则? 这些规则之一就是检查一个有效的车库。如果你可以验证一个车库的锁钥匙对,那么这个车库就是有效的。如果任何一个锁钥匙对被更改,那么之后的所有车库的锁钥匙对都是无效的,因为每一个锁钥匙对都依赖于前一对。(与生成锁钥匙对相比,验证特定车库的锁钥匙对的过程非常快)。 这种一个对取决于前一个对的形式组成了一个车库链,在技术世界中,这些车库是“块”,因此得名区块链(一串积木链)。 区块链中的块通过hashes连接到下一个块,就像我们的示例中的锁钥匙对一样。与车库示例类似,如果修改了一个块中的hashes,那么需要重新计算下面所有块的hashes,因为计算hashes是一个非常耗费资源的操作,所以实际上不可能做到这一点,因此网络会排除无效的块。hash的计算过程被称为挖掘,我们将在本系列的下篇中详细讨论它。 如何从修改中恢复块? 在区块链网络上的所有计算机,都会保留一个完整的区块链副本,因此,如果一个特定计算机或多台计算机上的一个块或一个完整的链被修改,整个网络会试图与自己的完整副本链进行比较。 如果网络上的大多数节点(或计算机)发现修改后的链是无效的,则将修改后的链替换为来自其他节点的有效链,这使得区块链中51%的节点可能受攻击。简单地说,如果网络上超过50%的节点是恶意的(或者有一个修改过的链),那么整个网络都可能受到攻击。 结论 唷!!有很多信息需要消化。这是完整的初学者指南的第一部分,提供了基本的区块链基础。我希望这篇文章能为你和你的朋友讨论区块链时提供帮助。请查看本系列的下一篇,其中我们将讨论Ethereum、智能契约和挖掘。 原文链接: https://medium.com/@_sidharth_m_/beginners-guide-to-blockchain-explaining-it-to-a-5-years-old-772caac6ae97 欢迎点击“ 京东云 ”了解更多精彩内容 以上信息来源于网络,由“京东云开发者社区”公众号编辑整理,不代表京东云立场。
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 本文主要介绍PBFT算法的垃圾回收、视图变更机制及状态机不确定性问题的解决等。 1. 垃圾回收 本部分介绍PBFT算法的垃圾回收机制。 1.1 概述 本节介绍从本地日志中删除历史消息的机制。 对算法来说,为了保证安全性,每个副本节点需要保证如下两点: 对于每个请求来说,在被至少f+1个正常节点执行之前,所有相关的消息都必须记录在消息日志中; 同时,如果一条请求被执行,节点能够在视图变更中向其他节点证明这一点。 此外,如果某个副本节点缺失的一些消息正好已经被所有正常节点删除,则需要通过传输部分或全部的服务状态来使节点状态更新到最新。因此,节点需要某种方式来证明状态的正确性。 如果每执行一次操作,都生成一个状态证明,代价将会很大。因此可以每执行一定数量的请求后生成一次状态证明,例如:只要节点序号是某个值比如100的整数倍时,就生成一次,此时称这个状态为检查点。如果一个检查点带有相应的证明,我们则称其为稳定的检查点。 1.2 稳定检查点的生成 如上所述,一个带有证明的检查点被称为稳定的检查点,这种证明的生成过程如下: 1、副本节点i生成一个检查点之后,会组装检查点消息,并全网广播给其他所有副本节点,检查点消息格式如下: , 这里n指的是生成目前最新状态的最后一条执行请求的序号,d是当前服务状态的摘要。 2、每个副本节点等待并收集 2f+1 个来自其它副本节点的检查点消息(有可能包括自己的),这些消息有相同的序号 n 和摘要 d。这 2f+1 个检查点消息就是该检查点的正确性证明。 一旦一个检查点成为稳定检查点后,节点将从本地消息日志中删除所有序号小于或等于n的请求所对应的预准备、准备和确认消息。同时,会删除所有更早的检查点和对应的检查点消息。 检查点的生成协议可以用来移动低水线 h 和高水线 H: h的值就是最新稳定检查点所对应的稳定消息序号; 高水线 H = h+k,这里k要设置足够大,至少要大于检查点的生成周期,比如说:假如每隔100条请求生成检查点,k就可以取200。 2. 视图变更 PBFT算法运行过程中,如果主节点失效了,为了保持系统的活性(liveness),就需要用到视图变更协议。 2.1 视图变更的触发 由于主节点失效时,客户端最终会将请求发送到所有其他副本节点。每个节点收到客户端请求后,如果该请求没有执行过,副本节点判断自己是否为主节点,不是的话就会把请求转发给主节点,同时启动一个定时器(假如之前没有启动过的话)。 如果请求在定时器时间间隔内执行完,则节点会停止定时器(不过如果此时节点恰好在等待执行另外一个请求,则会重启定时器);否则,节点会尝试触发视图的变更,具体过程如下节所示。 2.2 视图变更协议 对于副本节点i来说,假设其当前所处的视图编号为 v ,经由视图变更协议,从视图 v 变更到 v+1。 视图变更过程中,节点将不再接受其他任何类型的消息,只接受 checkpoint, view-change, 和 new-view 消息。 视图变更过程如下: 1. 节点组装 VIEW-CHANGE 消息并广播给全网其他所有副本节点。 VIEW-CHANGE消息的格式如下: 消息中的各字段含义如下: v+1: 要变更到的目标视图编号; n: 对应于节点已知的、最新的检查点 s 的请求序号; C:包含 2f+1 个检查点消息的集合。这些检查点消息用于证明检查点 s 的正确性; P:是一个集合,现在来解释一下其包含的信息。 对于任何一条客户端请求 m ,如果 m 在当前副本节点 i 上已经准备好, 即 prepared(m, v, n', i) 为 true, 并且 n' > n,那么根据定义,节点上已经存储了对应的预准备消息和 2f 个与之匹配的、有效的发自不同的节点的准备消息。这里,匹配的含义是:拥有相同的视图,消息序号以及 m 的摘要。我们把这些预准备 消息和准备消息组成的集合记为 。 P 就是所有 组成的集合。因此,P 包含了所有在副本节点上准备好的、序号大于 n 的请求的预准备和准备消息。在视图变更中,其提供的信息便于在新的视图中重新分配每条请求的消息序号。 2. 每个节点相继广播各自组装的 view-change 消息。同时,新视图中对应的新的主节点将收集来自其他副本节点的 view-change 消息。当其收集到 2f 个有效的 对应新视图 v+1 的 view-change 消息后,将组装并广播 new-view 消息,格式如下: 其中,V是一个消息集合,包含所有有效的、对应于新视图 v+1 的 2f+1 个 view-change 消息(包括主节点自己组装的)。而 O 则是主节点为各 view-change 消息中包含的、符合要求的请求组装的预准备消息的集合。 O中的消息按如下方式组装: 首先,根据 V 中各条view-change 消息中包含的预准备和准备消息,主节点先找到最新的稳定检查点,将其对应的消息序号赋值给 min-s;然后从所有准备消息中找到最大的那个消息序号,将其赋值给 max-s; 然后,对于min-s 和 max-s 之间的每一个消息序号 n, 主节点为其组装位于视图 v+1 上的预准备消息,这分为两种情况: a) 在 V 中存在某个或多个 view-change 消息, 它们的 P 集合中的某个集合元素包含的准备消息中包含有对应于序号 n 的消息。 此时,主节点组装的预准备消息如下: 其中,d 是V中特定请求消息的摘要,并且该请求在 V 中的一个最新视图上的预准备消息中被分配了序号 n 。 b) 另外一种情况,是 V 中不存在和 n 对应的准备消息。此时,主节点只是模拟为一个特殊的空请求(null request)组装一个预准备消息: 其中,D(null) 为空请求的摘要。空请求和其他请求一样进行三阶段协议,但是其执行就是一个空操作(noop)。 3. 主节点广播 new-view 消息后,也会把 O 中的消息写入本地消息日志中。同时,如果主节点本地的最新稳定检查点的消息序号落后于 min-s 的话,则会将 min-s 对应的检查点的证明,也就是相应的检查点消息写入消息日志,并按之前介绍的垃圾回收机制删除所有的历史消息。 4. 此时,主节点正式变更到新视图 v+1, 开始接收消息。 5. 每个副本节点收到针对 v+1 视图的 new-view 消息后,会进行校验,是否满足以下条件: 签名正确; 其中包含的 view-change 消息是针对 v+1 视图,并且有效; 集合 O 中的信息正确、有效。节点判断有效与否的方法是进行类似于主节点生成 O 那样的计算。 如果校验通过,副本节点会将相关信息写入到本地日志中。 同时,针对 O 中的每一条预准备消息,组装并广播对应的准备消息,并且把准备消息写入到本地消息日志中。 此时,副本节点也如同主节点那样,进入到新视图 v+1 中。 之后,在新的视图中,针对所有序号位于 min-s 和 max-s 之间的请求,系统会重新运行三阶段协议。只不过对于每一个副本节点来说,如果当前确认的请求之前已经执行过的话,节点就不再执行该请求。每条被执行的请求,其相关信息会被存储在本地。节点根据这些信息确定请求的执行情况。 以上完成了对视图变更的介绍。 2.3 视图变更中节点的信息同步 视图变更时,由于 new-view 消息中并不包含原始的客户端请求,因此副本节点可能缺失某条客户端请求 m ,或者某个稳定的检查点。 此时节点可以从其他副本节点同步缺失的信息。例如,假如节点 i 缺失某个稳定检查点 s ,这个检查点在 V 中可以找到相应的证明,也就是 对应的 checkpoint 消息。由于总共有 2f+1个这样的消息,而错误节点最多 f个,因此至少有 f+1 个正常节点发送过这样的消息。因此,可以从这些正常节点获取到对应的检查点状态。 对于副本复制服务的状态来说,可以通过生成不同的检查点来划分状态。当节点需要同步状态时,只需按检查点来获取即可。这可以避免一次发送整个服务状态。 3. 关于状态机的不确定性 PBFT算法基于状态机副本复制服务,状态机要求每个节点的状态必须是确定性的。而大多数服务有时会有某种形式的不确定性。例如,对于网络文件系统而言,如果不基于状态机副本复制的话,文件的最后修改时间这个属性可以设置为服务器的本地时间。但如果是每个副本节点独自设置这个时间的话,就会导致各节点状态的不一致。 因此,需要相应机制来确保各节点使用相同的值。一般情况下,这个值不应该由客户端来决定,因为客户端拥有的信息并不完全。例如,多个客户端并发发送请求时,它们并不知晓其请求如何被排序。 可以由主节点来选取这个值,具体有两种方法: 1. 第一种方法适用于大多数服务,由主节点独立选取非确定的值。 主节点将该值和客户端请求拼接在一起,然后运行三阶段协议,确保所有正常节点就请求和该值的序号达成一致。这可以防止出现下列情况: 失效的主节点故意向不同的副本节点发送不同的值,从而使各个节点上的状态出现不一致。 对于这种方法来说,虽然所有正常节点使用相同的值,但这个由主节点发送的值可能是错误的。这种情况下,要求每个副本节点必须能够基于其状态来明确地判断该值的正确性,以及如何处理可能的错误值。 2. 第二种方法是该值的选取由各副本节点一起参与。这种方法要求在三阶段协议基础上额外增加一个阶段:主节点收集各副本节点发过来的、可验证来源的、共计 2f+1 个值,并把这些值和客户端请求拼接在一起,然后运行三阶段协议。 之后,每个副本节点基于这些值和各自的状态进行确定的计算,从而得到 所需选取的值。这种计算可以是类似于求中位数等。 相关阅读: PBFT算法流程 本文结束,下篇文章将分享PBFT算法流程补充(二),关注我们,第一时间获取分享! 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 从定义上看,两者似乎没有直接的联系,但是贝宝金融beibaojinrong以为,区块链作为一种资源存在,具有按需供给的性质,也是云计算的组成部分之一,两者之间的技术是可以相互融合的,达到效用最大化的。 其一,云计算可以利用自身已经成熟的基础架构或根据实际需求做出相应的反应,从而加速开发应用流程,来满足未来区块链技术的在各个领域的深入发展。其二,“信任度、可靠度、可控制度”是云计算发展需要跨越的三大障碍,利用这些优势和传统云计算技术相结合,将实现基于区块链的分布式计算领域的一些突破。 云计算内的存储和区块链内的存储都是由普通存储介质组成。而区块链里的存储是作为链里各节点的存储空间,区块链里存储的价值不在于存储本身,而在于相互链接的不可更改的块,是一种特殊的存储服务。云计算里确实也需要这样的存储服务。比如结合城市服务,将数据放在这种类型的存储里,利用不可修改性,让视频、语音、文件等作为公认有效的法律依据。 云计算里的安全主要是确保应用能够安全、稳定、可靠的运行。这种性质的安全是在传统安全领域范畴,而区块链内的安全是确保每个数据块不被篡改,数据块的记录内容不被没有私钥的用户读取。从贝宝beibao,Swift Code,银行代码,Swift代码www.gendan5.com/swiftcode.html,中国顶级加密货币金融服务提供商角度出发,如果云计算和基于区块链的安全存储产品结合,就能设计出加密存储设备,个人信息的保密性也将得到提高。 云计算内的存储和区块链内的存储都是由普通存储介质组成。只是相应管理物理介质的“文件系统”有所差异。最大的区别是区块链的文件系统可以写和读数据,但数据一旦写入就不能修改和删除。同时还会采用海量的独立副本来确保数据的不可修改性和数据的完整性。区块链存储的重点不在是”块“,而是在于“链”。通过链来确保记录内容的不可修改性,是一种特殊的存储服务。云计算里确实也需要这样的存储服务。如果一定让我来写关于区块链应用的白皮书,我觉得这才是真正的应用点。比如结合”平安城市“,将数据放在这种类型的存储里,利用不可修改性,让视频、语音、文件等作为公认有效的法律依据。 云计算里的区块链的存储服务实现有2种实现方法,第一种是将数据块直接记录在区块链里,第二种是将记录的数据块进行哈希,将哈希值记录在 云计算里的安全主要是确保应用能够安全、稳定、可靠的运行。这种安全属于传统安全领域范畴。而区块链内的安全是确保每个数据块不被篡改,数据块的记录内容不被没有私钥的用户读取。利用这一点,如果和上面介绍的基于区块链的安全存储产品结合,就能设计出的加密存储设备。 管理和协同 区块链技术如何应用于云计算? 数据隐私保护。用户将自己数据上传到云端,首先面对的就是个人信息的安全问题,同时也存在用户数据被泄露的风险,而区块链技术中应用到的密码学技术,将用户上的隐私传数据加密。当个人隐私数据需要读取时,要经过用户的身份认证才可以正确获得解密数据,并且数据各种的操作记录都会被记录到区块链上,可以随时查看。 目前区块链方面的云计算服务,是提供的一些基础的计算、存储、分布式 CDN 等服务。大部分集中在 IaaS 层,其中也有一部分是 PaaS 和 SaaS 层。比如迅雷推出的私人云盘产品;以及用户通过贡献带宽和存储,获得最直接的回报——“链客”等。 但不得不说的是,由于区块链技术带来的“币圈”成为了众多区块链大佬“割韭菜”的镰刀,因此区块链技术也饱受质疑,但是技术本无罪,能够为生活带来更多的便捷,为用户提供安全、稳定服务的技术就是值得在国家监管的框架内推广的。 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> //bitbay.net/en/exchange-rate/bitcoin-price-usd 币安(binance)API接口 //api.binance.com pandas join,merge, concat 函数 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 一、安全加密 通俗将比特币的匿名性是因为它不需要你证明你是你,只要密码没错就可以完全控制此账号。而开通新账号(比特币地址)也不需要拿一堆资料做实名认证等,你可开通上万账号而不用任何证明,保管好密码(密钥)就行。所以比特币监管难,很难知晓这个账号属于谁,更无法限制此账号的交易。净给党找麻烦 新手入门了解比特币跪荐这个牛逼的答案:比特币是什么。后续我将发布新的答案让大家了解比特币,先给赞,才有动力哈:)。题主说“我现在想购买1个比特币,那我支付的时候应该要用到微信、支付宝或网银吧”,这个也没错,怎么才能拥有第一个比特币呢?题主想到的是怎么我得用钱去买呀,既然有交易记录就能追踪。实际上你是没法拿钱直接购买比特币的!有几种方式购买比特币:找好基友,一手交钱一手交货,他给你的比特币账号上转载1个比特币,你看到你的比特币多了1个币后,你再从微信或者什么的给他发红包。到比特币交易所上注册账号(如同炒股),你往你交易所账上打人民币,再请求交易所买入比特币一枚,交易所便可收下你的人民币,等其他卖家卖出比特币后,卖家收到人民币减少比特币,而者一个比特币便流向你的比特币账号。如果你是大明星,告诉你的百万粉丝们,我的比特币账号是0x0234.... ,那么你的死忠粉便会积极的将他比特币转账给你。拿到别人的比特币账号的密码,你就可任意践踏TA的账号了,转账/买东西等等。综上,题主首先想到的买比特币的途径是一种很自然的那钱买卖商品的逻辑,当然还你许多其他方式。如何保证匿名性,是可以做到的,但一般人很难做到。如,今年7月份爆发的比特币勒索病毒,FBI是可以监控这个比特币地址的所有交易信息的,一但有与现实相关的交易,边可顺藤木瓜。所以这个勒索者都不敢轻易动比特币。外汇经纪商对比http://www.fx61.com/brokerlist对于我们大众来说,这个匿名性会比现有的所有交易形式都高,对于个人来说足够。通常比特币被认为是一个匿名的支付网络。但事实上,比特币可能是世界上最透明的支付网络。同时,如果使用得当,比特币可以提供可接受的隐私性。永远记住养成良好的习惯来保护你的隐私是你自己的责任。而比特币的最大特性不是匿名性而是用最快的传递速度来形成平等财富的转移进而去消除世界上各式各样的意识形态。(等我以后的回答,整理中) 二、数字签名 从根本上来说,数字签名是一种确保电子文档(电子邮件、电子表格、文本文件等)真实可靠的方法。“真实可靠”的含义是:您知道文档是谁创建的,并且知道在作者创建该文档之后,没有人对其进行过任何形式的修改。 在数字签名中,私钥由我掌握,是消息所有者的标志,公钥公开给其他人,用于大家验证发送者身份以及消息是否被篡改。完整的数字签名由签名和验证两个组成部分组成,签名过程消息发送方需要同事提供方数字证书的私钥及公钥将消息加密型成功签名发送给消息接收方,验证过程则由消息接收者通过公钥对消息发送者及信息真伪进行辨别。 在数字签名中客户的公钥是其身份的标志,当使用私钥签名时,如果接收方或验证方用其公钥进行验证并获通过,那么可以肯定,签名人就是拥有私钥的那个人,因为私钥只有签名人知道。 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 一看懂这张图你就基本看懂了南非金矿 注册直接扫码
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 一、前言 自从比特币大火之后,挖矿就非常流行,由许多人都购买矿机挖坑。许多人说采矿很难,可是采矿不就是用计算机算出哈希吗,这正是计算机的强项啊,怎么会变得很难,迟迟算不出来呢? 二、区块链难度系数 区块链的难度系数:是设计区块链挖矿难易的关键因子,难度系数越低,挖矿越容易。难度系数越高,相应越难。例如比特币的难度系数是18。 难度系数一般是hash值的前置0的个数。 java 区块链中设计合理的难度系数 例如难度系数定为6,也就是区块的有效hash,必须前面有6个0 例如难度系数为6的有效hash为: 00000048bfdc5e67aa448686438f1350a6cc7f4477feb5562b0368a808fdef57 具体代码实现也很简单: /** * * 类名:BlockService.java * 描述:区块服务 * 时间:2018年3月12日 下午7:05:06 * * @author cn.wenwuyi * @version 1.0 * @param hash 区块hash * @return boolean */ private boolean isValidHashDifficulty(String hash) { //定义难度系数 int dificutty = 6; //定义标志符0(当然也可以定义其他,一般是0) 外汇保证金http://www.fx61.com/definitions/muniu/466.htmlchar zero = '0'; int i; for (i = 0; i < hash.length(); i++) { //获得hash字符串的i位置的字符 char ichar = hash.charAt(i); //如果i处的值不为0则跳出 if (ichar != zero) { break; } } //判断i是否大于等于难度系数,返回即可 return i >= dificutty; } Hash 的有效性跟目标值密切相关,只有小于目标值的 Hash 才是有效的,否则 Hash 无效,必须重算。由于目标值非常小,Hash 小于该值的机会极其渺茫,可能计算10亿次,才算中一次。这就是采矿如此之慢的根本原因。 区块头里面还有一个 Nonce 值,记录了 Hash 重算的次数。第 100000 个区块的 Nonce 值是274148111,即计算了 2.74 亿次,才得到了一个有效的 Hash,该区块才能加入区块链。 三、难度系数的动态调节 比特币选择10分钟来产生区块,也就是1/600 BPS (Blocks/Sec),这个是根据具体设计而制定的, 也是人为的选择。而比特币的交易处理速度最高为:7 TPS (Transactions/Sec), 这个是整个交易验证机制、共识机制,和P2P通讯机制,以及代码实现后所达到的一个技术上限。相比而言,以太坊目前是1/20 BPS和20 TPS,维基链是1/10 BPS和1000+TPS。对于POW共识机制的公链来说,BPS是通过变更挖矿的难度系数来动态调节的。然而对于DPOS机制的公链,BPS是恒定的。 矿具有随机性,没法保证正好十分钟产出一个区块,有时一分钟就算出来了,有时几个小时可能也没结果。总体来看,随着硬件设备的提升,以及矿机的数量增长,计算速度一定会越来越快。 为了将产出速率恒定在十分钟,中本聪还设计了难度系数的动态调节机制。他规定,难度系数每两周(2016个区块)调整一次。如果这两周里面,区块的平均生成速度是9分钟,就意味着比法定速度快了10%,因此接下来的难度系数就要调高10%;如果平均生成速度是11分钟,就意味着比法定速度慢了10%,因此接下来的难度系数就要调低10%。难度系数越调越高(目标值越来越小),导致了采矿越来越难。 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 一、区块链简介 什么是区块链? 举个例子来说:区块链就好比是一个特殊的谷歌电子表格,它被世界上每台计算机共享,并连接到因特网上。每次发生事务时,它都会被记录到这张电子表格的一行中。 区块链到底是啥?区块链为何这么重要?区块链技术的未来如何? 任何拥有移动设备或计算机的人都可以通过互联网连接并访问这张电子表格。任何人都可以查看并将事务添加到此电子表格中,但不允许任何人编辑已经存在电子表格里的信息。 就像这个电子表格有“行”一样,区块链有“块”。 块是数据的集合。通过按时间顺序一个接一个地连接数据块,每一块数据都被添加到区块链中,这与电子表格的一行接一行非常相似。 这一系列的连接块一个接一个,使它成为一个块链(即一个区块链)。 这里要强调的一个概要:区块链是一个全球在线数据库,任何人在任何地方都可以使用它。因为它存在于互联网上,所以它是“去中心化的”,这意味着区块链分类账在全世界所有的计算机之间共享,而不是在一个中心位置。 二、区块链共识机制 区块链常被大家称为传递信任的工具,而这信任背后所依赖的就是共识机制。可以将区块链看作是一个全民参与的分布式账本,那么就需要制定一套大家认可接受的规则来解决“怎么记账有效”、“选谁来记账”的问题,而这套规则就是区块链的共识机制。 为了方便理解,我们来举个例子。一个寝室六人准备去聚餐,通过商议,选择吃火锅,那么吃火锅就是大家形成的共识。而商议的方式,少数服从多数就是大家确定就餐地方的共识机制。 在区块链的世界里,因其本身去中心化的特性,导致并没有一个像银行一样的中心记账机构来保证链上所有的记账内容保持一致,因此如何让全网达成共识就显得至关重要。共识机制就是用来解决这一难题的,可以说共识机制是分布式系统的核心。 而在共识机制中,PoW、PoS、DPoS,分别代表区块链网络的三种主要记账规则,它们的作用非常大,直接关系到记账权和相关收益的分配。下面为大家逐一介绍这三种主要的共识机制。 三、工作量证明机制(POW) POW共识机制由算力决定记账权,按照持有的算力占总算力的百分比来决定获得该次记账权的概率。节点需要不断消耗算力工作,进行哈希计算,以找到期望的随机数。验证节点被称为“矿工”,随机数查找过程称为“挖矿”。“挖矿”有三个重要功能:发行新的货币、维护系统的支付功能、通过算力保障系统安全。 工作量证明机制被认为极其消耗能源,而且是将电能无谓地转化为热能白白消耗掉。因此另一种POS机制的加密货币逐渐风靡。天空币、Byteball、IOTA等非链区块链也为解决比特币耗能而应运而生。 工作量证明机制即对于工作量的证明,是生成要加入到区块链中的一笔新的交易信息(即新区块)时必须满足的要求。在基于工作量证明机制构建的区块链网络中,节点通过计算随机哈希散列的数值解争夺记账权,求得正确的数值解以生成区块的能力是节点算力的具体表现。 工作量证明机制具有完全去中心化的优点,在以工作量证明机制为共识的区块链中,节点可以自由进出。大家所熟知的比特币网络就应用工作量证明机制来生产新的货币。然而,由于工作量证明机制在比特币网络中的应用已经吸引了全球计算机大部分的算力,其他想尝试使用该机制的区块链应用很难获得同样规模的算力来维持自身的安全。同时,基于工作量证明机制的挖矿行为还造成了大量的资源浪费,达成共识所需要的周期也较长,因此该机制并不适合商业应用。 四、权益证明(POS) POS共识机制由持币数以及持有的时间来决定记账权。持有币数及持有的时间占系统总量的百分比,决定获得该次记账权的概率。 权益证明使用伪随机选举来选择作为下一个区块验证者的节点,基于包括币龄,随机化和节点资产等多种因素。 值得注意的是,在权益证明系统中,区块被称为“锻造”而非挖掘出来。使用权益证明的加密货币通常首先销售一些预先开采的硬币,或是在启动时先使用工作量证明算法,然后切换到权益证明。 在基于工作量证明的系统中,矿工的奖励是越来越多的(被挖出的)加密货币,而权益证明的系统中奖励通常是交易手续费。 想要参与到锻造过程的用户需要先将一定数量的币在网络中锁定作为他们的股权。一个节点股权的多少决定了它被选为下一个区块验证者的机会 - 股权越多,机会越大。为了防止在这个过程中网络不会偏向最富有的节点,选择过程中有一些特殊的步骤。两种最常用的方法是“随机区块选择”和“币龄选择”。 在随机区块选择中,通常通过查找同时有最低的散列值和最多的股权的节点作为验证者,由于股权的数量是公开的,因此下一个锻造者可以被其他节点预测。 币龄选择根据股份的时间长短选择节点。币龄的计算方法是作为股权的币的数量乘以作为股权的天数。一旦一个节点锻造了一个区块,它的币龄就会重置为零,并且还需要等待一定时间后才能锻造下一个区块 - 这样防止股权多的节点垄断区块链。 每一个使用权益证明算法的加密货币都有自己的一套它们认为对自己和用户最好的规则和方法 当一个节点被选为锻造下一个区块时,它首先将检查块中的事务是否有效,然后对块进行签名并将其添加到区块链中。作为奖励,节点获得了这个区块中事务的手续费。 如果一个节点想停止锻造者的身份,那么它的股权和所得的奖励将在一段时间后被释放,从而使网络有时间验证该节点是否向区块链中添加了假区块。 它必须代表的是一种权利,一种固有和内在的价值,第二是加密,也就是说通证的真实性、防篡改性、保护隐私等能力,由密码学予以保障。每一个通证,就是由密码学保护的权利。这种保护,比任何法律、权威和枪炮提供的保护都更坚固、更可靠.第三是可流通,也就是说通证必须能够在一个网络中流动,从而随时随地可以验证。所以明白了通证经济的三要素,就应该知道该不该整治这些点赞乱象股份授权证明. 五、DPOS共识机制 DPOS共识机制是一种基于投票选举的共识算法,类似于代议制民主。在POS的基础上,DPOS先选举若干代理人,由代理人验证和记账,代理人之间轮流出块。DPOS相比POS能大幅度提升选举效率,在牺牲一部分去中心化特性的情况下得到性能提升。 第一,目前已经有成功运行数年,发展相对成熟的DPoS项目。比如,比特股和Steem。 第二,越来越多的币种开始采用DPoS作为共识机制。EOS、Nano(XRB)、LISK、ARK、Aelf、阿希、闪电比特币……大势所趋,挡也挡不住。 第三,完全的去中心化真的有必要吗?如果你读过《人类简史》,应该知道,让人类或者说智人逐渐融合的,有三股最大的力量,即经济上的货币秩序、政治上的帝国秩序、宗教上的全球性宗教。由此可见,经济、政治、宗教(或者说人的心灵)从来都是一个整体,不可孤立看待。 去中心化,一个多么诱人的字眼。在看到的一瞬间,就会联想到民主、平等这些美好的字眼,而中心化则对应着独裁、专制等不好的含义。 但很多人并不清楚,“民主”二字,在历史上相当长的一段时间内,都不是一个褒义词。因为民主,往往意味着“多数人的暴政”。曾几何时,雅典人实施了比今天更为去中心化、更为激进的雅典式民主,万人公民大会,500人民众法庭……哲学之父苏格拉底,就是死于这样的审判 。 或许你不愿相信,但目前美国的政治制度,相对比较先进。即代议制民主,民众投票选举议员,议员组成国会,为国家掌舵。 六、混合证明机制 采用工作量证明机制POW发行新币,采用权益证明机制POS维护网络安全。较典型的就是以太坊采用POW+POS混合共识机制。 如何在公链中建立高效的互信的共识机制,成为世界性的难题. 混合算法于是应运而生,即把两种甚至多种共识机制运用在同一区块链公链的底层机构中,其中,初链的解决方案别出心裁,它结合了一种改进版的PBFT(实用拜占庭)和POW(工作量证明)共识。PoW:(Proof of Work)即工作量证明,根据矿工的工作量对数字货币进行分配,矿机的性能越高,数量越多,工作量越大,得到的数字货币就会越多。Pow共识确保了激励和委员会的选举,而实用拜占庭容错系统降低了拜占庭协议的运行复杂度,天然气代码http://www.kaifx.cn/mt4/kaifx/1788.html从指数级别降低到多项式级别,使拜占庭协议在分布式系统中应用成为可能,是一种状态机副本复制算法,即服务作为状态机进行建模,状态机在分布式系统的不同节点进行副本复制,每个状态机的副本都保存了服务的状态,同时也实现了服务的操作。它承担一种具有瞬时处理高吞吐量事务、交易验证、公平交易委员会的成员轮值公牛的高效共识机制,以及作为一种补偿基础设施去处理不同的基础设施。保留PBFT记录账本的机制不动,将超级节点的选取开放给公链,利用POW协议作为准系统支持超级节点的动态选取和协议达成,将超级节点社区的组建由私有链与联盟链性质转换为公有链性质。 七、区块链发展意义 1.可信存证和查询:区块链提供了链上数据不可篡改、共享可查的链上记录等能力,百度云在数字版权、信息共享平台等区块链应用领域拥有场景实践。 2.可信的积分激励型应用:百度云结合度宇宙、绿洲等Dapp实践,拥有合规框架下的通证激励解决方案。 3.数字资产发行和唯一性保障:莱茨狗是典型的高性能数字资产游戏应用,百度云提供了云端构建数字资产应用的全套方案。 4.多方协作,信任达成,附加金融:区块链提供了多方信任和数据共享机制,百度云在资产证券化、供应链金融、信用卡催收等方向拥有落地实践。 5.清算、结算和支付:百度在区块链平台技术的性能和安全性上持续发力,结合百度自研的超级链技术,在跨境支付和金融清算结算上拥有前瞻布局,拥有全面的区块链支付解决方案。 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 一比特币 比特币是2008年出现的第一个电子货币,是由中本聪发明的,目前尚不清楚中本聪是一个人还是一群人,不过它们解决了现代金融系统的根本问题: 1.让用户负责金融业务并拥有资金 2.消除交易中间商 3.减少费用 4.使交易透明化,能够防止腐败和削减开支 二、比特币客户端下载 Bitcoin Core 首次同步需要花费很长时间和下载很多数据。您应该确保有足够的带宽以及存储整个块链大小的磁盘空间(超过20GB)。如果你有一个良好的互联网连接,你可以保持您的电脑运行 Bitcoin Core 并且开放 8333 端口以帮助加强网络。 阅读完整的节点指南了解细节。比特币客户端间信息同步所依赖的底层技术原理实际就是P2P。一般第一次启动客户端时,会有一个预置的稳定运行节点(比特币模型下或许可以认为是一些大型矿机?)列表,启动时首先去连接这些稳定运行节点获取信息,运行过程中可以向自己的相邻节点请求相邻节点的相邻节点。总结起来就是初始启动有一个预置列表,之后的每次运行可以根据客户端策略保留特定量历史连接节点去连接。 Bitcoin Core客户端是一个由社区驱动的自由软件项目,基于MIT协议授权发布。 三、注册挖矿网站 你需要到挖矿网站注册(Register)一个帐号(Account),以便保存你的工作成果和收款地址。目前运作的比较好的有 BMP(按积分分配,服务器不稳定会影响收益份额) 注册好帐号后,可能需要点开电子邮件中地址或输入邮件中的确认码,以确认邮箱地址。在网站payment address中填入你的收款地址,将minimum payment(最小自动付款额)设置成0.01,以便尽快收到第一笔付款。 然后注册新的worker帐号(挖矿工人进程),因为每个人可能有多个计算机或多个计算进程可以使用外汇返佣http://www.fx61.com/,所以每个帐号下可注册多个worker。Worker通常有独立的用户名和密码,worker用户名一般是你的帐号名+自定义后缀,密码简单好记就好,worker的密码被别人知道也没有什么安全问题。注意不要和账户或邮箱密码相同即可。 四、比特币客户端操作技巧 以Windows 比特币官方PC客户端为例,打开下载好的安装程序,点击 NEXT。 点击Browse选择比特币钱包的安装地址。然后点击下一步继续操作。注:此地址并非钱包数据的更新地址。 安装会以进度条的形式显示安装进度,等待文件复制完成。 完成安装过程,点击Finish完成安装。勾选Run Bitcoin则立即运行。 找到 快捷方式 或者 开始菜单中的程序,点击运行钱包,会出现启动画面。这时候会自动为您产生一个账号,并开始尝试同步帐户信息,将会花很长时间。 找到存放钱包的目标目录,数据都存放在这个位置,因此可以去下载比较新的离线数据放到这里,然后在离线数据的基础上进行 增量更新,减少更新时间。 注意事项:注意备份自己的帐户,证书等丢失,比特币也会丢失。 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 近两年来,区块链技术的研究与应用呈现出爆发式增长态势,被认为是继大型机、个人电脑、互联网、移动/社交网络之后又一次颠覆式创新。区块链技术是下一代云计算的雏形,有望像互联网一样彻底重塑人类社会活动形态,并实现从目前的信息互联网向价值互联网的转变。相对比国际其他国家的行业发展,我国区块链行业起步稍晚,基础相对欧美稍弱,但从发展势头和潜力来看,我国区块链行业非常有可能实现像互联网及移动支付领域一样的超车。区块链应用有的可以在实体上体现出来,还有一些需要通过互联网平台体现出来,目前处于智能时代,从行业分布来看,金融及企业服务是主力军。 一、金融行业 二、人力资源行业 三、保险行业 四、房地产行业 五、医药行业 前段时间发生了疫苗造假事件,其问题根源在于,在封闭的药监体系内,制药企业可以随意更改工艺参数、产品记录等,作为药品使用者的普通人却没法介入监管,这导致造假屡次发生,而且难以找出是哪个环节出了问题。区块链技术是一种"历史记录不可篡改的数据库技术",它则为药品溯源提供了新的工具。 六、互联网行业 互联网时代,流量、数据为王,互联网大公司靠着这两样东西获利无数,但数据、流量的产生者——广大用户却没能得到分毫收益。而且时至今日,市场逐渐饱和,互联网产品的获客成本也越来越高,即使公司砸下大笔推广费,结果依旧收效甚微,而区块链与加密货币组合的出现则改变了这个困局。 七、汽车行业 其实在汽车行业所存在问题还是很多的,股票代码查询http://www.gendan5.com/topic/lcSearch.html尤其是在整合方面透露出的问题一直困扰着大家。若是将区块链和汽车行业结合在一起其实在汽车行业所存在问题还是很多的,尤其是在整合方面透露出的问题一直困扰着大家。若是将区块链和汽车行业结合在一起,就可以解决很多的问题。比如在制造汽车时候就可以将各个零件的安装情况都记录下来,这样车主既可以全面了解到整个汽车的具体零件,这样在维修、保养时候也更加方便。同时汽车的制造商还可以运用区块链记录这个注册车辆,跟踪车辆的所有权,这样可以更好的保护车主的权益。 八、共享交通 区块链可以用于创建分散式的点对点共享交通应用。让车主和使用者在没有第三方提供的情况下,以安全的方式制定条款明细。 九、慈善 关于慈善方面的抱怨包括效率低下和腐败,这都将妨碍善款到达受捐者的手中。使用区块链技术追踪捐款能让你确认善款的流向。 基于比特币的BitGive基金会等慈善组织使用区块链,从而保证分布式账簿透明 让捐赠者看到受捐者能收到善款。 十、公共福利 公共福利系统是另一个受到低效和官僚主义影响的行业。区块链技术可以以更加精简和安全的方式,帮助评估、核实和分配福利或失业救济。 以上这些只是先简单介绍,区块链在未来的功效及运行范围随着发展情况会更加广泛,也将会对社会的发展产生更多的影响。 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 摘要:在上一篇文章《 IPSE跨链:BABE共识算法工作原理简析 》中已经介绍了Babe算法,本文将阐述与之协同工作的GRANDPA算法的工作原理。 IPSE“星际搜索”是一个面向IPFS网络的搜索引擎,帮助用户快速搜索分布式网络上的文件,并快速访问。在IPSE的挖矿模型中,用户完成分发、存储等任务,为哈希内容添加语义标签,数据安全存储到IPFS网络,获得挖矿奖励。其token发行和转账依赖于EOS网络。由于区块链网络之间的互操作已经不可避免,数字资产的转换需要一个跨链通道,IPSE开启了2.0计划。 在现有基础上,IPSE将打造应用链,经过跨链系统,实现与其它区块链网络的互通,之后会完成资产映射,使效率提升。IPSE 2.0网络将基于现有的Substrate进行开发设计,连通Polkadot等网络。Polkadot是一个异构的多链架构,其本身也使用Substrate,而在底层,Polkadot使用到了IPFS协议栈的Libp2p协议。 IPFS(星际文件系统)作为一种分布式的超媒体传输协议,目的是构建一个去中心化结构的互联网,这和Substrate/Polkadot的愿景一致。 Polkadot愿景是为互操作性、安全性、可扩展性和创新提供最强大的平台。Polkadot的目标是在2019年底之前发布一条中继链和几条平行链以启动创世块。此后,网络将增加到大约100条平行链。IPSE将会使用到平行链技术,进行2.0网络的设计。为保证IPSE平行链和Polkadot系统的中继链的状态一致性,利用了混合共识机制,分别是BABE和GRANDPA。 GRANDPA:一个值得信赖的共识算法 比特币的工作量证明或其它协议有一个问题,即它们不提供异步安全性,这意味着足够大的攻击可能导致全网混乱。Polkadot为了实现异步安全,将区块的生成和确认进行分开。 Polkadot使用其原始的GRANDPA(基于GHOST的Recursive Ancestor Deriving Prefix Agreement)共识来建立一个更安全,更有弹性的网络。 在良好的网络条件下,GRANDPA几乎可以瞬间完成分块。在糟糕的网络条件下,比如网络分区,GRANDPA可以在分区解析时一次性完成大量的块(理论上是数百万个)。 GRANDPA背后的关键是将区块链的结构纳入共识算法。当考虑一个区块是否有效时,依赖于要考虑该区块的父块的有效性。此区块有效即父块有效,依此类推。另外,参与者不对单个区块进行投票,而是让参与者对他们认为有效的最高区块进行投票,并且GRANDPA算法将利用表决的方式将投票应用到之前所有的区块。之后GRANDPA算法将确定投票数量大于2/3的最佳区块,并生成最终证明(proof-of-finality)。最终证明是通过获得多数票并将它们捆绑在一起成为一条消息来构造的。 换句话说,只要有超过2/3的验证人证明链种包含了某个特定区块,所有和该区块的相联的区块也就获得最终确认。 那么拥有投票权的验证人会作弊吗?首先,验证人运行的时全节点,负责验证和增加区块到 中继链中,2/3保障只有符合全网大多数节点的利益的事物才会被确认。其次,在网络中还有提名人和校对人(钓鱼人)角色,验证人作弊将受到校对人的制约,并将失去提名人的信任。 总体上,BABE算法负责出块,GRANDPA算法负责确认,在2/3递归确定原则的进行下,区块整体效率就获得质的提升。中继链是Polkadot网络的核心,它确保平行链和平行链之间传递信息。信息可以是 交易或任何类型数据。IPSE 2.0平行链构建之后,在BABE+GRANDPA混合共识算法的作用下,将获得高的消息传递效率,并同时能共享共识安全。 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 最近整个区块链行业都比较激动,其他非区块链行业的企业也被这波热潮炒的蠢蠢欲动。其实,越是这个时候,越能沉下心做事的项目才有更大突破的可能。 不要以为一些事情的发生就是意为着全面支持,或许这意为着对违规、不合法的“区块链”项目会进行更加强力的整顿。 区块链项目不等同于虚拟币,通证只是区块链项目对应的激励机制,不是完全等于的关系。不要想靠着区块链这个名头去赚一波快钱。真正研究区块链技术和发展区块链生态的团队和社区才明白其中的痛苦和艰难,只能感受到利益的团队,或许只为了快速地获取短期利益…… 【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> / Windows服务 / -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值之间有空格) / 连接与断开服务器 / mysql -h 地址 -P 端口 -u 用户名 -p 密码 SHOW PROCESSLIST -- 显示哪些线程正在运行 SHOW VARIABLES -- 显示系统变量信息 / 数据库操作 / ------------------ -- 查看当前数据库 SELECT DATABASE(); -- 显示当前时间、用户名、数据库版本 SELECT now(), user(), version(); -- 创建库 CREATE DATABASE[ IF NOT EXISTS] 数据库名 数据库选项 数据库选项: CHARACTER SET charset_name COLLATE collation_name -- 查看已有库 SHOW DATABASES[ LIKE 'PATTERN'] -- 查看当前库信息 SHOW CREATE DATABASE 数据库名 -- 修改库的选项信息 ALTER DATABASE 库名 选项信息 -- 删除库 DROP DATABASE[ IF EXISTS] 数据库名 同时删除该数据库相关的目录及其目录内容 / 表的操作 / ------------------ -- 创建表 CREATE [TEMPORARY] TABLE[ IF NOT EXISTS] [库名.]表名 ( 表的结构定义 )[ 表选项] 每个字段必须有数据类型 最后一个字段后不能有逗号 TEMPORARY 临时表,会话结束时表自动消失 对于字段的定义: 字段名 数据类型 [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string'] -- 表选项 -- 字符集 CHARSET = charset_name 如果表没有设定,则使用数据库字符集 -- 存储引擎 ENGINE = engine_name 表在管理数据时采用的不同的数据结构,结构不同会导致处理方式、提供的特性操作等不同 常见的引擎:InnoDB MyISAM Memory/Heap BDB Merge Example CSV MaxDB Archive 不同的引擎在保存表的结构和数据时采用不同的方式 MyISAM表文件含义:.frm表定义,.MYD表数据,.MYI表索引 InnoDB表文件含义:.frm表定义,表空间数据和日志文件 SHOW ENGINES -- 显示存储引擎的状态信息 SHOW ENGINE 引擎名 {LOGS|STATUS} -- 显示存储引擎的日志或状态信息 -- 自增起始数 AUTO_INCREMENT = 行数 -- 数据文件目录 DATA DIRECTORY = '目录' -- 索引文件目录 INDEX DIRECTORY = '目录' -- 表注释 COMMENT = 'string' -- 分区选项 PARTITION BY ... (详细见手册) -- 查看所有表 SHOW TABLES[ LIKE 'pattern'] SHOW TABLES FROM 表名 -- 查看表机构 SHOW CREATE TABLE 表名 (信息更详细) DESC 表名 / DESCRIBE 表名 / EXPLAIN 表名 / SHOW COLUMNS FROM 表名 [LIKE 'PATTERN'] SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern'] -- 修改表 -- 修改表本身的选项 ALTER TABLE 表名 表的选项 eg: ALTER TABLE 表名 ENGINE=MYISAM; -- 对表进行重命名 RENAME TABLE 原表名 TO 新表名 RENAME TABLE 原表名 TO 库名.表名 (可将表移动到另一个数据库) -- RENAME可以交换两个表名 -- 修改表的字段机构(13.1.2. ALTER TABLE语法) ALTER TABLE 表名 操作名 -- 操作名 ADD[ COLUMN] 字段定义 -- 增加字段 AFTER 字段名 -- 表示增加在该字段名后面 FIRST -- 表示增加在第一个 ADD PRIMARY KEY(字段名) -- 创建主键 ADD UNIQUE [索引名](字段名)-- 创建唯一索引 ADD INDEX [索引名](字段名) -- 创建普通索引 DROP[ COLUMN] 字段名 -- 删除字段 MODIFY[ COLUMN] 字段名 字段属性 -- 支持对字段属性进行修改,不能修改字段名(所有原有属性也需写上) CHANGE[ COLUMN] 原字段名 新字段名 字段属性 -- 支持对字段名修改 DROP PRIMARY KEY -- 删除主键(删除主键前需删除其AUTO_INCREMENT属性) DROP INDEX 索引名 -- 删除索引 DROP FOREIGN KEY 外键 -- 删除外键 -- 删除表 DROP TABLE[ IF EXISTS] 表名 ... -- 清空表数据 TRUNCATE [TABLE] 表名 -- 复制表结构 CREATE TABLE 表名 LIKE 要复制的表名 -- 复制表结构和数据 CREATE TABLE 表名 [AS] SELECT * FROM 要复制的表名 -- 检查表是否有错误 CHECK TABLE tbl_name [, tbl_name] ... [option] ... -- 优化表 OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... -- 修复表 REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM] -- 分析表 ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... / 数据操作 / ------------------ -- 增 INSERT [INTO] 表名 [(字段列表)] VALUES (值列表)[, (值列表), ...] -- 如果要插入的值列表包含所有字段并且顺序一致,则可以省略字段列表。 -- 可同时插入多条数据记录! REPLACE 与 INSERT 完全一样,可互换。 INSERT [INTO] 表名 SET 字段名=值[, 字段名=值, ...] -- 查 SELECT 字段列表 FROM 表名[ 其他子句] -- 可来自多个表的多个字段 -- 其他子句可以不使用 -- 字段列表可以用*代替,表示所有字段 -- 删 DELETE FROM 表名[ 删除条件子句] 没有条件子句,则会删除全部 -- 改 UPDATE 表名 SET 字段名=新值[, 字段名=新值] [更新条件] / 字符集编码 / ------------------ -- MySQL、数据库、表、字段均可设置编码 -- 数据编码与客户端编码不需一致 SHOW VARIABLES LIKE 'character_set_%' -- 查看所有字符集编码项 character_set_client 客户端向服务器发送数据时使用的编码 character_set_results 服务器端将结果返回给客户端所使用的编码 character_set_connection 连接层编码 SET 变量名 = 变量值 SET character_set_client = gbk; SET character_set_results = gbk; SET character_set_connection = gbk; SET NAMES GBK; -- 相当于完成以上三个设置 -- 校对集 校对集用以排序 SHOW CHARACTER SET [LIKE 'pattern']/SHOW CHARSET [LIKE 'pattern'] 查看所有字符集 SHOW COLLATION [LIKE 'pattern'] 查看所有校对集 CHARSET 字符集编码 设置字符集编码 COLLATE 校对集编码 设置校对集编码 / 数据类型(列类型) / ------------------ 1. 数值类型 -- a. 整型 ---------- 类型 字节 范围(有符号位) tinyint 1字节 -128 ~ 127 无符号位:0 ~ 255 smallint 2字节 -32768 ~ 32767 mediumint 3字节 -8388608 ~ 8388607 int 4字节 bigint 8字节 int(M) M表示总位数 - 默认存在符号位,unsigned 属性修改 - 显示宽度,如果某个数不够定义字段时设置的位数,则前面以0补填,zerofill 属性修改 例:int(5) 插入一个数'123',补填后为'00123' - 在满足要求的情况下,越小越好。 - 1表示bool值真,0表示bool值假。MySQL没有布尔类型,通过整型0和1表示。常用tinyint(1)表示布尔型。 -- b. 浮点型 ---------- 类型 字节 范围 float(单精度) 4字节 double(双精度) 8字节 浮点型既支持符号位 unsigned 属性,也支持显示宽度 zerofill 属性。 不同于整型,前后均会补填0. 定义浮点型时,需指定总位数和小数位数。 float(M, D) double(M, D) M表示总位数,D表示小数位数。 M和D的大小会决定浮点数的范围。不同于整型的固定范围。 M既表示总位数(不包括小数点和正负号),也表示显示宽度(所有显示符号均包括)。 支持科学计数法表示。 浮点数表示近似值。 -- c. 定点数 ---------- decimal -- 可变长度 decimal(M, D) M也表示总位数,D表示小数位数。 保存一个精确的数值,不会发生数据的改变,不同于浮点数的四舍五入。 将浮点数转换为字符串来保存,每9位数字保存为4个字节。 2. 字符串类型 -- a. char, varchar ---------- char 定长字符串,速度快,但浪费空间 varchar 变长字符串,速度慢,但节省空间 M表示能存储的最大长度,此长度是字符数,非字节数。 不同的编码,所占用的空间不同。 char,最多255个字符,与编码无关。 varchar,最多65535字符,与编码有关。 一条有效记录最大不能超过65535个字节。 utf8 最大为21844个字符,gbk 最大为32766个字符,latin1 最大为65532个字符 varchar 是变长的,需要利用存储空间保存 varchar 的长度,如果数据小于255个字节,则采用一个字节来保存长度,反之需要两个字节来保存。 varchar 的最大有效长度由最大行大小和使用的字符集确定。 最大有效长度是65532字节,因为在varchar存字符串时,第一个字节是空的,不存在任何数据,然后还需两个字节来存放字符串的长度,所以有效长度是64432-1-2=65532字节。 例:若一个表定义为 CREATE TABLE tb(c1 int, c2 char(30), c3 varchar(N)) charset=utf8; 问N的最大值是多少? 答:(65535-1-2-4-30*3)/3 -- b. blob, text ---------- blob 二进制字符串(字节字符串) tinyblob, blob, mediumblob, longblob text 非二进制字符串(字符字符串) tinytext, text, mediumtext, longtext text 在定义时,不需要定义长度,也不会计算总长度。 text 类型在定义时,不可给default值 -- c. binary, varbinary ---------- 类似于char和varchar,用于保存二进制字符串,也就是保存字节字符串而非字符字符串。 char, varchar, text 对应 binary, varbinary, blob. 3. 日期时间类型 一般用整型保存时间戳,因为PHP可以很方便的将时间戳进行格式化。 datetime 8字节 日期及时间 1000-01-01 00:00:00 到 9999-12-31 23:59:59 date 3字节 日期 1000-01-01 到 9999-12-31 timestamp 4字节 时间戳 19700101000000 到 2038-01-19 03:14:07 time 3字节 时间 -838:59:59 到 838:59:59 year 1字节 年份 1901 - 2155 datetime YYYY-MM-DD hh:mm:ss timestamp YY-MM-DD hh:mm:ss YYYYMMDDhhmmss YYMMDDhhmmss YYYYMMDDhhmmss YYMMDDhhmmss date YYYY-MM-DD YY-MM-DD YYYYMMDD YYMMDD YYYYMMDD YYMMDD time hh:mm:ss hhmmss hhmmss year YYYY YY YYYY YY 4. 枚举和集合 -- 枚举(enum) ---------- enum(val1, val2, val3...) 在已知的值中进行单选。最大数量为65535. 枚举值在保存时,以2个字节的整型(smallint)保存。每个枚举值,按保存的位置顺序,从1开始逐一递增。 表现为字符串类型,存储却是整型。 NULL值的索引是NULL。 空字符串错误值的索引值是0。 -- 集合(set) ---------- set(val1, val2, val3...) create table tab ( gender set('男', '女', '无') ); insert into tab values ('男, 女'); 最多可以有64个不同的成员。以bigint存储,共8个字节。采取位运算的形式。 当创建表时,SET成员值的尾部空格将自动被删除。 / 选择类型 / -- PHP角度 1. 功能满足 2. 存储空间尽量小,处理效率更高 3. 考虑兼容问题 -- IP存储 ---------- 1. 只需存储,可用字符串 2. 如果需计算,查找等,可存储为4个字节的无符号int,即unsigned 1) PHP函数转换 ip2long可转换为整型,但会出现携带符号问题。需格式化为无符号的整型。 利用sprintf函数格式化字符串 sprintf("%u", ip2long('192.168.3.134')); 然后用long2ip将整型转回IP字符串 2) MySQL函数转换(无符号整型,UNSIGNED) INET_ATON('127.0.0.1') 将IP转为整型 INET_NTOA(2130706433) 将整型转为IP / 列属性(列约束) / ------------------ 1. PRIMARY 主键 - 能唯一标识记录的字段,可以作为主键。 - 一个表只能有一个主键。 - 主键具有唯一性。 - 声明字段时,用 primary key 标识。 也可以在字段列表之后声明 例:create table tab ( id int, stu varchar(10), primary key (id)); - 主键字段的值不能为null。 - 主键可以由多个字段共同组成。此时需要在字段列表后声明的方法。 例:create table tab ( id int, stu varchar(10), age int, primary key (stu, age)); 2. UNIQUE 唯一索引(唯一约束) 使得某字段的值也不能重复。 3. NULL 约束 null不是数据类型,是列的一个属性。 表示当前列是否可以为null,表示什么都没有。 null, 允许为空。默认。 not null, 不允许为空。 insert into tab values (null, 'val'); -- 此时表示将第一个字段的值设为null, 取决于该字段是否允许为null 4. DEFAULT 默认值属性 当前字段的默认值。 insert into tab values (default, 'val'); -- 此时表示强制使用默认值。 create table tab ( add_time timestamp default current_timestamp ); -- 表示将当前时间的时间戳设为默认值。 current_date, current_time 5. AUTO_INCREMENT 自动增长约束 自动增长必须为索引(主键或unique) 只能存在一个字段为自动增长。 默认为1开始自动增长。可以通过表属性 auto_increment = x进行设置,或 alter table tbl auto_increment = x; 6. COMMENT 注释 例:create table tab ( id int ) comment '注释内容'; 7. FOREIGN KEY 外键约束 用于限制主表与从表数据完整性。 alter table t1 add constraint `t1_t2_fk` foreign key (t1_id) references t2(id); -- 将表t1的t1_id外键关联到表t2的id字段。 -- 每个外键都有一个名字,可以通过 constraint 指定 存在外键的表,称之为从表(子表),外键指向的表,称之为主表(父表)。 作用:保持数据一致性,完整性,主要目的是控制存储在外键表(从表)中的数据。 MySQL中,可以对InnoDB引擎使用外键约束: 语法: foreign key (外键字段) references 主表名 (关联字段) [主表记录删除时的动作] [主表记录更新时的动作] 此时需要检测一个从表的外键需要约束为主表的已存在的值。外键在没有关联的情况下,可以设置为null.前提是该外键列,没有not null。 可以不指定主表记录更改或更新时的动作,那么此时主表的操作被拒绝。 如果指定了 on update 或 on delete:在删除或更新时,有如下几个操作可以选择: 1. cascade,级联操作。主表数据被更新(主键值更新),从表也被更新(外键值更新)。主表记录被删除,从表相关记录也被删除。 2. set null,设置为null。主表数据被更新(主键值更新),从表的外键被设置为null。主表记录被删除,从表相关记录外键被设置成null。但注意,要求该外键列,没有not null属性约束。 3. restrict,拒绝父表删除和更新。 注意,外键只被InnoDB存储引擎所支持。其他引擎是不支持的。 / 建表规范 / ------------------ -- Normal Format, NF - 每个表保存一个实体信息 - 每个具有一个ID字段作为主键 - ID主键 + 原子表 -- 1NF, 第一范式 字段不能再分,就满足第一范式。 -- 2NF, 第二范式 满足第一范式的前提下,不能出现部分依赖。 消除符合主键就可以避免部分依赖。增加单列关键字。 -- 3NF, 第三范式 满足第二范式的前提下,不能出现传递依赖。 某个字段依赖于主键,而有其他字段依赖于该字段。这就是传递依赖。 将一个实体信息的数据放在一个表内实现。 / SELECT / ------------------ SELECT [ALL|DISTINCT] select_expr FROM -> WHERE -> GROUP BY [合计函数] -> HAVING -> ORDER BY -> LIMIT a. select_expr -- 可以用 * 表示所有字段。 select * from tb; -- 可以使用表达式(计算公式、函数调用、字段也是个表达式) select stu, 29+25, now() from tb; -- 可以为每个列使用别名。适用于简化列标识,避免多个列标识符重复。 - 使用 as 关键字,也可省略 as. select stu+10 as add10 from tb; b. FROM 子句 用于标识查询来源。 -- 可以为表起别名。使用as关键字。 SELECT * FROM tb1 AS tt, tb2 AS bb; -- from子句后,可以同时出现多个表。 -- 多个表会横向叠加到一起,而数据会形成一个笛卡尔积。 SELECT * FROM tb1, tb2; -- 向优化符提示如何选择索引 USE INDEX、IGNORE INDEX、FORCE INDEX SELECT * FROM table1 USE INDEX (key1,key2) WHERE key1=1 AND key2=2 AND key3=3; SELECT * FROM table1 IGNORE INDEX (key3) WHERE key1=1 AND key2=2 AND key3=3; c. WHERE 子句 -- 从from获得的数据源中进行筛选。 -- 整型1表示真,0表示假。 -- 表达式由运算符和运算数组成。 -- 运算数:变量(字段)、值、函数返回值 -- 运算符: =, <=>, <>, !=, <=, <, >=, >, !, &&, ||, in (not) null, (not) like, (not) in, (not) between and, is (not), and, or, not, xor is/is not 加上ture/false/unknown,检验某个值的真假 <=>与<>功能相同,<=>可用于null比较 d. GROUP BY 子句, 分组子句 GROUP BY 字段/别名 [排序方式] 分组后会进行排序。升序:ASC,降序:DESC 以下[合计函数]需配合 GROUP BY 使用: count 返回不同的非NULL值数目 count(*)、count(字段) sum 求和 max 求最大值 min 求最小值 avg 求平均值 group_concat 返回带有来自一个组的连接的非NULL值的字符串结果。组内字符串连接。 e. HAVING 子句,条件子句 与 where 功能、用法相同,执行时机不同。 where 在开始时执行检测数据,对原数据进行过滤。 having 对筛选出的结果再次进行过滤。 having 字段必须是查询出来的,where 字段必须是数据表存在的。 where 不可以使用字段的别名,having 可以。因为执行WHERE代码时,可能尚未确定列值。 where 不可以使用合计函数。一般需用合计函数才会用 having SQL标准要求HAVING必须引用GROUP BY子句中的列或用于合计函数中的列。 f. ORDER BY 子句,排序子句 order by 排序字段/别名 排序方式 [,排序字段/别名 排序方式]... 升序:ASC,降序:DESC 支持多个字段的排序。 g. LIMIT 子句,限制结果数量子句 仅对处理好的结果进行数量限制。将处理好的结果的看作是一个集合,按照记录出现的顺序,索引从0开始。 limit 起始位置, 获取条数 省略第一个参数,表示从索引0开始。limit 获取条数 h. DISTINCT, ALL 选项 distinct 去除重复记录 默认为 all, 全部记录 / UNION / ------------------ 将多个select查询的结果组合成一个结果集合。 SELECT ... UNION [ALL|DISTINCT] SELECT ... 默认 DISTINCT 方式,即所有返回的行都是唯一的 建议,对每个SELECT查询加上小括号包裹。 ORDER BY 排序时,需加上 LIMIT 进行结合。 需要各select查询的字段数量一样。 每个select查询的字段列表(数量、类型)应一致,因为结果中的字段名以第一条select语句为准。 / 子查询 / ------------------ - 子查询需用括号包裹。 -- from型 from后要求是一个表,必须给子查询结果取个别名。 - 简化每个查询内的条件。 - from型需将结果生成一个临时表格,可用以原表的锁定的释放。 - 子查询返回一个表,表型子查询。 select * from (select * from tb where id>0) as subfrom where id>1; -- where型 - 子查询返回一个值,标量子查询。 - 不需要给子查询取别名。 - where子查询内的表,不能直接用以更新。 select * from tb where money = (select max(money) from tb); -- 列子查询 如果子查询结果返回的是一列。 使用 in 或 not in 完成查询 exists 和 not exists 条件 如果子查询返回数据,则返回1或0。常用于判断条件。 select column1 from t1 where exists (select * from t2); -- 行子查询 查询条件是一个行。 select * from t1 where (id, gender) in (select id, gender from t2); 行构造符:(col1, col2, ...) 或 ROW(col1, col2, ...) 行构造符通常用于与对能返回两个或两个以上列的子查询进行比较。 -- 特殊运算符 != all() 相当于 not in = some() 相当于 in。any 是 some 的别名 != some() 不等同于 not in,不等于其中某一个。 all, some 可以配合其他运算符一起使用。 / 连接查询(join) / ------------------ 将多个表的字段进行连接,可以指定连接条件。 -- 内连接(inner join) - 默认就是内连接,可省略inner。 - 只有数据存在时才能发送连接。即连接结果不能出现空行。 on 表示连接条件。其条件表达式与where类似。也可以省略条件(表示条件永远为真) 也可用where表示连接条件。 还有 using, 但需字段名相同。 using(字段名) -- 交叉连接 cross join 即,没有条件的内连接。 select * from tb1 cross join tb2; -- 外连接(outer join) - 如果数据不存在,也会出现在连接结果中。 -- 左外连接 left join 如果数据不存在,左表记录会出现,而右表为null填充 -- 右外连接 right join 如果数据不存在,右表记录会出现,而左表为null填充 -- 自然连接(natural join) 自动判断连接条件完成连接。 相当于省略了using,会自动查找相同字段名。 natural join natural left join natural right join select info.id, info.name, info.stu_num, extra_info.hobby, extra_info.sex from info, extra_info where info.stu_num = extra_info.stu_id; / 导入导出 / ------------------ select * into outfile 文件地址 [控制格式] from 表名; -- 导出表数据 load data [local] infile 文件地址 [replace|ignore] into table 表名 [控制格式]; -- 导入数据 生成的数据默认的分隔符是制表符 local未指定,则数据文件必须在服务器上 replace 和 ignore 关键词控制对现有的唯一键记录的重复的处理 -- 控制格式 fields 控制字段格式 默认:fields terminated by '\t' enclosed by '' escaped by '\\' terminated by 'string' -- 终止 enclosed by 'char' -- 包裹 escaped by 'char' -- 转义 -- 示例: SELECT a,b,a+b INTO OUTFILE '/tmp/result.text' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM test_table; lines 控制行格式 默认:lines terminated by '\n' terminated by 'string' -- 终止 / INSERT / ------------------ select语句获得的数据可以用insert插入。 可以省略对列的指定,要求 values () 括号内,提供给了按照列顺序出现的所有字段的值。 或者使用set语法。 INSERT INTO tbl_name SET field=value,...; 可以一次性使用多个值,采用(), (), ();的形式。 INSERT INTO tbl_name VALUES (), (), (); 可以在列值指定时,使用表达式。 INSERT INTO tbl_name VALUES (field_value, 10+10, now()); 可以使用一个特殊值 DEFAULT,表示该列使用默认值。 INSERT INTO tbl_name VALUES (field_value, DEFAULT); 可以通过一个查询的结果,作为需要插入的值。 INSERT INTO tbl_name SELECT ...; 可以指定在插入的值出现主键(或唯一索引)冲突时,更新其他非主键列的信息。 INSERT INTO tbl_name VALUES/SET/SELECT ON DUPLICATE KEY UPDATE 字段=值, …; / DELETE / ------------------ DELETE FROM tbl_name [WHERE where_definition] [ORDER BY ...] [LIMIT row_count] 按照条件删除。where 指定删除的最多记录数。limit 可以通过排序条件删除。order by + limit 支持多表删除,使用类似连接语法。 delete from 需要删除数据多表1,表2 using 表连接操作 条件。 / TRUNCATE / ------------------ TRUNCATE [TABLE] tbl_name 清空数据 删除重建表 区别: 1,truncate 是删除表再创建,delete 是逐条删除 2,truncate 重置auto_increment的值。而delete不会 3,truncate 不知道删除了几条,而delete知道。 4,当被用于带分区的表时,truncate 会保留分区 / 备份与还原 / ------------------ 备份,将数据的结构与表内数据保存起来。 利用 mysqldump 指令完成。 -- 导出 mysqldump [options] db_name [tables] mysqldump [options] ---database DB1 [DB2 DB3...] mysqldump [options] --all--database 1. 导出一张表 mysqldump -u用户名 -p密码 库名 表名 > 文件名(D:/a.sql) 2. 导出多张表 mysqldump -u用户名 -p密码 库名 表1 表2 表3 > 文件名(D:/a.sql) 3. 导出所有表 mysqldump -u用户名 -p密码 库名 > 文件名(D:/a.sql) 4. 导出一个库 mysqldump -u用户名 -p密码 --lock-all-tables --database 库名 > 文件名(D:/a.sql) 可以-w携带WHERE条件 -- 导入 1. 在登录mysql的情况下: source 备份文件 2. 在不登录的情况下 mysql -u用户名 -p密码 库名 < 备份文件 / 视图 / ------------------ 什么是视图: 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。 视图具有表结构文件,但不存在数据文件。 对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。 视图是存储在数据库中的查询的sql语句,它主要出于两种原因:安全原因,视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。 -- 创建视图 CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement - 视图名必须唯一,同时不能与表重名。 - 视图可以使用select语句查询到的列名,也可以自己指定相应的列名。 - 可以指定视图执行的算法,通过ALGORITHM指定。 - column_list如果存在,则数目必须等于SELECT语句检索的列数 -- 查看结构 SHOW CREATE VIEW view_name -- 删除视图 - 删除视图后,数据依然存在。 - 可同时删除多个视图。 DROP VIEW [IF EXISTS] view_name ... -- 修改视图结构 - 一般不修改视图,因为不是所有的更新视图都会映射到表上。 ALTER VIEW view_name [(column_list)] AS select_statement -- 视图作用 1. 简化业务逻辑 2. 对客户端隐藏真实的表结构 -- 视图算法(ALGORITHM) MERGE 合并 将视图的查询语句,与外部查询需要先合并再执行! TEMPTABLE 临时表 将视图执行完毕后,形成临时表,再做外层查询! UNDEFINED 未定义(默认),指的是MySQL自主去选择相应的算法。 / 事务(transaction) / ------------------ 事务是指逻辑上的一组操作,组成这组操作的各个单元,要不全成功要不全失败。 - 支持连续SQL的集体成功或集体撤销。 - 事务是数据库在数据晚自习方面的一个功能。 - 需要利用 InnoDB 或 BDB 存储引擎,对自动提交的特性支持完成。 - InnoDB被称为事务安全型引擎。 -- 事务开启 START TRANSACTION; 或者 BEGIN; 开启事务后,所有被执行的SQL语句均被认作当前事务内的SQL语句。 -- 事务提交 COMMIT; -- 事务回滚 ROLLBACK; 如果部分操作发生问题,映射到事务开启前。 -- 事务的特性 1. 原子性(Atomicity) 事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 2. 一致性(Consistency) 事务前后数据的完整性必须保持一致。 - 事务开始和结束时,外部数据一致 - 在整个事务过程中,操作是连续的 3. 隔离性(Isolation) 多个用户并发访问数据库时,一个用户的事务不能被其它用户的事物所干扰,多个并发事务之间的数据要相互隔离。 4. 持久性(Durability) 一个事务一旦被提交,它对数据库中的数据改变就是永久性的。 -- 事务的实现 1. 要求是事务支持的表类型 2. 执行一组相关的操作前开启事务 3. 整组操作完成后,都成功,则提交;如果存在失败,选择回滚,则会回到事务开始的备份点。 -- 事务的原理 利用InnoDB的自动提交(autocommit)特性完成。 普通的MySQL执行语句后,当前的数据提交操作均可被其他客户端可见。 而事务是暂时关闭“自动提交”机制,需要commit提交持久化数据操作。 -- 注意 1. 数据定义语言(DDL)语句不能被回滚,比如创建或取消数据库的语句,和创建、取消或更改表或存储的子程序的语句。 2. 事务不能被嵌套 -- 保存点 SAVEPOINT 保存点名称 -- 设置一个事务保存点 ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点 RELEASE SAVEPOINT 保存点名称 -- 删除保存点 -- InnoDB自动提交特性设置 SET autocommit = 0|1; 0表示关闭自动提交,1表示开启自动提交。 - 如果关闭了,那普通操作的结果对其他客户端也不可见,需要commit提交后才能持久化数据操作。 - 也可以关闭自动提交来开启事务。但与START TRANSACTION不同的是, SET autocommit是永久改变服务器的设置,直到下次再次修改该设置。(针对当前连接) 而START TRANSACTION记录开启前的状态,而一旦事务提交或回滚后就需要再次开启事务。(针对当前事务) / 锁表 / 表锁定只用于防止其它客户端进行不正当地读取和写入 MyISAM 支持表锁,InnoDB 支持行锁 -- 锁定 LOCK TABLES tbl_name [AS alias] -- 解锁 UNLOCK TABLES / 触发器 / ------------------ 触发程序是与表有关的命名数据库对象,当该表出现特定事件时,将激活该对象 监听:记录的增加、修改、删除。 -- 创建触发器 CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt 参数: trigger_time是触发程序的动作时间。它可以是 before 或 after,以指明触发程序是在激活它的语句之前或之后触发。 trigger_event指明了激活触发程序的语句的类型 INSERT:将新行插入表时激活触发程序 UPDATE:更改某一行时激活触发程序 DELETE:从表中删除某一行时激活触发程序 tbl_name:监听的表,必须是永久性的表,不能将触发程序与TEMPORARY表或视图关联起来。 trigger_stmt:当触发程序激活时执行的语句。执行多个语句,可使用BEGIN...END复合语句结构 -- 删除 DROP TRIGGER [schema_name.]trigger_name 可以使用old和new代替旧的和新的数据 更新操作,更新前是old,更新后是new. 删除操作,只有old. 增加操作,只有new. -- 注意 1. 对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。 -- 字符连接函数 concat(str1,str2,...]) concat_ws(separator,str1,str2,...) -- 分支语句 if 条件 then 执行语句 elseif 条件 then 执行语句 else 执行语句 end if; -- 修改最外层语句结束符 delimiter 自定义结束符号 SQL语句 自定义结束符号 delimiter ; -- 修改回原来的分号 -- 语句块包裹 begin 语句块 end -- 特殊的执行 1. 只要添加记录,就会触发程序。 2. Insert into on duplicate key update 语法会触发: 如果没有重复记录,会触发 before insert, after insert; 如果有重复记录并更新,会触发 before insert, before update, after update; 如果有重复记录但是没有发生更新,则触发 before insert, before update 3. Replace 语法 如果有记录,则执行 before insert, before delete, after delete, after insert / SQL编程 / ------------------ --// 局部变量 ---------- -- 变量声明 declare var_name[,...] type [default value] 这个语句被用来声明局部变量。要给变量提供一个默认值,请包含一个default子句。值可以被指定为一个表达式,不需要为一个常数。如果没有default子句,初始值为null。 -- 赋值 使用 set 和 select into 语句为变量赋值。 - 注意:在函数内是可以使用全局变量(用户自定义的变量) --// 全局变量 ---------- -- 定义、赋值 set 语句可以定义并为变量赋值。 set @var = value; 也可以使用select into语句为变量初始化并赋值。这样要求select语句只能返回一行,但是可以是多个字段,就意味着同时为多个变量进行赋值,变量的数量需要与查询的列数一致。 还可以把赋值语句看作一个表达式,通过select执行完成。此时为了避免=被当作关系运算符看待,使用:=代替。(set语句可以使用= 和 :=)。 select @var:=20; select @v1:=id, @v2=name from t1 limit 1; select * from tbl_name where @var:=30; select into 可以将表中查询获得的数据赋给变量。 -| select max(height) into @max_height from tb; -- 自定义变量名 为了避免select语句中,用户自定义的变量与系统标识符(通常是字段名)冲突,用户自定义变量在变量名前使用@作为开始符号。 @var=10; - 变量被定义后,在整个会话周期都有效(登录到退出) --// 控制结构 ---------- -- if语句 if search_condition then statement_list [elseif search_condition then statement_list] ... [else statement_list] end if; -- case语句 CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END -- while循环 [begin_label:] while search_condition do statement_list end while [end_label]; - 如果需要在循环内提前终止 while循环,则需要使用标签;标签需要成对出现。 -- 退出循环 退出整个循环 leave 退出当前循环 iterate 通过退出的标签决定退出哪个循环 --// 内置函数 ---------- -- 数值函数 abs(x) -- 绝对值 abs(-10.9) = 10 format(x, d) -- 格式化千分位数值 format(1234567.456, 2) = 1,234,567.46 ceil(x) -- 向上取整 ceil(10.1) = 11 floor(x) -- 向下取整 floor (10.1) = 10 round(x) -- 四舍五入去整 mod(m, n) -- m%n m mod n 求余 10%3=1 pi() -- 获得圆周率 pow(m, n) -- m^n sqrt(x) -- 算术平方根 rand() -- 随机数 truncate(x, d) -- 截取d位小数 -- 时间日期函数 now(), current_timestamp(); -- 当前日期时间 current_date(); -- 当前日期 current_time(); -- 当前时间 date('yyyy-mm-dd hh:ii:ss'); -- 获取日期部分 time('yyyy-mm-dd hh:ii:ss'); -- 获取时间部分 date_format('yyyy-mm-dd hh:ii:ss', '%d %y %a %d %m %b %j'); -- 格式化时间 unix_timestamp(); -- 获得unix时间戳 from_unixtime(); -- 从时间戳获得时间 -- 字符串函数 length(string) -- string长度,字节 char_length(string) -- string的字符个数 substring(str, position [,length]) -- 从str的position开始,取length个字符 replace(str ,search_str ,replace_str) -- 在str中用replace_str替换search_str instr(string ,substring) -- 返回substring首次在string中出现的位置 concat(string [,...]) -- 连接字串 charset(str) -- 返回字串字符集 lcase(string) -- 转换成小写 left(string, length) -- 从string2中的左边起取length个字符 load_file(file_name) -- 从文件读取内容 locate(substring, string [,start_position]) -- 同instr,但可指定开始位置 lpad(string, length, pad) -- 重复用pad加在string开头,直到字串长度为length ltrim(string) -- 去除前端空格 repeat(string, count) -- 重复count次 rpad(string, length, pad) --在str后用pad补充,直到长度为length rtrim(string) -- 去除后端空格 strcmp(string1 ,string2) -- 逐字符比较两字串大小 -- 流程函数 case when [condition] then result [when [condition] then result ...] [else result] end 多分支 if(expr1,expr2,expr3) 双分支。 -- 聚合函数 count() sum(); max(); min(); avg(); group_concat() -- 其他常用函数 md5(); default(); --// 存储函数,自定义函数 ---------- -- 新建 CREATE FUNCTION function_name (参数列表) RETURNS 返回值类型 函数体 - 函数名,应该合法的标识符,并且不应该与已有的关键字冲突。 - 一个函数应该属于某个数据库,可以使用db_name.funciton_name的形式执行当前函数所属数据库,否则为当前数据库。 - 参数部分,由"参数名"和"参数类型"组成。多个参数用逗号隔开。 - 函数体由多条可用的mysql语句,流程控制,变量声明等语句构成。 - 多条语句应该使用 begin...end 语句块包含。 - 一定要有 return 返回值语句。 -- 删除 DROP FUNCTION [IF EXISTS] function_name; -- 查看 SHOW FUNCTION STATUS LIKE 'partten' SHOW CREATE FUNCTION function_name; -- 修改 ALTER FUNCTION function_name 函数选项 --// 存储过程,自定义功能 ---------- -- 定义 存储存储过程 是一段代码(过程),存储在数据库中的sql组成。 一个存储过程通常用于完成一段业务逻辑,例如报名,交班费,订单入库等。 而一个函数通常专注与某个功能,视为其他程序服务的,需要在其他语句中调用函数才可以,而存储过程不能被其他调用,是自己执行 通过call执行。 -- 创建 CREATE PROCEDURE sp_name (参数列表) 过程体 参数列表:不同于函数的参数列表,需要指明参数类型 IN,表示输入型 OUT,表示输出型 INOUT,表示混合型 注意,没有返回值。 / 存储过程 / ------------------ 存储过程是一段可执行性代码的集合。相比函数,更偏向于业务逻辑。 调用:CALL 过程名 -- 注意 - 没有返回值。 - 只能单独调用,不可夹杂在其他语句中 -- 参数 IN|OUT|INOUT 参数名 数据类型 IN 输入:在调用过程中,将数据输入到过程体内部的参数 OUT 输出:在调用过程中,将过程体处理完的结果返回到客户端 INOUT 输入输出:既可输入,也可输出 -- 语法 CREATE PROCEDURE 过程名 (参数列表) BEGIN 过程体 END / 用户和权限管理 / ------------------ -- root密码重置 1. 停止MySQL服务 2. [Linux] /usr/local/mysql/bin/safe_mysqld --skip-grant-tables & [Windows] mysqld --skip-grant-tables 3. use mysql; 4. UPDATE `user` SET PASSWORD=PASSWORD("密码") WHERE `user` = "root"; 5. FLUSH PRIVILEGES; 用户信息表:mysql.user -- 刷新权限 FLUSH PRIVILEGES; -- 增加用户 CREATE USER 用户名 IDENTIFIED BY [PASSWORD] 密码(字符串) - 必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。 - 只能创建用户,不能赋予权限。 - 用户名,注意引号:如 'user_name'@'192.168.1.1' - 密码也需引号,纯数字密码也要加引号 - 要在纯文本中指定密码,需忽略PASSWORD关键词。要把密码指定为由PASSWORD()函数返回的混编值,需包含关键字PASSWORD -- 重命名用户 RENAME USER old_user TO new_user -- 设置密码 SET PASSWORD = PASSWORD('密码') -- 为当前用户设置密码 SET PASSWORD FOR 用户名 = PASSWORD('密码') -- 为指定用户设置密码 -- 删除用户 DROP USER 用户名 -- 分配权限/添加用户 GRANT 权限列表 ON 表名 TO 用户名 [IDENTIFIED BY [PASSWORD] 'password'] - all privileges 表示所有权限 - *.* 表示所有库的所有表 - 库名.表名 表示某库下面的某表 GRANT ALL PRIVILEGES ON `pms`.* TO 'pms'@'%' IDENTIFIED BY 'pms0817'; -- 查看权限 SHOW GRANTS FOR 用户名 -- 查看当前用户权限 SHOW GRANTS; 或 SHOW GRANTS FOR CURRENT_USER; 或 SHOW GRANTS FOR CURRENT_USER(); -- 撤消权限 REVOKE 权限列表 ON 表名 FROM 用户名 REVOKE ALL PRIVILEGES, GRANT OPTION FROM 用户名 -- 撤销所有权限 -- 权限层级 -- 要使用GRANT或REVOKE,您必须拥有GRANT OPTION权限,并且您必须用于您正在授予或撤销的权限。 全局层级:全局权限适用于一个给定服务器中的所有数据库,mysql.user GRANT ALL ON *.*和 REVOKE ALL ON *.*只授予和撤销全局权限。 数据库层级:数据库权限适用于一个给定数据库中的所有目标,mysql.db, mysql.host GRANT ALL ON db_name.*和REVOKE ALL ON db_name.*只授予和撤销数据库权限。 表层级:表权限适用于一个给定表中的所有列,mysql.talbes_priv GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤销表权限。 列层级:列权限适用于一个给定表中的单一列,mysql.columns_priv 当使用REVOKE时,您必须指定与被授权列相同的列。 -- 权限列表 ALL [PRIVILEGES] -- 设置除GRANT OPTION之外的所有简单权限 ALTER -- 允许使用ALTER TABLE ALTER ROUTINE -- 更改或取消已存储的子程序 CREATE -- 允许使用CREATE TABLE CREATE ROUTINE -- 创建已存储的子程序 CREATE TEMPORARY TABLES -- 允许使用CREATE TEMPORARY TABLE CREATE USER -- 允许使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。 CREATE VIEW -- 允许使用CREATE VIEW DELETE -- 允许使用DELETE DROP -- 允许使用DROP TABLE EXECUTE -- 允许用户运行已存储的子程序 FILE -- 允许使用SELECT...INTO OUTFILE和LOAD DATA INFILE INDEX -- 允许使用CREATE INDEX和DROP INDEX INSERT -- 允许使用INSERT LOCK TABLES -- 允许对您拥有SELECT权限的表使用LOCK TABLES PROCESS -- 允许使用SHOW FULL PROCESSLIST REFERENCES -- 未被实施 RELOAD -- 允许使用FLUSH REPLICATION CLIENT -- 允许用户询问从属服务器或主服务器的地址 REPLICATION SLAVE -- 用于复制型从属服务器(从主服务器中读取二进制日志事件) SELECT -- 允许使用SELECT SHOW DATABASES -- 显示所有数据库 SHOW VIEW -- 允许使用SHOW CREATE VIEW SHUTDOWN -- 允许使用mysqladmin shutdown SUPER -- 允许使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL语句,mysqladmin debug命令;允许您连接(一次),即使已达到max_connections。 UPDATE -- 允许使用UPDATE USAGE -- “无权限”的同义词 GRANT OPTION -- 允许授予权限 / 表维护 /----------------------------------- -- 分析和存储表的关键字分布 ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE 表名 ... -- 检查一个或多个表是否有错误 CHECK TABLE tbl_name [, tbl_name] ... [option] ... option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED} -- 整理数据文件的碎片 OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... / 杂项 /------------------------------------- 1. 可用反引号(`)为标识符(库名、表名、字段名、索引、别名)包裹,以避免与关键字重名!中文也可以作为标识符! 2. 每个库目录存在一个保存当前数据库的选项文件db.opt。 3. 注释: 单行注释 # 注释内容 多行注释 /* 注释内容 */ 单行注释 -- 注释内容 (标准SQL注释风格,要求双破折号后加一空格符(空格、TAB、换行等)) 4. 模式通配符: _ 任意单个字符 % 任意多个字符,甚至包括零字符 单引号需要进行转义 \' 5. CMD命令行内的语句结束符可以为 ";", "\G", "\g",仅影响显示结果。其他地方还是用分号结束。delimiter 可修改当前对话的语句结束符。 6. SQL对大小写不敏感 7. 清除已有语句:\c |