Transaction

512f51de58fdbf2bc7ec9d0d0b089914e8f0b24561a710c5c8b1e5adc068da2e
( - )
218,072
2020-02-23 16:25:05
1
3,785 B

3 Outputs

Total Output:
  • j"19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAutMR package main import ( "crypto/sha256" "encoding/hex" "encoding/json" "fmt" "bitbucket.org/simon_ordish/cryptolib/transaction" "github.com/btcsuite/btcd/btcec" ) const protocolName = "ac1eed88" const cbdVersion = "0.1" type coinbaseDoc struct { Version string `json:"version"` Height uint64 `json:"height"` PrevMinerID string `json:"prevMinerId"` PrevMinerIDSig string `json:"prevMinerIdSig"` MinerID string `json:"minerId"` Vctx vctx `json:"vctx"` MinerContact minerContact `json:"minerContact"` } type vctx struct { TxID string `json:"txId"` Vout uint64 `json:"vout"` } type minerContact struct { Name string `json:"name"` Email string `json:"email"` MerchantAPIEndPoint string `json:"merchantAPIEndPoint"` } func createCoinbaseDocument(height uint64, minerID string, prevMinerIDPrivKey *btcec.PrivateKey, vcTx string, mc minerContact) (coinbaseDoc, error) { prevMinerID := prevMinerIDPrivKey.PubKey().SerializeCompressed() p1 := prevMinerID p2, _ := hex.DecodeString(minerID) p3, _ := hex.DecodeString(vcTx) payload := []byte{} payload = append(payload, p1...) payload = append(payload, p2...) payload = append(payload, p3...) hash := sha256.Sum256(payload) prevMinerIDSig, err := prevMinerIDPrivKey.Sign(hash[:]) if err != nil { fmt.Println(err) return coinbaseDoc{}, err } v := vctx{ TxID: vcTx, Vout: 0, } doc := coinbaseDoc{ Version: cbdVersion, Height: height, PrevMinerID: hex.EncodeToString(prevMinerID), PrevMinerIDSig: hex.EncodeToString(prevMinerIDSig.Serialize()), MinerID: minerID, Vctx: v, MinerContact: mc, } return doc, nil } func createMinerIDOpReturn(height uint64, prevMinerIDPrivKey *btcec.PrivateKey, minerIDPrivKey *btcec.PrivateKey, vcTx string, mc minerContact) (string, error) { minerID := hex.EncodeToString(minerIDPrivKey.PubKey().SerializeCompressed()) doc, err := createCoinbaseDocument(height, minerID, prevMinerIDPrivKey, vcTx, mc) if err != nil { return "", err } payload, err := json.Marshal(doc) if err != nil { return "", err } hash := sha256.Sum256([]byte(payload)) signature, err := minerIDPrivKey.Sign(hash[:]) if err != nil { return "", err } var parts [][]byte // 00 parts = append(parts, []byte(protocolName)) parts = append(parts, payload) parts = append(parts, []byte(hex.EncodeToString(signature.Serialize()))) // If we have some data, make another output with an OP_RETURN for it. output, err := transaction.NewOutputOpReturnPush(parts) if err != nil { return "", err } return hex.EncodeToString(output.GetOutputScript()), nil } func main() { var h uint64 = 123 // mid := "03f9d057f6ff6606f615302812db37f6eccdd531cdd2c321673af187cf7dbbb9ae" v := "11c9f0be55da88192f1b6538468975bcfc1635c48f1ce9eeae12cdaefc5a4c99" privKey, err := btcec.NewPrivateKey(btcec.S256()) if err != nil { fmt.Println(err) return } prevPrivKey, err := btcec.NewPrivateKey(btcec.S256()) if err != nil { fmt.Println(err) return } mc := minerContact{ Name: "demo", Email: "[email protected]", MerchantAPIEndPoint: "api.demo.com", } // doc, err := createCoinbaseDocument(h, mid, privKey, v, mc) opr, err := createMinerIDOpReturn(h, prevPrivKey, privKey, v, mc) // fmt.Println(doc) fmt.Printf("%+v\n", opr) } text/plain; charset=utf-8UTF-8Bcreate-coinbase-doc.go.txt1e80c340-5657-11ea-8956-95a1b4ec298c.txt
    https://whatsonchain.com/tx/512f51de58fdbf2bc7ec9d0d0b089914e8f0b24561a710c5c8b1e5adc068da2e