主頁 >  其他 > golang實作基礎位元幣系統功能(附完整代碼)

golang實作基礎位元幣系統功能(附完整代碼)

2020-10-06 04:35:03 其他

專案來自視頻教學:https://www.bilibili.com/video/BV1kE411W7aD?

文章中有完整代碼鏈接

專案功能演示

1. printChain 輸出整條區塊鏈

simple:

2. getBalance ADDRESS 查詢賬戶余額

引數: ADDRESS-賬戶地址
simple:

3. send FROM TO AMOUNT MINER DATA 由FROM轉AMOUNT錢給TO,由MINER挖礦,同時寫入DATA

引數: FROM-轉出人 TO-轉入人 AMOUNT-轉賬金額 MINER-挖礦人 DATA-鑄幣交易可以自添加的資料
simple:

4. getTransaction TXHASH 查詢交易資訊

引數 TXHASH-交易hash
simple:

5. newWallet 創建一個新的錢包(公私鑰對)

simple:

6. listAddress 列舉所有的錢包地址

simple:

一、Go基礎

G252o環境安裝

Go語言

去官網下載并安裝配置好全域變數即可,記得配置GOROOT和GOPATH

編程IDE:GOLand的安裝與破解

詳情見:https://tech.souyunku.com/?p=16189

Go專案的目錄結構

專案目錄結構如何組織,一般語言都是沒有規定,但Go語言這方面做了規定,這樣可以保持一致性,做到統一、規則化比較明確,

1、一般的,一個Go專案在GOPATH下,會有如下三個目錄:

|--bin

|--pkg

|--src

其中,bin存放編譯后的可執行檔案;pkg存放編譯后的包檔案;src存放專案源檔案,

對于pkg目錄,曾經有人問:我把Go中的包放入pkg下面,怎么不行啊?他直接把Go包的源檔案放入了pkg中,

這顯然是不對的,pkg中的檔案是Go編譯生成的,而不是手動放進去的,(一般檔案后綴.a)

對于src目錄,存放源檔案,Go中源檔案以包(package)的形式組織,通常,新建一個包就在src目錄中新建一個檔案夾,

二、專案中的資料庫Blot

1.Blot簡介與實體

簡介:一個小型的key-value資料庫,沒有sql,輕便快捷高效,

操作demo詳情見:https://blog.csdn.net/yang731227/article/details/82974575

結構:

demo:

package main

import (
	"fmt"
	"itcast_Go/bolt"
	"log"
)

func main()  {
	//1. 打開資料庫
	//第一個引數是名字,第二個引數是權限6代表允許讀寫
	db, err := bolt.Open("test.db", 0600, nil)
	defer db.Close()
	if err != nil{
		log.Panic("打開資料庫失敗!" , err)
	}
	//操作資料庫
	db.Update(func(tx *bolt.Tx) error {
		//2. 打開抽屜(沒有就創建)
		var bucketName []byte = []byte("b1")
		bucket := tx.Bucket(bucketName)
		if bucket == nil{
			//沒有就創建
			bucket, err = tx.CreateBucket(bucketName)
			if err != nil{
				log.Panic(err)
			}
		}
		//操作抽屜中的資料,添加資料
		//3. 寫資料
		bucket.Put([]byte("1111"), []byte("hello"))
		bucket.Put([]byte("2222"), []byte("world"))
		return nil
	})

	//4. 讀資料
	db.View(func(tx *bolt.Tx) error {
		//找到抽屜
		bucket := tx.Bucket([]byte("b1"))
		if bucket != nil{
			//如果存在就讀取
			v1 := bucket.Get([]byte("1111"))
			v2 := bucket.Get([]byte("2222"))
			//輸出
			fmt.Printf("'1111'-> %s\n", v1)
			fmt.Printf("'2222'-> %s\n", v2)
		}
		return nil
	})
}

2.專案存盤結構分析

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-OrNGpTtT-1601776118143)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200914200555511.png)]

三、專案中go語言的區塊序列化與反序列化

對于較為復雜的資料,采用序列化作為value存盤在k/v資料庫(blot)中,那么go語言的序列化與反序列化的基本操作是怎樣的呢?

使用gob來簡化操作,看完demo就懂:

demo:

package main

import (
   "bytes"
   "encoding/gob"
   "fmt"
   "log"
)

//創建“人”結構體
type Person struct {
   Name string
   Age uint
}

func main()  {
   //定義一個“人”結構
   var xiaoming Person
   xiaoming.Name = "小明"
   xiaoming.Age = 18
   //編碼的資料放進buffer
   var buffle bytes.Buffer

   //使用gob序列化得到位元組流
   //定義一個編碼器encoder
   encoder := gob.NewEncoder(&buffle)
   //編碼結構體
   err := encoder.Encode(&xiaoming)
   if err != nil{
      log.Panic(err)
   }
   fmt.Printf("小明編碼后的結果為:%v\n", buffle.Bytes())

   //使用gob反序列化得到結構體
   //創建byte讀input流,然后創建解碼器
   decoder := gob.NewDecoder(bytes.NewReader(buffle.Bytes()))
   var daming Person
   //解碼
   err = decoder.Decode(&daming)
   if err != nil{
      log.Panic(err)
   }

   fmt.Printf("解碼后的小明: %v\n", daming)

}

四、Go語言迭代器原理與區塊鏈的特殊迭代

range內部其實就是指標的迭代指向,然后賦值使用:

但是由于區塊鏈指標的特殊性,所以迭代需要從后向前迭代:

五、Go語言命令列的使用

很簡單

demo:

package main

//go命令列測驗

import (
   "fmt"
   "os"
)

//go命令列練習
func main()  {
   len1 := len(os.Args)
   fmt.Printf("命令長度為:%d\n", len1)
   for i, cmd := range os.Args{
      fmt.Printf("arg[%d]: %s\n", i, cmd)
   }

}

六、專案添加轉賬功能

轉賬重要的兩點:

  1. 每一筆交易能支配的錢都來自于上一個交易的輸出
  2. 每一個花費的輸出要一次性花完,有剩余的都要轉給自己

首先需要熟悉下位元幣交易腳本的三種模式介紹:

北大肖臻-第9講-位元幣腳本

專案交易的結構:

七、賬戶余額UTXO計算細節

1. 計算賬戶余額時統計UTXO

遍歷UTXO去統計某個賬戶的余額,如果只是簡單的遍歷則效率太低,而區塊鏈中的交易都是相關聯的,所以利用這一特點可以使用一些小技巧:

圖中黃色是已消費的輸出,藍色是還未消費的輸出

2. 轉賬時計算UTXO中的賬戶余額

專案中并沒有優化計算最合適的將零錢拼裝,而是簡單的遍歷逐步統計,滿足要求了就轉賬

八、blotDB資料庫的可視化

  1. 下載工具:運行go get github.com/boltdb/boltd

  2. 就會下載到GOPATH目錄中,查看GOPATH方法:go env

  3. 找到cmd檔案夾中的main檔案編譯其成為可執行檔案,編譯go build main.go

  4. 把可執行檔案放到和blot的db類檔案相同的目錄下,運行:main.exe -- xxx.db

  5. 顯示結果:

九、公私鑰

位元幣公私鑰與地址的關系

公鑰生成地址的流程:

最后一步要用到base58演算法,一般都沒有這個包,可以通過以下命令引入位元幣原始碼官方的提供的包:

go get github.com/btcsuite/btcutil/base58

十、P2PKH的檢驗方式

1. 位元幣的幾種校驗方式

https://blog.csdn.net/weixin_43988498/article/details/107958185 三種位元幣的校驗方式

貼出P2PKH的校驗流程:

img

這一種是較為常見的一種形式,輸出腳本中輸出的是公鑰的Hash,而輸入腳本中要除了簽名還要包含公鑰

除了這些,其他的DUP、HASH160都是一些驗證操作,

腳本執行程序:

同樣的為了方便看,將輸入與輸出拼接到一起,從上往下執行,

img

前兩步操作相同,將輸入中的簽名和公鑰壓入堆疊

img

第三步操作DUP是將堆疊頂的公鑰復制一份

img

第四步操作HASH160是將復制的公鑰取HASH值,然后壓入堆疊中,

第五步,將輸出腳本里面的公鑰Hash壓入堆疊,這時堆疊里面出現了兩個公鑰的Hash值

搞清楚這個Hash值的來源:

img

第六步,EQUALVERIFY是彈出堆疊頂的兩個Hash值,比較兩者是否相等,

img

最后一步,和之前一樣,分別彈出,檢查公鑰與簽名是否配對(正確),

img

整個程序如果兩個Hash對不上,或者公鑰與私鑰簽名對不上,那么這個交易就是錯誤的,非法的

實體:

img

重點:

兩個保證:

1. 輸入中的公鑰和上一個輸出的公鑰的hash進行校驗,使input與output連接起來,保證使用者的身份的統一

2. 輸出入中的私鑰簽名與輸出的公鑰進行驗證,保證使用者使用此筆錢的權利,必須本人簽名了這個input才能被使用

2. 專案中的邏輯

采用P2PKH的校驗方式,輸入要包含公鑰和私鑰簽名,而輸出則需要包含公鑰的hash

公鑰的hash可以通過地址倒推:

這里的公鑰hash并不是簡單的最原始公鑰做一次SHA256,從圖中可以看出還經過了RIPEMD160的加密

代碼:

//地址轉其公鑰的hash函式
//(地址是由公鑰計算過來的, 可以逆推回去到公鑰的hash,但是無法逆推到原公鑰,原公鑰無法逆推到私鑰,因為hash函式不可逆)
func (Output *TxOutput)Lock(address string)  {
   // 1.base58函式的解碼
   bytes25Data := base58.Decode(address)
   // 2.去除尾部添加的4byte校驗碼和首部添加的1byte版本號
   addressHash := bytes25Data[1: len(bytes25Data)-4]
   // 3.賦值給Output
   Output.PubKeyHash = addressHash
}

十一、地址String到公鑰hash的分場景安全策略

  1. 在NewTransaction函式中,我們使用地址,不采用反推公鑰Hash,因為涉及轉賬,此地址不一定是自己錢包中管理的地址,所以需要通過在本地錢包中讀取公私鑰,并且讀取的另一個目的就是接下來要使用私鑰
  2. 在getBalance函式中,獲取某個賬戶的余額,需要使用地址查詢UTXO,此時我們可以使用函式反推的方式去查詢,而不需要查詢本地錢包,因為對于區塊鏈系統來說,查詢余額功能是全網都可以使用的,不僅限于本地錢包賬戶,

十二、對于地址使用之前的校驗細節

不論是getBalacne還是Send轉賬,都需要對用戶輸入的地址進行校驗,

因為通過string逆推得到公鑰hash的方式會截去尾部的4位元組還有前面的四位元組,所以即使是后面幾位不同的地址不做檢測就查詢的話可能會查出一樣的結果

所以在查詢之前一定要做校驗

校驗的原理來自于那個四位元組的分支!

校驗流程思路: (先反向走在正向走岔路回來)

  1. 根據地址反推出25byte的資料,截斷后4位元組得到21位元組的資料
  2. 將這21byte資料進行兩次SHA256,再截取4位元組的校驗碼
  3. 通過校驗碼與原本的25位元組資料后四位比對

代碼:

//校驗地址
//校驗流程思路:  (先反向走在正向走岔路回來)
func checkAddress(address string) bool {
   //1. 根據地址反推出25byte的資料,截斷后4位元組得到21位元組的資料
   bytes25Data := base58.Decode(address)
   if len(bytes25Data) < 4 {     //地址長度不夠直接回傳
      return false
   }
   this4Bytes := bytes25Data[: 4]
   //2. 將這21byte資料進行兩次SHA256,再截取4位元組的校驗碼
   org4Bytes := CheckSum(adsToPubKeyHash(address))
   //3. 通過校驗碼與原本的25位元組資料后四位比對
   return bytes.Equal(this4Bytes, org4Bytes)
}

加上校驗后效果:

十三、 簽名驗證

1. 簽名需要的內容:

  • 被簽名的資料
  • 私鑰

2. 驗證需要的內容 :

  • 已簽名的資料
  • 公鑰
  • 數字簽名

3. 注意事項

  1. 一個交易中同一個人的每一個input都需要簽名

  2. 具體簽名的資料需要能夠包含整個交易詳細內容

  3. 驗證時也是每個input都要驗證一次

  4. 簽名是由創建交易的節點完成,而校驗是驗證交易的節點完成

4. 對于每個input的簽名程序

每個input都有其對應的唯一的output,復制一份input,獲取其output的pubKeyHash賦值到input的pubKey中

對于每個交易中的input其自己生成的output就在同交易中并且其中自帶pubKeyHash和轉賬金額

對這個整體交易做hash,賦值到input的簽名中

1. 為什么不直接用創建新交易時打開的錢包中的公鑰去計算簽名hash,而是使用如此復雜的程序去尋找前一個hash?

因為直接用那個公鑰簽名的話那么驗證一定是成功的,因為公私鑰是一起那出來的,根據input中的前一個交易hash和outputindex找出來其關聯的output的pubKeyhash才是正確的做法,也是為了后面的驗證,

2. 注意對于每個input的簽名,在當前交易中與其無關的其他input的pubKey和ScriptSig都應該是空

代碼:

//簽名的實作
//引數:賬戶的私鑰
func (tx *Transaction) Signature(privateKey *ecdsa.PrivateKey, bc *BlockChain)  {
   // 1.復制一份input,獲取其output的pubKeyHash賦值到input的pubKey中(只是為了計算簽名)
   trimmedCopyTx := TrimmedCopy(tx, bc)
   //對于每個交易中的input其自己生成的output就在同交易中并且其中自帶pubKeyHash和轉賬金額
   // 2.對這個整體交易做hash,賦值到input的簽名中
   for i, input := range trimmedCopyTx.Vin{
      //2.1 找到每個input關聯的上一個output的公鑰hash,并添加到當前的input的pubKey中
      //獲取上一個交易
      preTx, err := FindTxByTxHash(input.TxHash, bc)
      if err != nil{
         log.Panic("簽名時查找相關輸出交易出錯!", err)
      }
      //獲取該交易中的output中的公鑰hash
      prePubKeyHash := preTx.Vout[input.OutputIndex].PubKeyHash
      //注意!在這里直接對input賦值是無效的!!!
      trimmedCopyTx.Vin[i].PubKey = prePubKeyHash
      //2.2 簽名需要的資料都具備了,做hash處理
      trimmedCopyTx.SetTxHash()  //交易的hash就是需要的簽名資料
      signDataHash := trimmedCopyTx.TxHash
      //2.3 重要的一步!把當前交易中的這個input的pubKey還原為空,保證不影響其他input的簽名
      trimmedCopyTx.Vin[i].PubKey = nil
      //2.4 執行簽名動作得到r,s位元組流
      r, s, err := ecdsa.Sign(rand.Reader, privateKey, signDataHash)
      if err != nil{
         log.Panic(err)
      }
      //2.5 把簽名放到原本交易的ScriptSig中
      signnature := append(r.Bytes(), s.Bytes()...)
      tx.Vin[i].ScriptSig = signnature
   }
}

簽名的驗證

//驗證交易
func (tx *Transaction) Verify(bc *BlockChain) bool {
   if tx.isCoinbaseTx(){
      return true          //鑄幣交易無需驗證
   }
   //1. 獲取驗證所需要的資料
   // 1.1 Data
   trimmedCopy := tx.TrimmedCopy(bc)
   for i, input := range tx.Vin{  //注意,遍歷的是原本的交易
      preTx, err := FindTxByTxHash(input.TxHash, bc)
      if err != nil{
         log.Panic(err)
      }
      trimmedCopy.Vin[i].PubKey = preTx.Vout[input.OutputIndex].PubKeyHash
      //計算hash
      trimmedCopy.SetTxHash()
      //a. Data得到
      dataHash := trimmedCopy.TxHash
      // 還原
      trimmedCopy.Vin[i].PubKey = nil
      //b. 簽名得到
      signature := input.ScriptSig
      //c. 公鑰
      //拆解PubKey, X, Y得到原生公鑰
      PubKey := input.PubKey

      //拆開簽名,得到r和s
      r1 := big.Int{}
      s1 := big.Int{}
      //r是前半部分,s是后半部分
      r1.SetBytes(signature[:len(signature)/2])
      s1.SetBytes(signature[len(signature)/2:])

      //拆開公鑰,得到x和y
      x := big.Int{}
      y := big.Int{}
      //r是前半部分,s是后半部分
      x.SetBytes(PubKey[:len(PubKey)/2])
      y.SetBytes(PubKey[len(PubKey)/2:])
      //得到公鑰原型
      pubKeyOrigin := ecdsa.PublicKey{elliptic.P256(), &x, &y}

      //1.2 verify
      if !ecdsa.Verify(&pubKeyOrigin, dataHash, &r1, &s1){
         return false         //一旦有一個input驗證錯誤就失敗
      }
   }
   return true
}

十四、專案總結

1. 專案完成的功能

  • 區塊的創建
  • 交易的打包
  • 用戶余額的查詢
  • pow挖礦演算法
  • 錢包功能,增加賬戶、管理賬戶等
  • 轉賬功能
  • 公私鑰簽名以及驗證

2. 專案的待完善地方(缺點)

  • 每個區塊都是只能打包一個交易就直接發布了,沒有區塊鏈網路體系去獲取交易
  • 分布式網路共識協議沒有實作
  • 梅克爾樹root的計算,目前專案只是簡單的拼接位元組
  • 簽名機制待完善,專案使用的簽名驗證方式是P2PKH,還有P2SH、多重簽名等可以完善
  • 遠程訪問rpc呼叫,類似于geth的遠程訪問
  • 客戶端的構建

十五、專案代碼地址

https://github.com/xwjahahahaha/simpleBitCoin/tree/main/version9

Tips

1.Go語言語法

  1. 在同一個包下的go檔案不需要使用import匯入
  2. 使用命令go run xxx.go命令運行main主函式的時候,如果同個包下的go檔案互相呼叫函式,單獨go build main.go(編譯),go run main.go(運行)是不對的:

解決辦法:

  1. linux下:go build *.go go run *.go
  2. windows下: go build./ go run ./

2.Goland的使用技巧

ctrl + b 進入查看函式實作

3.Blot中要注意的細節

bucket.Put()方法如果bucket不存在那么就是直接的添加,但是如果已經存在了,那么就是更新,所以不存在Key重復的問題

4.go結構體內欄位命名不規范導致使用gob出錯!!!!Golang大坑!

注意:go語言中的結構體內的欄位都必須首字母大寫,不然會報如下錯誤:

gob: type main.Person has no exported fields

記住,Golang的結構體命名欄位必須要大寫,不然序列化都可能不行!!!!!

5. go回圈修改陣列值無效

注意Go語言和python一樣回圈修改資料的值必須使用索引!!!!

例: 錯誤示范:

for _, output := range outputArray{
   output.TxHash = newTxHash
}

正確做法:

for i := range outputArray{
   outputArray[i].TxHash = newTxHash
}

6. 關于golang.org/x包問題

由于谷歌被墻,跟谷歌相關的模塊無法通過go get來下載,解決方法:

git clone https://github.com/golang/net.git $GOPATH/src/github.com/golang/net

git clone https://github.com/golang/sys.git $GOPATH/src/github.com/golang/sys

git clone https://github.com/golang/tools.git $GOPATH/src/github.com/golang/tools

ln -s $GOPATH/src/github.com/golang $GOPATH/src/golang.org/x

上面三條命令會把所要用到的官方輔助包都下載到$GOPATH/src/github.com/golang中,在windows下軟連接不好弄,我的方法就是下載好了以后把這些復制一份到``$GOPATH/src/golang.org/x下,使用的時候就優先使用golang.org/x下的包,

7. 使用gob進行編碼

使用gob進行編碼的時候,如果位元組流中或者自定義的結構有interface()物件那么需要提前注冊

編碼解碼的時候都需要添加!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/158725.html

標籤:其他

上一篇:【密碼學原理】RSA演算法

下一篇:區塊鏈中的數學(四十二)---基于RSA的VRF(隨機可驗證函式)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more