From 9e7ee2c892d07ae64f17134843faca9060489926 Mon Sep 17 00:00:00 2001 From: Said Syakin Date: Mon, 29 Jan 2018 01:47:03 +0400 Subject: [PATCH 1/7] First conf.file commit --- cmd/geth/config.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cmd/geth/config.go b/cmd/geth/config.go index 27490c4048..f5d33354b1 100644 --- a/cmd/geth/config.go +++ b/cmd/geth/config.go @@ -123,6 +123,13 @@ func makeConfigNode(ctx *cli.Context) (*node.Node, gethConfig) { if err := loadConfig(file, &cfg); err != nil { utils.Fatalf("%v", err) } + } else { + // Load config file from default place. + if err := loadConfig("./geth_conf.toml", &cfg); err != nil { + if ctx.Command.Name != "dumpconfig" { + utils.Fatalf("Config not found: %v. Put config file here or set config path with flag --config /path/to/your_config.toml", err) + } + } } // Apply flags. From f353505c69dffe2dffd7086cb950d824adbdb83e Mon Sep 17 00:00:00 2001 From: Said Syakin Date: Thu, 1 Feb 2018 01:58:11 +0400 Subject: [PATCH 2/7] Rename geth binary to fgeth --- build/ci.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/ci.go b/build/ci.go index 0c825ef31e..4f5c16b838 100644 --- a/build/ci.go +++ b/build/ci.go @@ -197,6 +197,8 @@ func doInstall(cmdline []string) { goinstall.Args = append(goinstall.Args, "-v") goinstall.Args = append(goinstall.Args, packages...) build.MustRun(goinstall) + os.Rename(filepath.Join(GOBIN, "geth"), filepath.Join(GOBIN, "fgeth")) + os.Rename(filepath.Join(GOBIN, "geth.exe"), filepath.Join(GOBIN, "fgeth.exe")) return } // If we are cross compiling to ARMv5 ARMv6 or ARMv7, clean any prvious builds From accd5b4735fddc64515c09aec149df469bb5d492 Mon Sep 17 00:00:00 2001 From: Said Syakin Date: Thu, 1 Feb 2018 02:00:52 +0400 Subject: [PATCH 3/7] Changed eth to food in command line interface. Added new commands to console for sending transaction with additional data in Json format: sendTransactionWithData and getTransactionFormatted --- console/console.go | 8 +++++-- internal/web3ext/web3ext.go | 42 +++++++++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/console/console.go b/console/console.go index 3cd2ad34b7..cd588f59d9 100644 --- a/console/console.go +++ b/console/console.go @@ -131,7 +131,7 @@ func (c *Console) init(preload []string) error { if err != nil { return fmt.Errorf("api modules: %v", err) } - flatten := "var eth = web3.eth; var personal = web3.personal; " + flatten := "var food = web3.eth; var personal = web3.personal; " for api := range apis { if api == "web3" { continue // manually mapped or ignore @@ -141,7 +141,11 @@ func (c *Console) init(preload []string) error { if err = c.jsre.Compile(fmt.Sprintf("%s.js", api), file); err != nil { return fmt.Errorf("%s.js: %v", api, err) } - flatten += fmt.Sprintf("var %s = web3.%s; ", api, api) + if api == "eth" { + flatten += fmt.Sprintf("var food = web3.%s; ", api) + } else { + flatten += fmt.Sprintf("var %s = web3.%s; ", api, api) + } } else if obj, err := c.jsre.Run("web3." + api); err == nil && obj.IsObject() { // Enable web3.js built-in extension if available. flatten += fmt.Sprintf("var %s = web3.%s; ", api, api) diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index ef0d2b4e6e..384e7164e4 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -22,7 +22,7 @@ var Modules = map[string]string{ "chequebook": Chequebook_JS, "clique": Clique_JS, "debug": Debug_JS, - "eth": Eth_JS, + "eth": Eth_JS, "miner": Miner_JS, "net": Net_JS, "personal": Personal_JS, @@ -412,7 +412,45 @@ web3._extend({ params: 2, inputFormatter: [web3._extend.formatters.inputBlockNumberFormatter, web3._extend.utils.toHex] }), - ], + new web3._extend.Method({ + name: 'sendTransactionWithData', + call: function(args) { + if (args[1]) { + if (!web3._extend.utils.isObject(args[1])) { + args[1] = "{\"description\":\"" + args[1] + "\"}" + } else { + args[1] = JSON.stringify(args[1]) + } + args[0].data = web3.toHex(args[1]) + } + return 'eth_sendTransaction' + }, + params: 1, + inputFormatter: [web3._extend.formatters.inputTransactionFormatter] + }), + new web3._extend.Method({ + name: 'getTransactionFormatted', + call: 'eth_getTransactionByHash', + params: 1, + outputFormatter: function (tx) { + if(tx.blockNumber !== null) + tx.blockNumber = web3.toDecimal(tx.blockNumber); + if(tx.transactionIndex !== null) + tx.transactionIndex = web3.toDecimal(tx.transactionIndex); + tx.nonce = web3.toDecimal(tx.nonce); + tx.gas = web3.toDecimal(tx.gas); + tx.gasPrice = web3.toBigNumber(tx.gasPrice); + tx.value = web3.toBigNumber(tx.value); + inputStr = web3.toUtf8(tx.input); + if (web3._extend.utils.isJson(inputStr)) { + tx.input = JSON.parse(inputStr); + } else { + tx.input = inputStr; + } + return tx; + } + }), + ], properties: [ new web3._extend.Property({ name: 'pendingTransactions', From 418c368f03da2b842a27187c28691a7a29455fe6 Mon Sep 17 00:00:00 2001 From: Said Syakin Date: Thu, 1 Feb 2018 22:34:57 +0400 Subject: [PATCH 4/7] Fix utf8 encoding for cli command sendTransactionWithData --- internal/web3ext/web3ext.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index 384e7164e4..1e3046083f 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -421,7 +421,7 @@ web3._extend({ } else { args[1] = JSON.stringify(args[1]) } - args[0].data = web3.toHex(args[1]) + args[0].data = web3.fromUtf8(args[1]) } return 'eth_sendTransaction' }, @@ -442,6 +442,7 @@ web3._extend({ tx.gasPrice = web3.toBigNumber(tx.gasPrice); tx.value = web3.toBigNumber(tx.value); inputStr = web3.toUtf8(tx.input); + tx.input = inputStr; if (web3._extend.utils.isJson(inputStr)) { tx.input = JSON.parse(inputStr); } else { From 5d542aa35c9220c706d95d3f0e78974608043732 Mon Sep 17 00:00:00 2001 From: Said Syakin Date: Tue, 20 Mar 2018 01:35:48 +0400 Subject: [PATCH 5/7] Added first set/get variable methods to work with registry --- internal/ethapi/api.go | 94 +++++++++++++++++++++++++++++++++++++ internal/web3ext/web3ext.go | 22 ++++++++- 2 files changed, 115 insertions(+), 1 deletion(-) diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 636d0bfe26..9ee50c31cd 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -25,6 +25,7 @@ import ( "strings" "time" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/common" @@ -42,10 +43,13 @@ import ( "github.com/ethereum/go-ethereum/rpc" "github.com/syndtr/goleveldb/leveldb" "github.com/syndtr/goleveldb/leveldb/util" + ) const ( defaultGasPrice = 50 * params.Shannon + abiFoodRegistryJSON = `[{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"registry","outputs":[{"name":"index","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"registryIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"},{"name":"from","type":"address"},{"name":"index","type":"uint256"}],"name":"getVariableNameAtIndex","outputs":[{"name":"varName","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"},{"name":"from","type":"address"},{"name":"name","type":"string"}],"name":"getVar","outputs":[{"name":"exist","type":"bool"},{"name":"varName","type":"string"},{"name":"varValue","type":"string"},{"name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"}],"name":"getHolderRegistryIndex","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getRegistryIndex","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getHoldersCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"}],"name":"getHolderRegistryCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"},{"name":"from","type":"address"}],"name":"getVariablesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"}],"name":"isHolder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"},{"name":"index","type":"uint256"}],"name":"getHolderRegistryAddressAtIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"getHolderAddressAtIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"holderAddress","type":"address"},{"name":"name","type":"string"},{"name":"value","type":"string"}],"name":"setVar","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"holderAddress","type":"address"},{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"value","type":"string"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"LogSetVariable","type":"event"}]` + registryAddress = `0xe5acd4bca588bf3d8fe9b6189ecf434da21f6f76` ) // PublicEthereumAPI provides an API to access Ethereum related information. @@ -680,6 +684,91 @@ func (s *PublicBlockChainAPI) Call(ctx context.Context, args CallArgs, blockNr r return (hexutil.Bytes)(result), err } +type FoodRegistryVar struct { + Exist bool + VarName string + VarValue string + Timestamp *big.Int +} + +// FoodRegistryGetArgs represents the arguments for a GetVarFoodRegistry. +type FoodRegistryGetArgs struct { + CallArgs + VarName string `json:"varName"` + AccountAddress common.Address `json:"accountAddress"` + CreatorAddress common.Address `json:"creatorAddress"` +} + +// FoodRegistrySetArgs represents the arguments for a SetVarFoodRegistry. +type FoodRegistrySetArgs struct { + SendTxArgs + VarName string `json:"varName"` + VarValue string `json:"varValue"` + AccountAddress common.Address `json:"accountAddress"` +} + +func (s *PublicBlockChainAPI) GetVarFoodRegistry(ctx context.Context, args FoodRegistryGetArgs, blockNr rpc.BlockNumber) (FoodRegistryVar, error) { + + var ev FoodRegistryVar + + if args.To == nil { + address := common.HexToAddress(registryAddress) + args.To = &address + } + + + abi, err := abi.JSON(strings.NewReader(abiFoodRegistryJSON)) + if err != nil { + return ev, err + } + + packed, err := abi.Pack("getVar", args.AccountAddress, args.CreatorAddress, args.VarName) + if err != nil { + return ev, err + } + + if args.Data == nil { + args.Data = packed + } + + result, _, _, err := s.doCall(ctx, args.CallArgs, blockNr, vm.Config{DisableGasMetering: true}) + + err = abi.Unpack(&ev, "getVar", result) + + return ev, err +} + +func (s *PublicTransactionPoolAPI) SetVarFoodRegistry(ctx context.Context, args FoodRegistrySetArgs) (common.Hash, error) { + + if args.To == nil { + address := common.HexToAddress(registryAddress) + args.To = &address + } + + abi, err := abi.JSON(strings.NewReader(abiFoodRegistryJSON)) + if err != nil { + return common.Hash{}, err + } + + var packed hexutil.Bytes + + packed, err = abi.Pack("setVar", args.AccountAddress, args.VarName, args.VarValue) + if err != nil { + return common.Hash{}, err + } + + if args.Data == nil { + args.Data = &packed + log.Info("SetVarFoodRegistry2 args.Data is nil") + } + + result, err := s.SendTransaction(ctx, args.SendTxArgs) + + return result, err +} + + + // EstimateGas returns an estimate of the amount of gas needed to execute the // given transaction against the current pending block. func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs) (hexutil.Uint64, error) { @@ -1016,6 +1105,11 @@ func (s *PublicTransactionPoolAPI) GetTransactionByHash(ctx context.Context, has return nil } +// Stub function. Do nothing. Need to extend web3ext in some cases. +func (s *PublicTransactionPoolAPI) GetStub(ctx context.Context, result string) string { + return result +} + // GetRawTransactionByHash returns the bytes of the transaction for the given hash. func (s *PublicTransactionPoolAPI) GetRawTransactionByHash(ctx context.Context, hash common.Hash) (hexutil.Bytes, error) { var tx *types.Transaction diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index 0dcc2ea2b3..6d41a4b5fc 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -376,6 +376,8 @@ web3._extend({ ` const Eth_JS = ` +var address = "0xe5acd4bca588bf3d8fe9b6189ecf434da21f6f76"; +var abi = [{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"registry","outputs":[{"name":"index","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"registryIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"},{"name":"from","type":"address"},{"name":"index","type":"uint256"}],"name":"getVariableNameAtIndex","outputs":[{"name":"varName","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"},{"name":"from","type":"address"},{"name":"name","type":"string"}],"name":"getVar","outputs":[{"name":"exist","type":"bool"},{"name":"varName","type":"string"},{"name":"varValue","type":"string"},{"name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"}],"name":"getHolderRegistryIndex","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getRegistryIndex","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getHoldersCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"}],"name":"getHolderRegistryCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"},{"name":"from","type":"address"}],"name":"getVariablesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"}],"name":"isHolder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"},{"name":"index","type":"uint256"}],"name":"getHolderRegistryAddressAtIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"getHolderAddressAtIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"holderAddress","type":"address"},{"name":"name","type":"string"},{"name":"value","type":"string"}],"name":"setVar","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"holderAddress","type":"address"},{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"value","type":"string"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"LogSetVariable","type":"event"}]; web3._extend({ property: 'eth', methods: [ @@ -416,6 +418,7 @@ web3._extend({ params: 2, inputFormatter: [web3._extend.formatters.inputBlockNumberFormatter, web3._extend.utils.toHex] }), + // FoodCoin method to send transaction with formatted data payload new web3._extend.Method({ name: 'sendTransactionWithData', call: function(args) { @@ -432,6 +435,7 @@ web3._extend({ params: 1, inputFormatter: [web3._extend.formatters.inputTransactionFormatter] }), + // FoodCoin method to get formatted transaction info new web3._extend.Method({ name: 'getTransactionFormatted', call: 'eth_getTransactionByHash', @@ -454,6 +458,22 @@ web3._extend({ } return tx; } + }), + // FoodCoin Registry method: get variable from registry + // Example: food.getRegistryVar({accountAddress:'0xd79e977264887083aadb3e22e5f7b84c9a7531b7', creatorAddress:'0xd79e977264887083aadb3e22e5f7b84c9a7531b7', varName:'name'}); + new web3._extend.Method({ + name: 'getRegistryVar', + call: 'eth_getVarFoodRegistry', + params: 2, + inputFormatter: [null, web3._extend.formatters.inputDefaultBlockNumberFormatter] + }), + // FoodCoin Registry method: set variable to registry + // Example: food.setRegistryVar({from:'0xd79e977264887083aadb3e22e5f7b84c9a7531b7', accountAddress:'0xd79e977264887083aadb3e22e5f7b84c9a7531b7', varName:'name', varValue:'John'}); + new web3._extend.Method({ + name: 'setRegistryVar', + call: 'eth_setVarFoodRegistry', + params: 1, + inputFormatter: [null] }), ], properties: [ @@ -468,7 +488,7 @@ web3._extend({ } return formatted; } - }), + }) ] }); ` From aaa32f5300a8c7ecf77d9e4f42b76f31bc2bef2a Mon Sep 17 00:00:00 2001 From: Said Syakin Date: Thu, 22 Mar 2018 18:39:37 +0400 Subject: [PATCH 6/7] Updated FoodCoin Registry smart-contract(Ropsten test network). Added api methods for Verificators in smart-contract --- internal/ethapi/api.go | 220 +++++++++++++++++++++++++++++++++--- internal/web3ext/web3ext.go | 60 +++++++--- 2 files changed, 252 insertions(+), 28 deletions(-) diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 9ee50c31cd..fbc7331adf 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -44,12 +44,13 @@ import ( "github.com/syndtr/goleveldb/leveldb" "github.com/syndtr/goleveldb/leveldb/util" + "encoding/json" ) const ( defaultGasPrice = 50 * params.Shannon - abiFoodRegistryJSON = `[{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"registry","outputs":[{"name":"index","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"registryIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"},{"name":"from","type":"address"},{"name":"index","type":"uint256"}],"name":"getVariableNameAtIndex","outputs":[{"name":"varName","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"},{"name":"from","type":"address"},{"name":"name","type":"string"}],"name":"getVar","outputs":[{"name":"exist","type":"bool"},{"name":"varName","type":"string"},{"name":"varValue","type":"string"},{"name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"}],"name":"getHolderRegistryIndex","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getRegistryIndex","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getHoldersCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"}],"name":"getHolderRegistryCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"},{"name":"from","type":"address"}],"name":"getVariablesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"}],"name":"isHolder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"},{"name":"index","type":"uint256"}],"name":"getHolderRegistryAddressAtIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"getHolderAddressAtIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"holderAddress","type":"address"},{"name":"name","type":"string"},{"name":"value","type":"string"}],"name":"setVar","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"holderAddress","type":"address"},{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"value","type":"string"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"LogSetVariable","type":"event"}]` - registryAddress = `0xe5acd4bca588bf3d8fe9b6189ecf434da21f6f76` + abiFRJSON = `[{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"registry","outputs":[{"name":"index","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"personAddress","type":"address"}],"name":"getPersonRegistryCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"registryIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"personAddress","type":"address"}],"name":"isPerson","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"personAddress","type":"address"},{"name":"from","type":"address"},{"name":"index","type":"uint256"}],"name":"getVariableNameAtIndex","outputs":[{"name":"varName","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"verificators","outputs":[{"name":"verificatorAddress","type":"address"},{"name":"timestamp","type":"uint256"},{"name":"licenceIssuedTimeStamp","type":"uint256"},{"name":"licenceValidUntilTimeStamp","type":"uint256"},{"name":"index","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"personAddress","type":"address"},{"name":"from","type":"address"},{"name":"name","type":"string"}],"name":"getVar","outputs":[{"name":"exist","type":"bool"},{"name":"varName","type":"string"},{"name":"varValue","type":"string"},{"name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"personAddress","type":"address"},{"name":"from","type":"address"},{"name":"index","type":"uint256"}],"name":"getVarByIndex","outputs":[{"name":"exist","type":"bool"},{"name":"varName","type":"string"},{"name":"varValue","type":"string"},{"name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getRegistryIndex","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"verificatorAddress","type":"address"},{"name":"licenceValidUntilTimeStamp","type":"uint256"}],"name":"updateVerificatorLicenseExpiration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"personAddress","type":"address"},{"name":"index","type":"uint256"}],"name":"getPersonRegistryAddressAtIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"verificatorAddress","type":"address"},{"name":"licenceIssuedTimeStamp","type":"uint256"},{"name":"licenceValidUntilTimeStamp","type":"uint256"}],"name":"addVerificator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPersonsCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"verificatorsIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"personAddress","type":"address"}],"name":"getPersonRegistryIndex","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"getVerificatorAtIndex","outputs":[{"name":"verificatorAddress","type":"address"},{"name":"timestamp","type":"uint256"},{"name":"licenceIssuedTimeStamp","type":"uint256"},{"name":"licenceValidUntilTimeStamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"personAddress","type":"address"},{"name":"from","type":"address"}],"name":"getVariablesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getVerificatorsIndex","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getVerificatorsCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"getPersonAddressAtIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"personAddress","type":"address"},{"name":"name","type":"string"},{"name":"value","type":"string"}],"name":"setVar","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"personAddress","type":"address"},{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"value","type":"string"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"LogSetVariable","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"verificatorAddress","type":"address"},{"indexed":false,"name":"licenceIssuedTimeStamp","type":"uint256"},{"indexed":false,"name":"licenceValidUntilTimeStamp","type":"uint256"}],"name":"LogAddVerificator","type":"event"}]` + registryAddress = `0xb9c84fe5d9ee933202012efa6380bd83930d44cc` ) // PublicEthereumAPI provides an API to access Ethereum related information. @@ -684,32 +685,76 @@ func (s *PublicBlockChainAPI) Call(ctx context.Context, args CallArgs, blockNr r return (hexutil.Bytes)(result), err } -type FoodRegistryVar struct { +type FRVar struct { Exist bool VarName string VarValue string Timestamp *big.Int } -// FoodRegistryGetArgs represents the arguments for a GetVarFoodRegistry. -type FoodRegistryGetArgs struct { +type FRVerificator struct { + VerificatorAddress common.Address + Timestamp *big.Int + LicenceIssuedTimeStamp *big.Int + LicenceValidUntilTimeStamp *big.Int +} + +// FRGetArgs represents the arguments for a GetVarFR. +type FRGetArgs struct { CallArgs VarName string `json:"varName"` AccountAddress common.Address `json:"accountAddress"` CreatorAddress common.Address `json:"creatorAddress"` } -// FoodRegistrySetArgs represents the arguments for a SetVarFoodRegistry. -type FoodRegistrySetArgs struct { +// FRSetArgs represents the arguments for a SetVarFR. +type FRSetArgs struct { SendTxArgs VarName string `json:"varName"` VarValue string `json:"varValue"` AccountAddress common.Address `json:"accountAddress"` } -func (s *PublicBlockChainAPI) GetVarFoodRegistry(ctx context.Context, args FoodRegistryGetArgs, blockNr rpc.BlockNumber) (FoodRegistryVar, error) { +// FRAddVerificatorArgs represents the arguments for a AddVerificator. +type FRAddVerificatorArgs struct { + SendTxArgs + VerificatorAddress common.Address `json:"verificatorAddress"` + IssuedTimeStamp *big.Int `json:"IssuedTimeStamp"` + ValidUntilTimeStamp *big.Int `json:"ValidUntilTimeStamp"` + Index *big.Int `json:"Index"` +} - var ev FoodRegistryVar +// FRVerificatorByIndexArgs represents the arguments for a GetVerificatorByIndex. +type FRVerificatorByIndexArgs struct { + CallArgs + Index *big.Int `json:"Index"` +} + +func isJSON(s string) bool { + var js map[string]interface{} + return json.Unmarshal([]byte(s), &js) == nil + +} + +func (s *PublicTransactionPoolAPI) SendTransactionWithData(ctx context.Context, args SendTxArgs, data interface{}) (common.Hash, error) { + + var packed hexutil.Bytes + packed, err := json.Marshal(data) + + if err != nil { + return common.Hash{}, err + } + + if !isJSON(string(packed)) { + packed = []byte("{\"description\":" + string(packed) + "}") + } + args.Data = &packed + return s.SendTransaction(ctx, args) +} + +func (s *PublicBlockChainAPI) GetVarFR(ctx context.Context, args FRGetArgs, blockNr rpc.BlockNumber) (FRVar, error) { + + var ev FRVar if args.To == nil { address := common.HexToAddress(registryAddress) @@ -717,7 +762,7 @@ func (s *PublicBlockChainAPI) GetVarFoodRegistry(ctx context.Context, args FoodR } - abi, err := abi.JSON(strings.NewReader(abiFoodRegistryJSON)) + abi, err := abi.JSON(strings.NewReader(abiFRJSON)) if err != nil { return ev, err } @@ -738,14 +783,14 @@ func (s *PublicBlockChainAPI) GetVarFoodRegistry(ctx context.Context, args FoodR return ev, err } -func (s *PublicTransactionPoolAPI) SetVarFoodRegistry(ctx context.Context, args FoodRegistrySetArgs) (common.Hash, error) { +func (s *PublicTransactionPoolAPI) SetVarFR(ctx context.Context, args FRSetArgs) (common.Hash, error) { if args.To == nil { address := common.HexToAddress(registryAddress) args.To = &address } - abi, err := abi.JSON(strings.NewReader(abiFoodRegistryJSON)) + abi, err := abi.JSON(strings.NewReader(abiFRJSON)) if err != nil { return common.Hash{}, err } @@ -759,7 +804,156 @@ func (s *PublicTransactionPoolAPI) SetVarFoodRegistry(ctx context.Context, args if args.Data == nil { args.Data = &packed - log.Info("SetVarFoodRegistry2 args.Data is nil") + } + + result, err := s.SendTransaction(ctx, args.SendTxArgs) + + return result, err +} + +func (s *PublicTransactionPoolAPI) AddVerificator(ctx context.Context, args FRAddVerificatorArgs) (common.Hash, error) { + + if args.To == nil { + address := common.HexToAddress(registryAddress) + args.To = &address + } + + abi, err := abi.JSON(strings.NewReader(abiFRJSON)) + if err != nil { + return common.Hash{}, err + } + + var packed hexutil.Bytes + + packed, err = abi.Pack("addVerificator", args.VerificatorAddress, args.IssuedTimeStamp, args.ValidUntilTimeStamp) + if err != nil { + return common.Hash{}, err + } + + if args.Data == nil { + args.Data = &packed + } + + result, err := s.SendTransaction(ctx, args.SendTxArgs) + + return result, err +} + +func (s *PublicBlockChainAPI) GetVerificatorsCount(ctx context.Context, args CallArgs, blockNr rpc.BlockNumber) (*big.Int, error) { + + ev := big.NewInt(0) + + if args.To == nil { + address := common.HexToAddress(registryAddress) + args.To = &address + } + + + abi, err := abi.JSON(strings.NewReader(abiFRJSON)) + if err != nil { + return ev, err + } + + packed, err := abi.Pack("getVerificatorsCount") + if err != nil { + return ev, err + } + + if args.Data == nil { + args.Data = packed + } + + result, _, _, err := s.doCall(ctx, args, blockNr, vm.Config{DisableGasMetering: true}) + + err = abi.Unpack(&ev, "getVerificatorsCount", result) + + return ev, err +} + +func (s *PublicBlockChainAPI) GetVerificatorsIndex(ctx context.Context, args CallArgs, blockNr rpc.BlockNumber) ([]common.Address, error) { + + var ev []common.Address + + if args.To == nil { + address := common.HexToAddress(registryAddress) + args.To = &address + } + + + abi, err := abi.JSON(strings.NewReader(abiFRJSON)) + if err != nil { + return ev, err + } + + packed, err := abi.Pack("getVerificatorsIndex") + if err != nil { + return ev, err + } + + if args.Data == nil { + args.Data = packed + } + + result, _, _, err := s.doCall(ctx, args, blockNr, vm.Config{DisableGasMetering: true}) + + err = abi.Unpack(&ev, "getVerificatorsIndex", result) + + return ev, err +} + +func (s *PublicBlockChainAPI) GetVerificatorAtIndex(ctx context.Context, args FRVerificatorByIndexArgs, + blockNr rpc.BlockNumber) (FRVerificator, error) { + + var ev FRVerificator + + if args.To == nil { + address := common.HexToAddress(registryAddress) + args.To = &address + } + + + abi, err := abi.JSON(strings.NewReader(abiFRJSON)) + if err != nil { + return ev, err + } + + packed, err := abi.Pack("getVerificatorAtIndex", args.Index) + if err != nil { + return ev, err + } + + if args.Data == nil { + args.Data = packed + } + + result, _, _, err := s.doCall(ctx, args.CallArgs, blockNr, vm.Config{DisableGasMetering: true}) + + err = abi.Unpack(&ev, "getVerificatorAtIndex", result) + + return ev, err +} + +func (s *PublicTransactionPoolAPI) UpdateVerificatorLicenseExpiration(ctx context.Context, args FRAddVerificatorArgs) (common.Hash, error) { + + if args.To == nil { + address := common.HexToAddress(registryAddress) + args.To = &address + } + + abi, err := abi.JSON(strings.NewReader(abiFRJSON)) + if err != nil { + return common.Hash{}, err + } + + var packed hexutil.Bytes + + packed, err = abi.Pack("updateVerificatorLicenseExpiration", args.VerificatorAddress, args.ValidUntilTimeStamp) + if err != nil { + return common.Hash{}, err + } + + if args.Data == nil { + args.Data = &packed } result, err := s.SendTransaction(ctx, args.SendTxArgs) diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index 6d41a4b5fc..8ae12086c4 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -421,19 +421,9 @@ web3._extend({ // FoodCoin method to send transaction with formatted data payload new web3._extend.Method({ name: 'sendTransactionWithData', - call: function(args) { - if (args[1]) { - if (!web3._extend.utils.isObject(args[1])) { - args[1] = "{\"description\":\"" + args[1] + "\"}" - } else { - args[1] = JSON.stringify(args[1]) - } - args[0].data = web3.fromUtf8(args[1]) - } - return 'eth_sendTransaction' - }, - params: 1, - inputFormatter: [web3._extend.formatters.inputTransactionFormatter] + call: 'eth_sendTransactionWithData', + params: 2, + inputFormatter: [web3._extend.formatters.inputTransactionFormatter, null] }), // FoodCoin method to get formatted transaction info new web3._extend.Method({ @@ -463,7 +453,7 @@ web3._extend({ // Example: food.getRegistryVar({accountAddress:'0xd79e977264887083aadb3e22e5f7b84c9a7531b7', creatorAddress:'0xd79e977264887083aadb3e22e5f7b84c9a7531b7', varName:'name'}); new web3._extend.Method({ name: 'getRegistryVar', - call: 'eth_getVarFoodRegistry', + call: 'eth_getVarFR', params: 2, inputFormatter: [null, web3._extend.formatters.inputDefaultBlockNumberFormatter] }), @@ -471,9 +461,49 @@ web3._extend({ // Example: food.setRegistryVar({from:'0xd79e977264887083aadb3e22e5f7b84c9a7531b7', accountAddress:'0xd79e977264887083aadb3e22e5f7b84c9a7531b7', varName:'name', varValue:'John'}); new web3._extend.Method({ name: 'setRegistryVar', - call: 'eth_setVarFoodRegistry', + call: 'eth_setVarFR', params: 1, inputFormatter: [null] + }), + // Adds verificator to the list of verificators. + // parameters: + // VerificatorAddress - address of a verificator + // IssuedTimeStamp - verificator's license issued timestamp + // ValidUntilTimeStamp - verificator's license valid until timestamp + new web3._extend.Method({ + name: 'addVerificator', + call: 'eth_addVerificator', + params: 1, + inputFormatter: [null] + }), + new web3._extend.Method({ + name: 'getVerificatorsCount', + call: 'eth_getVerificatorsCount', + params: 2, + inputFormatter: [null, web3._extend.formatters.inputDefaultBlockNumberFormatter], + outputFormatter: function (tx) { + if(tx !== null) + tx = web3.toDecimal(tx); + return tx; + } + }), + new web3._extend.Method({ + name: 'getVerificatorsIndex', + call: 'eth_getVerificatorsIndex', + params: 2, + inputFormatter: [null, web3._extend.formatters.inputDefaultBlockNumberFormatter], + }), + new web3._extend.Method({ + name: 'getVerificatorAtIndex', + call: 'eth_getVerificatorAtIndex', + params: 2, + inputFormatter: [null, web3._extend.formatters.inputDefaultBlockNumberFormatter], + }), + new web3._extend.Method({ + name: 'updateVerificatorLicenseExpiration', + call: 'eth_updateVerificatorLicenseExpiration', + params: 1, + inputFormatter: [null], }), ], properties: [ From f9935d247b42a468562b2f0427f52425ec5301a3 Mon Sep 17 00:00:00 2001 From: Said Syakin Date: Wed, 4 Apr 2018 20:10:01 +0400 Subject: [PATCH 7/7] Fix merge conflict with release 1.8 --- internal/ethapi/api.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 8b226f4ba0..a1ca3ec14e 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -776,7 +776,7 @@ func (s *PublicBlockChainAPI) GetVarFR(ctx context.Context, args FRGetArgs, bloc args.Data = packed } - result, _, _, err := s.doCall(ctx, args.CallArgs, blockNr, vm.Config{DisableGasMetering: true}) + result, _, _, err := s.doCall(ctx, args.CallArgs, blockNr, vm.Config{}, 5*time.Second) err = abi.Unpack(&ev, "getVar", result) @@ -863,7 +863,7 @@ func (s *PublicBlockChainAPI) GetVerificatorsCount(ctx context.Context, args Cal args.Data = packed } - result, _, _, err := s.doCall(ctx, args, blockNr, vm.Config{DisableGasMetering: true}) + result, _, _, err := s.doCall(ctx, args, blockNr, vm.Config{}, 5*time.Second) err = abi.Unpack(&ev, "getVerificatorsCount", result) @@ -894,7 +894,7 @@ func (s *PublicBlockChainAPI) GetVerificatorsIndex(ctx context.Context, args Cal args.Data = packed } - result, _, _, err := s.doCall(ctx, args, blockNr, vm.Config{DisableGasMetering: true}) + result, _, _, err := s.doCall(ctx, args, blockNr, vm.Config{}, 5*time.Second) err = abi.Unpack(&ev, "getVerificatorsIndex", result) @@ -926,7 +926,7 @@ func (s *PublicBlockChainAPI) GetVerificatorAtIndex(ctx context.Context, args FR args.Data = packed } - result, _, _, err := s.doCall(ctx, args.CallArgs, blockNr, vm.Config{DisableGasMetering: true}) + result, _, _, err := s.doCall(ctx, args.CallArgs, blockNr, vm.Config{}, 5*time.Second) err = abi.Unpack(&ev, "getVerificatorAtIndex", result)