// makeSignedAnnouncement creates a []byte that contains an encoded and signed // host announcement for the given net address. func makeSignedAnnouncement(na modules.NetAddress) ([]byte, error) { sk, pk, err := crypto.GenerateKeyPair() if err != nil { return nil, err } spk := types.SiaPublicKey{ Algorithm: types.SignatureEd25519, Key: pk[:], } return modules.CreateAnnouncement(na, spk, sk) }
// announce creates an announcement transaction and submits it to the network. func (h *Host) announce(addr modules.NetAddress) error { // The wallet needs to be unlocked to add fees to the transaction, and the // host needs to have an active unlock hash that renters can make payment // to. if !h.wallet.Unlocked() { return errAnnWalletLocked } err := h.checkUnlockHash() if err != nil { return err } // Create the announcement that's going to be added to the arbitrary data // field of the transaction. signedAnnouncement, err := modules.CreateAnnouncement(addr, h.publicKey, h.secretKey) if err != nil { return err } // Create a transaction, with a fee, that contains the full announcement. txnBuilder := h.wallet.StartTransaction() _, fee := h.tpool.FeeEstimation() fee = fee.Mul64(500) // Estimated txn size (in bytes) of a host announcement. err = txnBuilder.FundSiacoins(fee) if err != nil { txnBuilder.Drop() return err } _ = txnBuilder.AddMinerFee(fee) _ = txnBuilder.AddArbitraryData(signedAnnouncement) txnSet, err := txnBuilder.Sign(true) if err != nil { txnBuilder.Drop() return err } // Add the transactions to the transaction pool. err = h.tpool.AcceptTransactionSet(txnSet) if err != nil { txnBuilder.Drop() return err } h.announced = true h.log.Printf("INFO: Successfully announced as %v", addr) return nil }