In diesem Beitrag habe ich erkärt, wieso weshalb warum ich die Scripte zum KAVA autocompouding gebaut habe.
Mit dem KAVA-10 Mainnet update musste ich meine scripts anpassen, hier die aktuellen Versionen:
In diesem Beitrag habe ich erkärt, wieso weshalb warum ich die Scripte zum KAVA autocompouding gebaut habe.
Mit dem KAVA-10 Mainnet update musste ich meine scripts anpassen, hier die aktuellen Versionen:
kava.io bietet DeFI auf der BEP2 Chain an. KAVA Tokens können gestaked werden, aktuell gibt es um die 20% APR. Mit Wallets wie z.B. dem Trustwallet oder Ledger kann man KAVA staken. Möchte man jedoch vom Zinsenzinseffekt profitieren, so muss man derzeit manuell seine Staking-Rewards einsammeln und manuell wieder erneut delegieren.
Aber es handelt sich ja um eine Kryptowährung, welche sich bekanntlich programmieren lassen. Daher habe ich schnell mal das SDK gezogen, etwas gepatcht und folgenden Autocompounder gebaut:
autocompounder.js:
const Env = require("./env").env;
const kavaUtils = require("./src/utils").utils;
'use strict';
const KavaClient = require('./src/client').KavaClient;
const tx = require('./src/tx').tx;
const msg = require('./src/msg').msg;
const utils = require('./src/utils').utils;
const crypto = require('./src/crypto').crypto;
module.exports = {
KavaClient,
tx,
msg,
utils,
crypto,
};
const KAVA_CONVERSION_FACTOR = 10 ** 6;
const COMPOUND_LIMIT = 0.2 ; // the amount of pending rewards at which we start autocompounding
var main = async () => {
kavaClient = new KavaClient(Env.KavaEndpoints.Mainnet);
kavaClient.setWallet(Env.KavaAccount.Mainnet.Mnemonic);
kavaClient.setBroadcastMode("async");
await kavaClient.initChain();
unused_balance = 0;
console.log("Account:", Env.KavaAccount.Mainnet.Address);
let balances = await kavaClient.getBalances(Env.KavaAccount.Mainnet.Address);
let kavaBalance = balances.find((item) => item.denom.toUpperCase() === "UKAVA");
if(kavaBalance) {
console.log("\tBalance (kava):", kavaBalance.amount / KAVA_CONVERSION_FACTOR);
unused_balance = kavaBalance.amount / KAVA_CONVERSION_FACTOR ;
}
let kavaDelegations = await kavaClient.getDelegations(Env.KavaAccount.Mainnet.Address);
let staked = 0 ;
let validators = [];
let bal_before = 0;
for (let element of kavaDelegations) {
let balance = element.balance;
validators.push(element.validator_address);
staked = staked + (balance.amount / KAVA_CONVERSION_FACTOR);
if (bal_before < staked ) {
bal_before = staked;
next_val = element.validator_address;
}
}
console.log("\tStaked (kava):" , staked) ;
console.log("\tnext validator: ", next_val);
if (unused_balance > COMPOUND_LIMIT) {
let new_stake_balance = unused_balance - 0.01 ;
console.log("new staking: ", new_stake_balance);
denom_val = new_stake_balance.toFixed(5) * KAVA_CONVERSION_FACTOR;
let txMsgs = [] ;
txMsgs.push ( {
type: 'cosmos-sdk/MsgDelegate',
value: {
delegator_address: Env.KavaAccount.Mainnet.Address,
validator_address: next_val,
amount: {denom:'ukava', amount: denom_val.toString() }
},
});
let txid = await kavaClient.sendTx(txMsgs, fee={amount: [{ denom: 'ukava', amount: "0" }], gas: String(300000)}, null);
console.log("stake kava, created TX ", txid) ;
}
let kavaRewards = await kavaClient.getDistributionRewards(Env.KavaAccount.Mainnet.Address);
let Rewards = kavaRewards.total.find((item) => item.denom.toUpperCase() === "UKAVA");
if(Rewards) {
console.log("\tStaking Rewards (kava):", Rewards.amount / KAVA_CONVERSION_FACTOR);
}
if (Rewards.amount / KAVA_CONVERSION_FACTOR > COMPOUND_LIMIT) {
console.log("time to get rewards!");
let txMsgs = [] ;
for (let val of validators) {
txMsgs.push ( {
type: 'cosmos-sdk/MsgWithdrawDelegationReward',
value: {
delegator_address: Env.KavaAccount.Mainnet.Address,
validator_address: val,
},
});
}
let txid = await kavaClient.sendTx(txMsgs, fee={amount: [{ denom: 'ukava', amount: "0" }], gas: String(300000)}, null);
console.log("fetched rewards, created TX ", txid) ;
}
}
main();
env.js:
const KavaAccount = {
Local: {
Address: "",
Mnemonic: ""
},
Testnet: {
Address: "",
Mnemonic: "",
},
Mainnet: {
Address: "kava1757uf8nmejhlqnmk99n4d9y78taud4neneutus",
Mnemonic: "send some kava to my address to show some love",
}
}
const KavaEndpoints = {
Local: "http://localhost:1317",
Testnet: "https://kava-testnet-8000.kava.io",
Mainnet: "https://api.kava.io",
}
const KavaDeputy = {
Testnet: "kava1tfvn5t8qwngqd2q427za2mel48pcus3z9u73fl",
Mainnet: "kava1r4v2zdhdalfj2ydazallqvrus9fkphmglhn6u6",
}
const BinanceAccount = {
Testnet: {
Address: "",
Mnemonic: "",
},
Mainnet: {
Address: "",
Mnemonic: ""
}
}
const BinanceEndpoints = {
Testnet: "https://testnet-dex.binance.org",
Mainnet: "https://dex.binance.org/",
}
const BinanceDeputy = {
Testnet: "tbnb1et8vmd0dgvswjnyaf73ez8ye0jehc8a7t7fljv",
Mainnet: "bnb1jh7uv2rm6339yue8k4mj9406k3509kr4wt5nxn"
}
module.exports.env = {
KavaAccount,
KavaEndpoints,
KavaDeputy,
BinanceAccount,
BinanceEndpoints,
BinanceDeputy
}
Google Drive, Amazon S3, Dropbox, Icloud – viele kennen diese Cloudservices und nutzen sie. Meistens geht alles gut, aber folgendes sollte einem doch zu denken geben:
“Dropbox ist dazu übergegangen, die Konten von Nutzern zu sperren, die gegen das Urheberrecht verstoßen bzw. deren Konten mehrfach Gegenstand von Anschuldigungen wegen Urheberrechtsverstößen waren.”
D.h. unter gewissen Umständen kommt man nicht mehr an seine Daten. Man ist den Anbietern sozusagen ausgeliefert. Abhilfe schaffen hier blockchainbasierte Services, welche Daten verteilt redundant und verschlüsselt auf vielen verschiedenen Rechnern im Netz speichern. Unter https://sia.tech bekommt man ein hübsches GUI für das Sia storage Netzwerk. Die Idee ist einfach: Das Netzwerk wird über eine Blockchain durch Mining abgesichert und Verträge werden darüber geschlossen. User, die Speicherplatz zur Verfügung stellen erhalten eine Vergütung, andere User können den Speicher mieten. Durch sia ist sichergestellt dass die Daten mehrfach im Netzwerk gespeichert werden und dass diese verschlüsselt abgelegt sind. Nur der Nutzer mit den entsprechenden wallet erhält Zugriff auf seine Dateien.
Das Userinterface Sia UI ist für Endanwender gemacht. Es läuft unter Windows, macOS und Linux. Es gibt auch die Möglichkeit, Sia über NDB zu mounten, was ich jedoch nicht zuverlässig betreiben konnte. (sia-nbdserver) oder mittels FUSE zu mounten, allerdings bisher nur read-only. Eine weitere Möglichkeit bietet die Sia API. Einige kennen vielleicht schon Nextcloud, den Owncloud Nachfolger und haben diesen schon genutzt. Bei diesem kann man auch externe Speicher einbinden, wie z.B. Google Drive oder Dropbox, man hat dann aber eben das Problem nicht Herr seiner Daten zu sein. Vor ein paar Jahren gab es schon mal ein externes Storage Modul für Nextcloud zur Einbindung von Sia Storage, allerdings hat man es nun 3 Jahre lang nicht weiterentwickelt. Mit der aktuellen Nextcloud 20 lief es nicht.
Aus diesem Grund habe ich mir den Code einmal angeschaut und für Nextcloud 20 flottgemacht. Ein paar Features, die ich im Gitlab zu dem Projekt gefunden habe, konnte ich direkt mit umsetzen. Die aktuelle Version gibt es hier: https://gitlab.com/f.wiessner/Sia-Nextcloud
Hier noch kurz ein kleines “Howto”, wie man das ganze in Betrieb nimmt. Vorraussetzung sind ein installiertes Nextcloud 20, ein installiertes sia (man kann hier einfach das neue siastream nutzen, welches gleich Contracts etc erstellt und nutzerfreundlicher ist) und den Code von meinem Repository.
Siastream gibt es unter https://siastream.tech/, aktuell in Version 1.0.4. Sobald man es heruntergeladen, entpackt und gestartet hat, braucht man sich um nichts weiter kümmern. Siastream installiert den Sia-Daemon gleich mit und startet auch den Sync der Sia-Chain automatisch. Unter http://localhost:3000 bzw. wenn man siastream mit –host 0.0.0.0 startet unter der IP des Servers Port 3000 kommt man auf das Administrationsinterface.
Unter Deposit kann man dann Siacoins hinterlegen die man benötigt um Contracts zu schliessen. Aktuell kostet 1 TB ca. 5 US $ pro Monat. Sia Coins (Kürzel SC) gibt es z.B. bei Binance (https://www.binance.com/en/register?ref=KM4WQJ9K) – mit meinem Link bekommst Du 5% Rabatt auf Transaktionsgebühren jeglicher Art! Nachdem man eine Menge an SC aufgeladen hat, kann es dann auch schon losgehen:
Den Code von meinem Repository hier herunterladen: https://gitlab.com/f.wiessner/Sia-Nextcloud z.B. mit
git clone https://gitlab.com/f.wiessner/Sia-Nextcloud.git
Den Code kopiert man in die Nextcloud Installation in den Ordner nextcloud/apps/files_external_sia
mkdir nextcloud/apps/files_external_sia ; cp -dpr Sia-Nextcloud/* nextcloud/apps/files_external_sia
Unter Umständen muss in nextcloud/apps/files_external_sia/sia-php/Requests noch https://github.com/WordPress/Requests/ nachgeladen werden:
cd apps/files_external_sia/sia-php/ ; git clone https://github.com/WordPress/Requests.git
Nun kann man unter Settings im External Storage Menü Sia aktivieren und ein paar Parameter übergeben:
Der erste Parameter 127.0.0.1:9980 ist die Adresse des sia-Daemons siad. In dem Bild ist der default hinterlegt. Der zweite Parameter ist ein Verzeichnis auf dem Server, für welches der Webserver User (www-data) und der siad User Berechtigungen haben und dient als Cache Verzeichnis. Der dritte Parameter ist der API-Key. Diesen findet man nach der Installation von Siastream oder siad im Verzeichnis ~/.sia/apipassword. Nun kann man noch einen Prefix festlegen, wo die Daten im Sia-Storage abgelegt werden sollen, und ob Nextcloud für jeden Benutzer ein eigenes Unterverzeichnis bereitstellen soll, oder ob alle Daten für jeden sichtbar sind. Ist also “true” eingestellt, können die Benutzer die Dateien anderer Nutzer im Sia Storage nicht sehen. Wenn man zwei external Storages konfiguriert kann man aber einen so konfigurieren dass er als “shared” Storage für alle Nutzer funktioniert, der andere aber nur als Userverzeichnis. Es gibt keine Limits wieviele external Storages man anlegt.
Bei Fragen einfach kommentieren, Trinkgeld darf an:
SC: 1d9855ca88a07af2811fe6f277b062a6732cda68911ea34e43e8408bf4be376026a5b8c48218
XMR: 8C6KSu12hpZhBYGL7xC6QRF6u4z4obVzb1ZVgPKG7942dSGy3DG8ExMGNNcCw3wmJKGfmaSG2evhg7uiz545CWSuEazNqQ5
ETH: 0x08c5e7901BD68bD2058d4F09aB0a8e5a479622b6
#nextcloud #sia #siacoin #siastorage #siastream #cloud #cloudspace #dropbox #googledrive #decentralicedstorage
Unglaublich, wie Amazon Festplatten verschickt. Die Menschen welche die Pakete packen sind nicht mehr ganz knusprig, um es mal milde auszudrücken!
Es gibt User, da kann man nur noch mit dem Kopf schütteln. Gerade eben erhielt ich einen Anruf eines Webmasters, der uns damit gedroht hat unseren Ceeh Ihh Dee Err zu sperren (CIDR – IPv4 Notationsweise…)
Abgesehen davon, dass es für einen normalen User unmöglich ist einen kompletten Prefix in den globalen Routingtables einfach so zu löschen scheint dieser renitente User noch davon auszugehen, dass andere Menschen sich nicht im Internet auskennen – muss ja klar sein, woher sonst würden wir auch VPS Hosting anbieten?
Weil einer unserer Kunden wohl einen kompromitierten Server hat und dieser das System des “Webmasters” attackiert hatte, erfolgte ein Ticket an unsere Abuse Adresse welches gestern gegen 2:00 Uhr Nachts einging. Das war aber wohl nicht der einzige User, wir haben zu diesem Vorfall ca. 1200 Mails erhalten. Dem Webmaster, der anscheinend hellsehen kann meinte wir müssen unbedingt fail2ban (die haben selbst ein SPAM Problem: “Since spammers were way too much active on this wiki, user account creation has been disabled. Please, ask on the mailing-lists if you require a new user account. Thank you for your understanding and sorry about that.“)
installieren, dann könne das nicht mehr passieren – gute Nacht!
Wenn das wirklich das Niveau von anderen Webmastern im Netz repräsentieren sollte, werde ich zum Gärtner umschulen! Abgesehen davon, was soll es denn bringen bei den Hostern anzurufen, wenn man schon gemailt hat? Damit alles noch länger dauert, wenn der Admin die ganze Zeit am Telefon rumhängt und sich mit DAUs rumärgern muss?! Grr.. Ist heute etwa MONTAG?!
Anscheinend hat die Telekom mal wieder Ihren Login überarbeitet, sämtliche mir bekannte Zugänge funktionieren plötzlich nicht mehr. Gut das kann passieren, wenn der Anbieter den Login komplett umbaut.
Dämlich ist nur, dass das Formular als Sicherheitsfrage z.B. anbietet, den Namen des Vaters zu hinterlegen… Alle deren Väter einen Namen < 6 Zeichen haben, haben nun ein Problem, wie der folgende Screenshot beweist:
*FAIL* – Leider hat hier mal wieder jemand nicht zuende gedacht :/
www.telecash.de verwendet ein ungültiges Sicherheitszertifikat. Das Zertifikat ist am Sonntag, 22. Mai 2016 01:59 abgelaufen. Die aktuelle Zeit ist Mittwoch, 25. Mai 2016 10:17. Fehlercode: SEC_ERROR_EXPIRED_CERTIFICATE
Man man man…. wie peinlich… gerade die die am größten und lautesten schreien und sich Sicherheit auf die Fahne schreiben, bekommen es halt einfach nicht geregelt.
wer derzeit seine Zahlungsabwicklung mit Paymill durchführt, muss sich wohl nach Alternativen umsehen, da Paymill Insolvenz angemeldet hat.
http://t3n.de/news/paymill-insolvent-pleite-701620/
Eine Möglichkeit wäre z.B. unseren in PHP entwickelten EBICS Client einzusetzen, um SEPA Lastschriften und SEPA Überweisungen an die eigene Hausbank über das EBICS Protkoll zu übertragen.
Weitere Informationen diesbezüglich gibt es unter http://www.smart-ebics.de – Wir helfen natürlich gern bei der Integration der Software in Ihre Geschäftsprozesse.
Eigentlich dachte ich, die Fidor Bank sei eine innovative neue Bank – zumindest will die Bank das sein. Engagement bzgl. neue Zahlungsarten und Crypto-Währungen wie Bitcoin gibt es, die Bank baut eine Community um sich auf, aber wenn es um so etwas banales geht wie eine einfache SEPA Überweisung durchzuführen, dann scheitert man hier bei der Fidor Bank, zumindest wenn man möchte, dass der Verwendungszweck nicht von der Bank modifizert wird.
Ich habe natürlich versucht dies mit der Bank via E-Mail zu klären – meine Ansprechpartnerin, die sich nur als “Vanessa” vorstellt und auch E-Mails nur mit “Vanessa” signiert, will mir erklären, dass die Fidor Bank nicht in der Lage ist diese interne Buchungsnummer _NICHT_ im Verwendungszweck anzuzeigen, dass dies ja alles ganz normal sei und dass man da nichts tun könne.
Fragen zum Thema EBICS werden gleich gänzlich ignoriert – hier bekommt man gar keine Antwort, das wird in den E-Mails einfach immer vergessen bzw. totgeschwiegen.
Ach Schade eigentlich – ich hatte gedacht das wäre mal eine Bank mit Zukunft – fühlt sich aber leider nicht so an!
Nun ja, da macht man mal einen Kurztripp nach Augsburg, weil hier unter anderem Vortträge zum Thema Musiktherapie stattfinden und schaut sich ein wenig die Innenstadt an – findet man nicht prompt ein Lokal in dem es leider KEINEN STROM mehr gibt. Irgendwie hat der Strom-Zähler ein Problem. Es sind Elektriker vor Ort, aber es tut sich leider nichts. Warten wir mal ab, was zuerst Eintritt – Strom, oder Akku Leer 🙂