Blockchain Javascript Solidity

Web3 Kargo Gönderisi Kaydetme

Solidity ve web3 ile ilgili olarak çevremin dikkatini çekmek ve bunun üzerine konuşabileceğimiz bir muhabbet ortamı yaratabilmek için bir süredir solidity, blockchain, web3 ile ilgili kaynak paylaşıyorum. Bu paylaşımdan sonra uzun bir süre ara vereceğim.

Örnek çalışmada amacımız blockchaine veritabanı gibi davranmak ve gönderi kaydımızı saklamak. Daha sonra id’si ile sorgulamak. Bunun bir gönderi kodundan sorgulama versiyonu yapılabilir. Onu yazıyı kısa tutabilmek için meraklısına bırakacağım. Kodda değişkenlerin hepsi ya ingilizce ya da türkçe olur diye takıntısı olanlar okumaya devam etmeyebilirler.

Backend’de işlerimizi yapacak olan akıllı kontratı hazırlayıp ağa deploy edeceğiz. Kodlar aşağıdadır.

contract gonderitakip {
    struct gonderi {
        uint256 id;
        string timespan;
        string consignor;
        string consignee;
        string code;
        string ReceiverAddress;
        string lastTransportPoint;
        string email;
        uint256 contact_phone;
    }

    mapping(uint256 => gonderi) gonderiler;
    uint256[] internal gonderiIds;

    function set(uint256 id, string memory timespan, string memory consignor, 
                    string memory consignee, string memory code, 
                    string memory ReceiverAddress, string memory lastTransportPoint, 
                    string memory email,  uint256 contact_phone) public {
        gonderi storage newG = gonderiler[id];
        newG.timespan = timespan;
        newG.consignor = consignor;
        newG.consignee = consignee;
        newG.code = code;
        newG.ReceiverAddress = ReceiverAddress;
        newG.lastTransportPoint = lastTransportPoint;
        newG.email = email;
        newG.contact_phone = contact_phone;
        gonderiIds.push(id);
    }
        
    function get(uint256 id) public view returns (uint256, string memory, string memory, string memory, string memory,
                                                    string memory, string memory, string memory, uint256){
        gonderi storage s = gonderiler[id];
        return (s.id, s.timespan, s.consignor, s.consignee, s.code, s.ReceiverAddress, s.lastTransportPoint, s.email, s.contact_phone);
    }
}

HTML sayfası ile js dosyasını mümkün oldukça okunur olması için ayıracağım. HTML aşağıdadır.

<!DOCTYPE html>
<html>

<head>
    <meta charset='utf-8'>
    <meta http-equiv='X-UA-Compatible' content='IE=edge'>
    <title>Web3 Gönderi Sorgulama</title>
    <meta name='viewport' content='width=device-width, initial-scale=1'>
    <script src="https://cdn.jsdelivr.net/gh/ethereum/web3.js@1.0.0-beta.34/dist/web3.min.js"></script>
    <script src="myfirstContract.js"></script>
</head>

<body>
    <div>
        <button onclick="connect()">Connect</button>
    </div>
    <div>
        <button onclick="getFunc()">Get</button>
    </div>
    <div>
        <button onclick="setFunc()">Set</button>
    </div>
</body>

</html>

JS dosyası aşağıdadır.

const web3 = new Web3(window.ethereum);
const contract_adr='0xbBc7Aad82e91029A4260906d733BE5D2077923a6';
const abi = '[{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"get","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getjs","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"timespan","type":"string"},{"internalType":"string","name":"consignor","type":"string"},{"internalType":"string","name":"consignee","type":"string"},{"internalType":"string","name":"code","type":"string"},{"internalType":"string","name":"ReceiverAddress","type":"string"},{"internalType":"string","name":"lastTransportPoint","type":"string"},{"internalType":"string","name":"email","type":"string"},{"internalType":"uint256","name":"contact_phone","type":"uint256"}],"internalType":"structgonderitakip.gonderi","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"timespan","type":"string"},{"internalType":"string","name":"consignor","type":"string"},{"internalType":"string","name":"consignee","type":"string"},{"internalType":"string","name":"code","type":"string"},{"internalType":"string","name":"ReceiverAddress","type":"string"},{"internalType":"string","name":"lastTransportPoint","type":"string"},{"internalType":"string","name":"email","type":"string"},{"internalType":"uint256","name":"contact_phone","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"}]';
const contract = new web3.eth.Contract(JSON.parse(abi), contract_adr);
async function connect() {
	await window.ethereum.enable();
	web3.eth.accounts = await web3.eth.getAccounts();
	web3.eth.defaultAccount = web3.eth.accounts[0];
}

async function getFunc(){
    let request = await contract.methods.get(10).call();
    console.log(request);
}

async function setFunc(){
	contract.methods.set(
		10,
		'2022-01-27',
		'metin yakar',
		'A Müşterisi',
		'GDR2022001RD',
		'Turkey, Ankara, Çankaya',
		'Bolu 2 Nolu Transfer Merkezi',
		'test@metinyakar.net',
		5551234567
	).send({from:web3.eth.defaultAccount});
}

Browser’da cüzdan kurulu olmasına dikkat edelim. Kaydı koyan ücreti öder. Ama kullanıcı bazında ayrım olmadığından farklı cüzdanlarla bağlandığında kaydedilen bilgilere erişilebilir. Burada unique olan kontrat olacaktır. Kontrat yeniden deploy edilirse id’si değişir ve bu yeni id ile çağrım yapıldığında eski verilere erişilemez.