如果我們希望構造一個去中心化應用(DApp),除了智能合約的開發, 通常還需要使用其他開發語言為用戶提供操作智能合約的用戶介面,例如 開發一個網頁、一個手機App或者一個桌面應用,這些代碼都需要與以太坊 進行互動,本文是以C#做服務端開發,當然你也可以用java或者其他語言,大致的思想都是一樣的,
開發以太網并進行互動的大致思想:
C#做服務端開發,處理業務邏輯,geth做客戶端與服務器端進行互動,在remix上撰寫合約生成檔案,然后獲取remix生成的合約資訊,在c#上通過代碼將合約部署在geth上,之后就可以在代碼里呼叫相應的合約,
首先是一篇github的專案,鏈接上面有步驟,按照步驟去下載軟體環境以及驅動專案測驗(這個很重要,因為我們也是基于這個專案框架去撰寫自己的專案需求的)
專案地址
然后是remix地址,推薦使用這個在瀏覽器上撰寫合約
有兩個網址一個新版一個舊版:
舊版
新版
本篇博客使用新版的remix作為演示需要(穩定,易獲取)
下面的代碼演示也是基于上面的github開源專案的
- 首先是remix上撰寫一個helloworld的合約
有時候因為版本的問題,需要修改一下
pragma solidity ^0.4.0;//pragma 預編譯 ^向上兼容
contract HelloWorld{
string Myname = "HelloWorld";
function getName() public view returns(string)//view :用來告訴編譯器,所裝飾的函式不會修改合約狀態
{
return Myname;
}
function changeName(string _newName) public returns(string)
{
Myname = _newName;
return Myname;
}
}
- 然后需要將remix的合約編譯&部署
需要匯出它的ABI和ByteCode
實在不會操作或者想省事點的同志可以用我壓縮過后的ABI檔案,直接在vs專案里新建一個ABIHelloWorld.txt
[{"constant":false,"inputs":[{"name":"_newName","type":"string"}],"name":"changeName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]
ByteCode:這里需要將ByteCode檔案的json字串里的object的值復制出來,并在開頭加一個0x,然后復制進BinHelloWorld.txt里就可以了,
0x60806040526040805190810160405280600a81526020017f48656c6c6f576f726c64000000000000000000000000000000000000000000008152506000908051906020019061004f929190610062565b5034801561005c57600080fd5b50610107565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100a357805160ff19168380011785556100d1565b828001600101855582156100d1579182015b828111156100d05782518255916020019190600101906100b5565b5b5090506100de91906100e2565b5090565b61010491905b808211156101005760008160009055506001016100e8565b5090565b90565b6103f1806101166000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806317d7de7c146100515780635353a2d8146100e1575b600080fd5b34801561005d57600080fd5b506100666101c3565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100a657808201518184015260208101905061008b565b50505050905090810190601f1680156100d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100ed57600080fd5b50610148600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050610265565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561018857808201518184015260208101905061016d565b50505050905090810190601f1680156101b55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b606060008054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561025b5780601f106102305761010080835404028352916020019161025b565b820191906000526020600020905b81548152906001019060200180831161023e57829003601f168201915b5050505050905090565b6060816000908051906020019061027d929190610320565b5060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103145780601f106102e957610100808354040283529160200191610314565b820191906000526020600020905b8154815290600101906020018083116102f757829003601f168201915b50505050509050919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061036157805160ff191683800117855561038f565b8280016001018555821561038f579182015b8281111561038e578251825591602001919060010190610373565b5b50905061039c91906103a0565b5090565b6103c291905b808211156103be5760008160009055506001016103a6565b5090565b905600a165627a7a7230582063d64af44499532ae37de8529219d2226b9315188d19581c0a843a12cdca40be0029
- 主函式:
這邊也是專案的入口
這邊我是自己重新撰寫的一個DriAucContract類 - 然后就是測驗合約的主要方法(都在DriAucContract類里)
Test2()
public async Task Test2()
{
await TestContractConnect();
}
TestContractConnect()函式
private async Task TestContractConnect()
{
Accounts = (await web3.Personal.ListAccounts.SendRequestAsync());//獲取所以賬號的string型別的地址
//....
var abi = File.ReadAllText("Contract\\abiHelloWorld.txt");
var bin = File.ReadAllText("Contract\\binHelloWorld.txt");
await web3.Personal.UnlockAccount.SendRequestAsync(Accounts[0], "123", 120);
TransactionReceipt receipt = await web3.Eth.DeployContract.SendRequestAndWaitForReceiptAsync(abi, bin, Accounts[0], new HexBigInteger(300000000), null);
testConnectContract = web3.Eth.GetContract(abi, receipt.ContractAddress);
changeName = testConnectContract.GetFunction(nameof(changeName));
getName = testConnectContract.GetFunction(nameof(getName));
String getResult1 = await getName.CallAsync<string>();
String getResult2 = await changeName.CallAsync<string>("welcome");
Console.WriteLine(string.Format("getResult1 = {0}\n getResult2 = {1}", getResult1, getResult2));
}
補充一下changeName ,getName ;是在DriAucContract類里定義的一個函式變數
Function getName,changeName;
Contract testConnectContract;
最后就是運行了,可能會有一些錯誤的處理,以后再貼一張除錯成功的
圖片
后面會上傳測驗合約的原始碼,
Remix
Geth
Vistual Studio2017
參考文章:
C#基于.net開發以太坊智能合約
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/158498.html
標籤:其他
