Satatus.go
package main
import (
"crypto/sha256"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
// ํ์ํ ํจํค์ง ๋ฐ ๊ตฌ์กฐ์ฒด ์ ์
type Status struct{}
type SignedQuery struct {
Query map[string]interface{} `json:"query"`
PublicKey string `json:"public_key"`
Signature string `json:"signature"`
}
type Receipt struct {
PreviousBlockhash string `json:"previous_blockhash"`
Beneficiary string `json:"beneficiary"`
SignedQuery map[string]interface{} `json:"signed_query"`
PublicKey string `json:"public_key"`
Signature string `json:"signature"`
}
// MainChain, Env, Bunch, Signer, Hasher ๊ตฌ์กฐ์ฒด ๋ฐ ๊ด๋ จ ๋ฉ์๋ ์ ์ ํ์
// ์ด ๋ถ๋ถ์ ์ค์ ๊ตฌํ์ ๋ง๊ฒ ์์ ํ์
// Mocked functions and structs for demonstration purposes
var lastBlockHash = "mocked_last_block_hash"
type MainChain struct{}
func (mc *MainChain) LastBlock() *Block {
return &Block{BlockHash: lastBlockHash}
}
func MainChainInstance() *MainChain {
return &MainChain{}
}
type Block struct {
BlockHash string
}
type Env struct{}
func (e *Env) Owner() string {
return "mocked_owner"
}
func (e *Env) Peer() *Peer {
return &Peer{PublicKey: "mocked_public_key", PrivateKey: "mocked_private_key"}
}
func EnvInstance() *Env {
return &Env{}
}
type Peer struct {
PublicKey string
PrivateKey string
}
type Bunch struct{}
func (b *Bunch) AddReceipt(receipt *Receipt) {
// ์ค์ ์์์ฆ ์ถ๊ฐ ๋ก์ง ๊ตฌํ
fmt.Println("Receipt added:", receipt)
}
func BunchInstance() *Bunch {
return &Bunch{}
}
type Signer struct{}
func (s *Signer) SignatureValidity(hash, publicKey, signature string) bool {
// ์ค์ ์๋ช
์ ํจ์ฑ ๊ฒ์ฌ ๋ก์ง ๊ตฌํ
return true
}
func (s *Signer) Signature(hash, privateKey string) string {
// ์ค์ ์๋ช
์์ฑ ๋ก์ง ๊ตฌํ
return "mocked_signature"
}
func SignerInstance() *Signer {
return &Signer{}
}
type Hasher struct{}
func (h *Hasher) Hash(data interface{}) string {
jsonData, _ := json.Marshal(data)
hash := sha256.Sum256(jsonData)
return fmt.Sprintf("%x", hash)
}
func HasherInstance() *Hasher {
return &Hasher{}
}
// main ํธ๋ค๋ฌ ํจ์
func (s *Status) Main(w http.ResponseWriter, req *http.Request) {
signedQueryStr := req.FormValue("signed_query")
if signedQueryStr == "" {
signedQueryStr = "{}"
}
var signedQuery SignedQuery
if err := json.Unmarshal([]byte(signedQueryStr), &signedQuery); err != nil {
http.Error(w, "Invalid JSON format", http.StatusBadRequest)
return
}
query := signedQuery.Query
publicKey := signedQuery.PublicKey
signature := signedQuery.Signature
roundKey, _ := query["previous_blockhash"].(string)
mainChain := MainChainInstance()
if mainChain.LastBlock().BlockHash != roundKey || !SignerInstance().SignatureValidity(HasherInstance().Hash(query), publicKey, signature) {
return
}
receiptHeader := map[string]interface{}{
"previous_blockhash": roundKey,
"beneficiary": EnvInstance().Owner(),
"signed_query": signedQuery,
}
receipt := &Receipt{
PreviousBlockhash: roundKey,
Beneficiary: EnvInstance().Owner(),
SignedQuery: signedQuery.Query,
PublicKey: EnvInstance().Peer().PublicKey,
Signature: SignerInstance().Signature(HasherInstance().Hash(receiptHeader), EnvInstance().Peer().PrivateKey),
}
BunchInstance().AddReceipt(receipt)
// ์๋ต์ด ํ์ํ์ง ์์ ๊ฒฝ์ฐ, ๋จ์ํ ๋ฐํ
return
}
func main() {
http.HandleFunc("/status", func(w http.ResponseWriter, req *http.Request) {
status := &Status{}
status.Main(w, req)
})
http.ListenAndServe(":8080", nil)
}
์ฃผ์ ๊ตฌ์ฑ ์์์ ํจ์
์์ฝ
Last updated