0%

区块链技术与应用(3 BTC - 协议)

北京大学肖臻老师公开课《区块链技术与应用》,可以直接点击查看视频。

数字货币和纸质货币区别是可以复制,叫作双花攻击 即 double spending attack。
去中心化货币要解决两个问题:①数字货币的发行②怎么验证交易的有效性,防止 double spending attack。

答案:①比特币的发行是由挖矿决定的
②依靠区块链的数据结构
比特币的发行者 A 拥有铸币权 (createcoin
) 假如发行 10 个比特币 A (10) 分别给 B 和 C 各五个 → B (5) C (5) 该交易需要有 A 的签名,证明经 A 同意。(designed by A) 同时还要说明花掉的 10 个比特币从哪来的。

image-20211214154305372

参考拍的图四 第二个方框中的钱是从第一个框内铸币交易中来的。

比特币系统中每个交易都包含输入和输出两部分。输入部分要说明币的来源,输出部分要给出收款人公钥的哈希。
有的交易部分比较复杂,如 C 的货币来源是第二第三个方框,要标识清楚。

图四就构成了一个小型的区块链,这里有两种哈希指针,一种哈希指针是连接在各个区块之间的,把它们串起来构成一个链表,前面学的就是这种哈希指针。而在该图中还有第二种哈希指针,是指向前面某个交易的指针,用来指明币的来源。为什么要说明币的来源:证明币不是凭空捏造的是有记录的,同时也是防范 double spending。

现在来看第二个方框里 A 向 B 的转账,该交易需要 A 的签名和 B 的地址。比特币系统里收款的地址是通过公钥推算出来的。比如 B 的地址就是 B 的公钥取哈希然后经过一些转换得到的。

A 如何知道 B 的地址?比特币系统中没有查询对方地址的功能,必须通过其他渠道。比如某个电商网站,接受比特币支付,就可以公开它的地址或公钥。

A 需要知道 B 的地址,B 需要知道 A 的什么信息吗?B 其实也要知道 A 的公钥,这代表 A 的身份。不仅是 B,所有节点都需要知道 A 的公钥。而签名是用私钥签名公钥验证 (注意不要跟前面知识弄混了,加密是用接收人的公钥加密私钥解密),所以区块链上每个节点都要独立验证。

那如何才能知道 A 的公钥?实际上交易里就包含了。输入时不仅要输入币的来源,还要输入公钥。那就存在了安全漏洞,假如 B 的同伙伪造了这次交易呢?其实第一个方框里铸币交易的输出就有 A 的公钥的哈希,所以第二个方框交易里 A 的公钥要跟前面哈希对的上。

在比特币系统当中,前面这些验证过程,是通过执行脚本来实现的。每个交易的输入提一段脚本,包括给出公钥的过程,公钥也是在输入的脚本里指定的。每个交易的输出也是一段脚本,验证其的合法性,就需要把当前交易的输入脚本跟前面交易 (提供币来源的交易) 的输出脚本拼在一起,然后看看能不能顺利执行,如果能执行说明是合法的。比特币脚本 (BitCoin Script)。

该图对交易系统进行了简化,实际上每个区块 (对应图中的每个方框) 可以有很多交易,这些交易就组成 merkle tree。每个区块分为块头和块身。

块头包含的是区块的宏观信息,比如:用的是比特币哪个版本 (version) 的协议,区块链当中指向前一个区块的指针 (hash of previous block header),整颗 merkle tree 的根哈希值 (merkle root hash),还有两个域是跟挖矿相关的,一个是挖矿的难度目标预值 (target),另一个是随机数 nonce。

这里的 target,就是前面讲到的,整个块头的哈希要小于这个预值,即 H (block header)≤target。block header 里存的就是这个目标预值的编码 (nBits)。这里需要注意,前一个区块的哈希只算的是前一个区块的块头,所以前面画的,一个区块引出一个剪头指向另一个区块中间,是不正确的,所以有的书剪头是指向一个区块的上面。取哈希时是把块头的所有部分都取哈希。

块身里面有交易列表 (transaction list)。

前面还有一个内容讲的时候简化了:每个节点都需要验证所有的交易,实际上系统中的节点分全节点 (full node) 和轻节点 (light node),全节点是保存区块链所有的信息的,验证每一个交易,所以全节点又叫 fully validating node。轻节点只保存 block header 的信息,一般来说轻节点没法独立验证交易的合法性。

比如一个交易是不是 double spending,轻节点没有存以前的交易信息所以它没法验证。系统中大多数节点是轻节点,这节课内容主要针对全节点,因为轻节点没有参与区块链的构造和维护,只是利用了区块链的一些信息做一些查询。

区块链里的内容是如何写到区块链里面的呢:每个节点,每个账户都可以发布交易,交易是广播给所有节点的。有些交易是合法的,有些是非法的。谁来决定哪些交易应该被写入下一个区块中呢?按照什么顺序写呢?如果每个节点自己决定可以吗?如果每个人在本地维护一个区块链,那区块链的统一性得不到保证,而账本的内容是要取得分布式的共识 (distributed consensus)。

下面的笔记跟比特币的应用关系不大,可以作为了解:
分布式的共识一个简单的例子就是分布式的哈希表 (distributed hash table),比如系统里有很多台机器,共同维护一个全局的哈希表。

这里需要取得共识的内容是什么?哈希表中包含了哪些键值对 key valve pair。假如有人在自己电脑上插入一个键值对,’xiao’这个 pair 对应的是 12345,即’xiao’→12345。那么别人在另一台读的时候也要能把这个读出来,这就叫一个全局的哈希表。

关于分布式系统有很多不可能结论 (impossibility result),其中最著名的是 FLP。这三个字母是三个专家的名字缩写,他们的结论是:在一个异步的 (asynchronous) 系统里,(网络传输迟延没有上限就叫异步系统),即使只有一个成员是有问题的 (faulty),也不可能取得共识。

还有一个著名结论:CAP Theorem。(CAP 是指分布式系统的三个我们想要的性质,Consistency【系统状态的一致性】 Availability【别人都可以用】 Partition tolerance)。该理论内容是:任何一个分布式系统,比如分布式哈希表,这三个性质中,最多只能满足两个,假如想要前两个性质,那么就不会得到第三个性质。

分布式共识一个著名的协议是 Paxos,该协议能够保证一致性,即第一个性质。如果该协议打成了共识,那么这个共识一定是一致的,即每个成员所认为的共识都是相同的。但是,某些情况下,该协议可能永远无法达成共识,这种可能性比较小但是客观存在的。

比特币中的共识协议 (consensus in BitCoin):
比特币中共识要解决的一个问题是,有些节点可能是有恶意的。我们假设系统中大多数节点是好的,那么该如何取得共识协议?

第一种方案是投票,首先应该确定哪些区块有投票权,有些 membership 是有严格要求的,这种情况下基于投票的方案是可行的。但比特币系统创建账户是很容易的,甚至一个人产生了公私钥对别人都无法得知,只有转账时别人才知道。所以有些人可以不停的创建账户,当超过账户总数的一半时就有了控制权,这种称为女巫攻击 (sybil attack)。因此投票方法不可取。

比特币账户巧妙的解决了这个问题,不是按照账户数目投票,而是按照计算力来投票。每个节点都可以在本地组装出一个候选区块,把它认为合法的交易放在里面,然后开始尝试各种 nonce 值 (占 4 byte),看哪一个能满足不等式 H (block header)≤target 的要求。如果某个节点找到了符合要求的 nonce,它就获得了记账权。

所谓的记账权,就是往比特币账本里写入下一个区块的权利。只有找到这个 nonce,获得记账权的节点才有权利发布下一个区块。其他节点收到这个区块之后,要验证这个区块的合法性。

比如括号里 block header 的内容填的对不对;block header 里面有一个域,叫 nBits 域,实际上它是目标预值的一个编码检查一下 nBits 域设置的是不是符合比特币协议中规定的难度要求;该不等式是否成立。假设都符合要求,然后检查 block body 里面的交易列表,验证一下每个交易都是合法的:①要有合法的签名②以前没有被花过。如果有一项不符合要求,这个区块就是不能被接受的。如果所有条件都符合,也不一定接受。

image-20211214155405272

假如生成了一个新区块,怎么知道新区块插在了哪里呢?根据生成区块的指针。有可能就存在一个问题,如图 5 (第四个视频第 65 分钟) ,这两个交易指 A 转账给 B,以及 A 转账给自己。这种情况不是 double spending,判断一个交易是不是 double spending ,是看这个区块所在的分支上币又没有被花掉。如图,一直到第三个区块,币都没有花过,所以这个交易是合法的。虽然该交易是合法的,但是它不在最长合法链 (longest valid chain) 上。这种称为分叉攻击 (forking attack)。所以接收的区块应该是扩展最长合法链。

区块链在正常情况下也可能出现分岔:两个节点同时获得记账权。每个节点在本地自己组装一个它认为合适的区块,然后去试各种 nonce,如果两个节点在差不多同一个时间找到了符合要求的 nonce,就都可以把区块发布,这时会出现两个等长的分岔。这两条都是最长合法链,那该接受那条呢?比特币协议当中,在缺省 (默认的意思) 情况下,每个节点是接受它最早收到的那个。所以不同节点根据在网络上的位置不同,有的节点先听到新生成的其中一个区块,那就接受这个区块;有些节点先听到另一个区块,那就接受另一个区块。

如何判断接收了一个区块?比特币协议中用到了 implicit consign,如果沿着这个区块往下继续扩展,就算认可了这个发布的区块。比如在新生成的其中一个区块后面又拓展一个区块,表明就认可了这个新区块。

image-20211214155538448

等长的临时性的分岔会维持一段时间,直到一个分岔胜出。也就是哪一个链抢先一步生成了新的区块,哪一条就是最长合法链。另一个作废的就叫 orphan block。这两个新区块有可能会各自拉拢,两个区块链看谁的算力强,有时候也是看谁的运气好,就会胜出。

竞争记账权的好处:首先获得记账权的节点本身有一定的权力,可以决定哪些交易写到下一个区块里。但这些不应该被设定为竞争记账权的动力,所以巧妙地建立了一个机制:区块奖励 (block reward)。

比特币协议中规定获得记账权的节点在发布的区块里可以有一个特殊的交易:铸币交易。在这个交易里可以发布一定数量的比特币。

这里要回到前面的问题①,谁来决定货币的发行?coinbase transaction 币基交易是比特币系统中发行新的比特币的唯一方法,后面的交易都是比特币的转移。这个交易不用指出币的来源。

image-20211214155822460

那么能造多少币呢?开始时比特币刚上线的时候,每一个发布的区块可以产生 50BTC (BTC 就是比特币的符号)。协议中规定,21 万个区块以后,初块奖励就要减半,就变成了 25BTC。再过 21 万个区块,又要减半。

因此当一个区块胜出后,另一个作废的区块得到的比特币是没有作用的,其他诚实的区块是不会承认的。

比特币系统中要取得什么共识?去中心化的账本要取得共识。谁又能决定账本的内容呢?只有获得记账权的节点才能写东西。怎么获得记账权呢?就是解 pow (挖矿)。按照算力记票,算力可以用每秒能试多少 nonce 数值表示。那怎样防范女巫攻击呢?按算力记票,即使创建再多的账户,也无法使算力增强。

比特币争夺记账权的过程叫作挖矿 (mining),比特币被称为数字黄金 (digital gold),争夺记账权的节点被称为矿工 (miner)。

参考笔记:

  1. 区块链笔记在我主页
  2. sam_nau

区块链技术与应用(2 BTC - 数据结构)

北京大学肖臻老师公开课《区块链技术与应用》,可以直接点击查看视频。

普通指针存储的是某个结构体在内存中的地址。假如 P 是指向一结构体的指针,那么 P 里面存放的就是该结构体在内存中的起始位置。而哈希指针除了要存地址之外,还要保存该结构体的哈希值 H ()。好处是:从哈希值这个哈希指针,不仅可以找到该结构体的位置,同时还能够检测出该结构体的内容有没有被篡改,因为我们保存了它的哈希值。

比特币中最基本的结构就是区块链,区块链就是一个一个区块组成的链表。区块链和普通的链表相比有什么区别:
①用哈希指针代替了普通指针 (B block chain is a linked list using hash pointers)

区块链第一个区块叫作创世纪块 (genesis block) 最后一个区块 是最近产生的区块 (most recent block) 每一个区块都包含指向前一个区块的哈希指针。

一个区块的哈希指针怎么算:是把前面整个区块的内容,包括里面的 hash pointer ,合在一起取哈希值。通过这种结构,可以实现 tamper-evident log。如果有人改变了一个区块的内容,后面一个区块的哈希指针就对不上,因为后一个区块哈希指针是根据前一个区块的内容算出来的,所以后一个哈希指针也得改,以此类推,我们保留的是最后一个哈希值也会变化。

image-20211213164056278

②普通链表可以改变任意一个元素,对链表中其他元素是没有影响的。而区块链是牵一发而动全身,因为只需要保存最后一个哈希值,就可以判断区块链有没有改变,在哪里改变了。
因此比特币没有要保存所有区块的内容,可以只保留最近的几千个区块。如果要用到以前的区块,可以向系统中其他节点要这个区块。有些节点是有恶意的,怎么判断?这里要用到哈希值一个性质,如下:
其他节点给你一个区块,如何判断它是正确的?算出它的哈希值,与保留的区块的哈希值对比,即可。

image-20211214153648045

比特币中的另外一个结构是:Merkle tree。(见上图,下面一层是数据块 (data blocks),上面三层内部节点都是哈希指针 (hash pointers),第一层是根节点,根节点的区块也可以取个哈希,叫根哈希 (root hash))
另外一个概念:binary tree。

这种结构的好处:只要记住根哈希值,就能检测出对树中任何部位的修改。
它们的区别:①用哈希指针代替了普通指针。

比特币当中各区块之间用哈希指针连接在一起,每个区块所包含的交易组织成一个 merkle tree 的形式,最下面一行 data blocks 每个区块实际上是一个交易,每个区块分为两部分,分别是块头和块身 (block header ,block body)。块头里面有根哈希值,每个区块所包含的所有交易组成的 merkle tree 的根哈希值存在于区块的块头里面,但是,块头里没有交易的具体内容,只有一个根哈希值,块身里面是有交易的列表的。

merkle tree 的作用:①提供 merkle proof
比特币中的节点分为两类:

  • 全节点 (保存整个区块的内容,即块头块身都有,有交易的具体信息)
  • 轻节点 (例如手机上的比特币钱包)(只有块头)

这时存在一个问题:如何向一个轻节点证明某个交易是写入区块链的?
这时需要用到 merkle proof : 找到交易所在的位置 (最底行的其中一个区块),这时该区块一直往上到根节点的路径就叫 merkle proof。

image-20211214153740297

图中一行是小型的区块链,该图展现的是一个区块的 merkle tree,最下面一行是包含的交易。假设某个轻节点想知道图中黄色的交易,是否包含在了 merkle tree 里面。该轻节点没有包含交易列表,没有这颗 merkle tree 的具体内容,只有一个根哈希值。这时轻节点向一个全节点发出请求,请求证明黄色的交易被包含在这颗 merkle tree 里面的 merkle proof。全节点收到这个请求之后,只需要将图中标为红色的这三个哈希值发给轻节点即可。有了这些哈希值之后,轻节点可以在本地计算出图中标为绿色三个哈希值。首先算出黄色交易的哈希值,即它正上方的那个绿的哈希值,然后跟旁边红色的哈希值拼接起来,可以算出上层节点绿色的哈希值。然后再拼接,再算出上层绿色哈希值,再拼接,就可以算出整棵树的根哈希值。轻节点把这个根哈希值和 block header 里的根哈希值比较一下,就能知道黄色的交易是否在这颗 merkle tree 里。

全节点在 merkle proof 里提供的这几个哈希值,就是从黄色的交易所在的节点的位置到树根的路径上用到的这些哈希值。轻节点收到这样一个 merkle proof 之后,只要从下往上验证,沿途的哈希值都是正确的即可。(验证时只能验证该路径的哈希值,其他路径是验证不了的,即该图中红色的哈希值是验证不了的)

这样是否不安全呢?假如黄色交易被篡改,它的哈希值发生了变化,那能不能调整旁边红色的哈希值,使得它们拼接起来的哈希值是不变的呢?不行,根据 collision resistance,这是不可行的。

merkle proof 可以证明 merkle tree 里面包含了某个交易,所以这种证明又叫 proof of membership 或 proof of inclusion。
对于一个轻节点来说,验证一个 merkle proof 复杂度是多少?假设最底层有 n 个交易,则 merkle proof 复杂程度是 θ(log (n))

如何证明 merkle tree 里面没有包含某个交易?即 proof of non-membership。可以把整棵树传给轻节点,轻节点收到后验证树的构造都是对的,每一层用到的哈希值都是正确的,说明树里只有这些叶节点,要找的交易不在里面,就证明了 proof of non-membership。问题在于,它的复杂度是线性的 θ(n),是比较笨的方法。

如果对叶节点的排列顺序做一些要求,比如按照交易的哈希值排序。每一个叶节点都是一次交易,对交易的内容取一次哈希,按照哈希值从小到大排列。要查的交易先算出一个哈希值,看看如果它在里面该是哪个位置。比如说在第三个第四个之间,这时提供的 proof 是第三个第四个叶节点都要往上到根节点。如果其中哈希值都是正确的,最后根节点算出的哈希值也是没有被改过的,说明第三、四个节点在原来的 merkle tree 里面,确实是相邻的点。要找的交易如果存在的话,应该在这两个节点中间。但是它没有出现,所以就不存在。其复杂度也是 log 形式,代价是要排序。排好序的叫作 sorted merkle tree。比特币中没有用到这种排好序的 merkle tree,因为比特币中不需要做不存在证明。

这节讲了比特币中两种最基本的结构:区块链和 merkle tree,都是用哈希指针来构造的。除了这两种之外,哈希指针还能用另一个方面。

只要一个数据结构是无环的 (非循环链表),都能用哈希指针代替普通指针。有环的话存在一个问题,他们的哈希值没法计算,没法确定一个哈希值固定的区块。

参考笔记:

  1. 区块链笔记在我主页
  2. sam_nau

区块链技术与应用(1 BTC - 密码学原理)

北京大学肖臻老师公开课《区块链技术与应用》,可以直接点击查看视频。

1. 课程简介

  • 课程参考资料:
    • BitCoin and Cryptocurrency TechnologiesA Comprehensive Introduction
    • 以太坊白皮书、黄皮书、源代码
    • Solidity 文档
  • 课程大纲
    • 比特币

      • 密码学基础
      • 比特币的数据结构
      • 共识协议和系统实现
      • 挖矿算法和难度调整
      • 比特币脚本
      • 软分叉和硬分叉
      • 匿名和隐私保护
    • 以太坊

      • 概述:基于帐户的分布式账本
      • 数据结构:状态树、交易树、收据树 -
      • GHOST 协议挖矿: memory-hard mining puzzle
      • 挖矿难度调整
      • 权益证明.
        • Casper the Friendly Finality Gadget(FFG)
      • 智能合约总结与展望

2. BTC - 密码学原理

比特币,被称为加密货币(Crypto-currencg)。但其实加密货币是不加密的,区块链上所有内容都是公开的包含交易记录、交易金额、交易内容甚至源代码都面向全网开放。比特币中主要用到了密码学的两个原理,哈希和签名。

哈希 hash

密码学中用到的哈希函数被称为 cryptographic hash function: 它有两个重要的性质:

① collision resistance (这里指哈希碰撞): 例如 x≠y H (x)=H (y) 两个不同的输入,输出却是相等的,这就称哈希碰撞。它是不可避免的,因为输入空间总大于输出空间。给出 x,很难找到 y,除非蛮力求解 (brute-force)。
该性质的作用:对一个 message 求 digest,比如 message 取 m,m 的哈希值是 H (m)=digest 如果有人想篡改 m 值而 H (m) 不变,则无法做到。哈希碰撞无法人为制造,无法验证,是根据实践经验得来的。

② hiding 哈希函数的计算过程是单向的,不可逆的。(从 H (x) 无法推导出 x) hiding 性质前提是输入空间足够大,分布比较均匀。如果不是足够大,一般在 x 后面拼接一个随机数,如 H (x||nonce)。该性质的作用:和 collision resistance 结合在一起,用来实现 digital commitment (又称为 digital equivalent of a sealed envelope) 把预测结果作为输入 x,算出一个哈希值,讲哈希值公布,hiding 让人们知道哈希值而不知道预测值,最后再将 x 公布,因为有 collision resistance 的性质,预测结果是不可篡改的。

除了密码学中要求的这两个性质外,比特币中用到的哈希函数还有第三个性质:

③puzzle friendly 指哈希值的预算事先是不可预测的。假如哈希值是 00…0XX…X,一样事先无法知道哪个值更容易算出这个结果,还是要一个一个带入。

比特币挖矿的过程中实际就是找一个 nonce,nonce 跟区块的块头里的其他信息合一起作为输入,得出的哈希值要小于等于某个指定的目标预值。H (block header)≤target。block header 指块头,块头里有很多域,其中一个域是我们可以设置的随机数 nonce,挖矿的过程是不停的试随机数,使得 block header 取哈希后落在指定的范围之内。

puzzle friendly 是指挖矿过程中没有捷径,为了使输出值落在指定范围,只能一个一个去试。所以这个过程还可以作为工作量证明 (proof of work)。挖矿很难,验证很容易。(difficult to solve ,but easy to verify)

比特币中用的哈希函数叫作 SHA-256 (secure hash algorithm) 以上三个性质它都是满足的。

签名

在比特币系统中开账户:

在本地创立一个公私钥匙对 (public key ,private key),这就是一个账户。公私钥匙对是来自于非对称的加密技术 (asymmetric encryption algorithm)。加密用的公钥,解密用的私钥。

两人之间信息的交流可以利用密钥 (encryption key),A 将信息加密后发给 B,B 收到后用密钥解密,因为加密和解密用的是同一个密钥,所以叫对称加密。前提是有渠道可以安全地把密钥分发给通讯的双方。因此对称加密的缺点就是密钥的分发不方便,因为在网络上很容易被窃听。非对称密钥是用一对密钥而不是一个,加密用公钥,解密用私钥,加密和解密用的都是接收方的公钥和私钥。公钥是不用保密的,私钥要保密但是私钥只要保存在本地就行,不用传给对方。公钥相当于银行账号,别人转账只要知道公钥就行,私钥相当于账户密码,知道私钥可以把账户上钱转走。公钥和私钥是用来签名。

假如 A 想向 B 转 10 个比特币,A 把交易放在区块链上,别人怎么知道这笔交易是 A 发起的呢?这就需要 A 要用自己的私钥给交易签名,其他人收到这笔交易后,要用 A 的公钥去验证签名。签名用私钥,验证用公钥,用的仍然是同一个人的。创建账户产生相同公私钥的可能性微乎其微,所以大量创建账户来窃取其他人账户是不可行的。

我们假设产生公私钥时有一个好的随机源 (a good source of randomness),产生公私钥是随机的,如果随机源不好,就有可能产生相同的公私钥。比特币中用的签名算法,不仅是生成公私钥的时候要有好的随机源,之后每一次签名时也要有好的随机源。只要有一次签名用的随机源不好的话,就有可能泄露私钥。

参考笔记:

  1. 区块链笔记在我主页
  2. sam_nau

Nginx 核心知识 100 讲学习笔记

初识 nginx

  1. nginx 适用场景

    静态资源服务:通过本地文件系统提供服务。

    反向代理服务:nginx 的强大性能,缓存,负载均衡。

    API 服务:OpenResty

    image-20210216091502611

    阅读全文 »

苏杰的产品创新课

为什么每个人都要学产品创新课

产品经理(Product Manager)和项目经理(Project Manager)都是 PM,,二者存在目标的差异性:

项目经理通常强调完成任务,追求的目标可以用” 多快好省” 这个词来概括,

多,是希望项目范围尽量大;

快,是希望项目周期尽量短;

好,是希望项目质量尽量高;

省,是希望资源消耗尽量少。

这些目标,其实都是偏完成度相关的,很少涉及商业方面的考虑。

而产品经理则不同,通常,真正对一个产品整体负责的产品经理,他要考虑的更多是商业层面的内容,比如用户数、活跃度、收入、利润、市场占有率。很明显,这是最终的商业目标,而不是 “多快好省” 这样的过程目标。

项目经理更强调执行,是接到一个任务,正确地做事 ,

产品经理更强调创新,是设定一个目标,做正确的事

阅读全文 »

从 0 开始学习微服务

微服务的基本概念

微服务的概念最早是在 2014 年由 Martin Fowler 和 James Lewis 共同提出,他们定义了微服务是由单一应用程序构成的小服务,拥有自己的进程与轻量化处理,服务依业务功能设计,以全自动的方式部署,与其他服务使用 HTTP API 通讯。同时,服务会使用最小规模的集中管理 (例如 Docker)技术,服务可以用不同的编程语言与数据库等。

阅读全文 »

Git 安装及配置

  1. 安装 Git
  • 在 Windows 上安装
    在 Windows 上安装 Git 也有几种安装方法。 官方版本可以在 Git 官方网站下载。 打开 https://git-scm.com/download/win,下载会自动开始。 要注意这是一个名为 Git for Windows 的项目(也叫做 msysGit),和 Git 是分别独立的项目;更多信息请访问 http://msysgit.github.io/。
    要进行自动安装,你可以使用 Git Chocolatey 包。 注意 Chocolatey 包是由社区维护的。
    另一个简单的方法是安装 GitHub Desktop。 该安装程序包含图形化和命令行版本的 Git。 它也能支持 Powershell,提供了稳定的凭证缓存和健全的换行设置。 稍后我们会对这方面有更多了解,现在只要一句话就够了,这些都是你所需要的。 你可以在 GitHub for Windows 网站下载,网址为 GitHub Desktop 网站。
  • 其他系统可以参考官方文档
  • 安装完成之后查看版本号
    阅读全文 »